在WPF中,运行时如何引用静态资源?

3

我创建了2个图像资源,我想在TreeView控件的HierarchicalDataTemplate内动态引用它们。

这是我的XAML代码:

  <TreeView Margin="17,22" Name="TreeView">
                <TreeView.Resources>
                    <BitmapImage x:Key="Icon1" UriSource="pack://application:,,,/icon1.ico"/>
                    <BitmapImage x:Key="Icon2" UriSource="pack://application:,,,/icon2.ico"/>
                </TreeView.Resources>
                <TreeView.ItemTemplate>
                    <HierarchicalDataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Image Source="{StaticResource Icon1}" Margin="0,0,5,0" Width="16" Height="16"/>
                            <TextBlock Text="{Binding Name}" Margin="0,2,0,0" FontWeight="Normal" FontSize="11"/>
                        </StackPanel>
                    </HierarchicalDataTemplate>
                </TreeView.ItemTemplate>
            </TreeView>

什么是适当的源绑定语法,以便我可以在运行时选择显示哪个静态图像?
2个回答

2

你已经绑定了一些 Name 属性。通过在(视图)模型中添加一个整数属性 Icon,来确定您希望为此条目显示哪个图标。然后您可以使用触发器:

<Image Margin="0,0,5,0" Width="16" Height="16">
    <Image.Style>
        <Style TargetType="{x:Type Image}">
            <Setter Property="Source" Value="{StaticResource Icon1}" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding Icon}" Value="2">
                    <Setter Property="Source" Value="{StaticResource Icon2}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Image.Style>
</Image>

虽然我在想是否有一种方法可以直接从属性中指定静态资源名称,而不必诉诸触发器? - Chris
@Chris:我认为这是不可能的:绑定只能在DependencyProperties上进行,而StaticResourceExtension.ResourceKey不是DependencyProperty。但是,如果您想要,您可以直接绑定到BitmapImage:<Image Source="{Binding MyImage}" />。然后,在您的数据模型中,MyImage必须包含要显示的BitmapImage。 - Heinzi
谢谢,这似乎是一个更好的想法。我的主要目的是尽量减少创建BitmapImages的数量。 - Chris
@Chris:这应该可以工作,因为你的数据项中的data.MyImage都可以指向相同的两个BitmapImages。 - Heinzi

0

你是指代码后台吗?在代码后台中,你可以这样说:

BitmapImage b = (BitmapImage)TreeView.FindResource("Icon1");

然后将其分配给您需要的任何属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接