【问题标题】:WPF BitmapImage not displayingWPF BitmapImage 不显示
【发布时间】:2017-03-09 05:23:42
【问题描述】:

我有一个 WPF 项目,它尽我所能使用 MVVM 模式。我用的是Visual Studio 2010,后面的语言是C#。

所以我有一个树视图。树视图如下所示:

<TreeView Grid.Column="0" Width="Auto" Background="Aquamarine" ItemsSource="{Binding Scenes}" SelectedItemChanged="TreeView_SelectedItemChanged">
        <TreeView.DataContext>
            <viewModels:ScenesViewModel />
        </TreeView.DataContext>
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Characters}">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding SceneName}"></TextBlock>

                        <Image Source="{StaticResource ImgWorld}" Margin="0,0,5,0" Width="32" Height="32"/>

                </StackPanel>
                <HierarchicalDataTemplate.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">

                            <TextBlock Text="{Binding FirstName}"></TextBlock>
                            <Border BorderThickness="1" Background="RoyalBlue">
                                <Image Source="{Binding ImgIcon}" Margin="2"/>
                            </Border>
                        </StackPanel>
                    </DataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

争论的焦点是图像,它的来源被绑定到一个叫做“ImgIcon”的东西上。这是一个名为“CharacterViewModel”的视图模型的属性。出于某种原因,我没有在图像应该显示的位置显示任何内容。

最明显的问题可能是关于数据上下文或 MVVM 方面是否正常工作。我相当确定它是,因为图像旁边有一个 TextBlock,它也绑定到一个名为“FirstName”的属性。此绑定工作正常。

这两个属性当然是在视图模型中,可以在这里看到:

public String FirstName
    {
        get { return Character.FirstName; }
        set
        {
            if (Character.FirstName != value)
            {
                Character.FirstName = value;
                RaisePropertyChanged("FirstName");
            }
        }
    }

private BitmapImage _imgIcon = null;
    public BitmapImage ImgIcon 
    { 
        get { return _imgIcon; }
        set 
        {
            _imgIcon = value;
            RaisePropertyChanged("ImgIcon");
        }
    } 

它们稍有不同,后者不包含 Character 类中的属性。

所以下一个可能的错误是图像的加载。这是通过这种方法完成的(目前只有一个已知工作文件的测试路径):

public bool LoadIcon()
    {
        if (ImgIcon == null)
        {
            Uri outUri;

            if (Uri.TryCreate(@"D:\Pictures\Icons\HCAria01.png", UriKind.Absolute, out outUri) )
            {
            }


            ImgIcon = new BitmapImage(outUri);
            return true;
        }
        else
            return false;
    }

我在 'ImgIcon = new BitmapImage(outUri)' 处放了一个断点,你可以在这里看到相关信息:picture。从这张图片看来,图像已成功加载。

我确定我遗漏了一些明显的东西,但如果我能说出它是什么,我该死的。根据我对 WPF 和 XAML 的有限经验,它似乎工作正常,除了缺少图像。

如果您能提供任何帮助,将不胜感激。

编辑:一些澄清。 Treeview 的 DataContext 称为 ScenesViewModel。这包含一个 SceneViewModel 列表,该列表称为“场景”。每个 SceneViewModel 都包含一个 CharacterViewModel 列表,称为“Characters”。 These two images 显示了这些类的相关部分,因此希望可以理解层次结构。对于每个 CharacterViewModel,都应该有一个 ImgIcon。

【问题讨论】:

  • 由于图像正在代码中加载,因此快速浏览一下,我会仔细检查您的上下文实际上是您的具有 ImgIcon 属性的对象,而不是您的具有完全相同属性名称的 Character 对象为名字。

标签: c# wpf xaml mvvm


【解决方案1】:

如果在此类中定义了 ImgIcon 属性,请确保绑定到视图模型 (ScenesViewModel) 属性:

<Image Source="{Binding DataContext.ImgIcon, RelativeSource={RelativeSource AncestorType=TreeView}}" Margin="2"/>

ItemTemplateStackPanelDataContextItemsSource 中的一个项目,而不是视图模型。

编辑:您应该为 SceneViewModel 对象定义一个模板,为 CharacterViewModel 对象定义另一个模板。您可以将隐式模板放在 TreeView 的部分中:

<TreeView Grid.Column="0" Width="Auto" Background="Aquamarine" ItemsSource="{Binding Scenes}" 
                  SelectedItemChanged="TreeView_SelectedItemChanged">
    <TreeView.DataContext>
        <viewModels:ScenesViewModel />
    </TreeView.DataContext>
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type local:SceneViewModel}" ItemsSource="{Binding Characters}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding SceneName}"></TextBlock>
                <Image Source="{StaticResource ImgWorld}" Margin="0,0,5,0" Width="32" Height="32"/>
            </StackPanel>
        </HierarchicalDataTemplate>
        <DataTemplate DataType="{x:Type local:CharacterViewModel}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding FirstName}"></TextBlock>
                <Border BorderThickness="1" Background="RoyalBlue">
                    <Image Source="{Binding ImgIcon}" Margin="2"/>
                </Border>
            </StackPanel>
        </DataTemplate>
    </TreeView.Resources>
</TreeView>

【讨论】:

  • 澄清一下,DataContext 被称为“ScenesViewModel”。这包含一个名为“场景”的 SceneViewModel 列表。每个 SceneViewModel 都包含一个名为“Characters”的 CharacterViewModel 列表。 ImgIcon 在 CharacterViewModel 中。
  • ImgIcon 定义在哪个类中?
  • CharacterViewModel。我编辑了我原来的问题,试图清理层次结构。
  • 什么是“ImgWorld”?你看到这个图片资源了吗?
  • 是的,我觉得很好。然而,这是用户控件中的一种资源,与我遇到的问题不同。如果我用静态资源 ImgWorld 替换我的 ImgIcon,它可以正常工作,并且我可以清楚地看到它在我期望的位置。
【解决方案2】:

这个答案是为那些想看看发生了什么的人准备的——也许你也有同样的问题。

我的问题实际上在我的代码中的其他地方。当我从数据库加载场景(数据模型)以填充 SceneViewModel 的数据时,我创建了一个用于加载图像的实例,然后将一个新实例添加到列表中。所以有两个实例,一个是创建的,用于加载图像然后不使用,另一个是使用的(但没有加载图像)。基本上这是一个简单的错误,与这里看到的代码无关 - 一切正常(因为现在我纠正了错误,一切正常,图像和所有)。

感谢所有花时间回答的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    相关资源
    最近更新 更多