簡體   English   中英

WPF BitmapImage 不顯示

[英]WPF BitmapImage not displaying

我有一個 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 方面是否正常工作。 我相當確定它是,因為 Image 旁邊有一個 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)' 放了一個斷點,你可以在這里看到相關信息:圖片 從這張圖片看來,圖片已經成功加載了。

我確定我遺漏了一些明顯的東西,但我該死的,如果我能說出它是什么。 從我對 WPF 和 XAML 的有限經驗來看,它似乎工作正常,除了缺少圖像。

好吧,如果您能提供任何幫助,將不勝感激。

編輯:一些說明。 Treeview 的 DataContext 稱為 ScenesViewModel。 這包含一個 SceneViewModel 列表,該列表稱為“場景”。 每個 SceneViewModel 包含一個 CharacterViewModel 列表,稱為“Characters”。 這兩個圖像顯示了這些類的相關部分,因此希望可以理解層次結構。 對於每個 CharacterViewModel,都應該有一個 ImgIcon。

如果ImgIcon屬性在此類中定義,請確保綁定到視圖模型 ( ScenesViewModel ) 屬性:

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

ItemTemplate StackPanelDataContextItemsSource一個項目,而不是視圖模型。

編輯:您應該為 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>

這個答案是為那些想看看發生了什么的人准備的——也許你有同樣的問題。

我的問題實際上在我的代碼中的其他地方。 當我從數據庫加載場景(數據模型)以填充 SceneViewModel 的數據時,我創建了一個用於加載圖像的實例,然后向列表中添加了一個新實例。 所以有兩個實例,一個被創建,用於加載圖像,然后沒有使用,另一個被使用(但沒有加載圖像)。 基本上,這是一個簡單的錯誤,與此處看到的代碼無關 - 一切正常(自從我糾正了錯誤以來,一切都按預期工作,圖像等等)。

感謝所有花時間回答的人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM