[英]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
StackPanel
的DataContext
是ItemsSource
一個項目,而不是視圖模型。
編輯:您應該為 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.