如何以编程方式设置 Xaml 定义的 Window.Resource 图像?

How do you set a Xaml defined, Window.Resource Image programmatically?

我有一个 xaml 文件,其中包含我在 window 中使用的一系列资源。具体来说,我有两个 Image 对象。我需要在 Window 的构造函数中设置这些图像,而不是对 URI 位置进行编码。我该怎么做?

找来找去,试过设置图片.Source属性。没有任何效果。作为参考,以下是这些图像在我的 xaml 文件中的声明方式:

<Window.Resources>
    <Image x:Key="iUpdate" />
    <Image x:Key="iDelete" />
</Window.Resources>

下面是它们如何用于按钮的内容:

                <DataTemplate>
                    <DockPanel>
                        <Button Name="UpdateChange" Content="{StaticResource iUpdate}" Width="24" />
                        <Button Name="DeleteChange" Content="{StaticResource iDelete}" Width="24" />
                        <Label Content="{Binding name}" />
                    </DockPanel>
                </DataTemplate>

这是我设置图片来源的失败尝试。

        //In my constructor...
        // iUpdate is a property on the Window
        iUpdate = (Image)FindResource("iUpdate");
                    iUpdate = new Image();
        iUpdate.Source = ImageHelpers.ConvertBitmapToImageSource(Common.LoadImage("edit.ico"));

仅供参考,我无法在我的 xaml 文件中设置源,因为对 Common.LoadImage(...) 的调用是解析文件位置的特殊调用。这可能因用户而异,这就是 helper-method 首先存在的原因。

您可以在 MainWindow class.

中声明并绑定两个属性,而不是将 Image 控件用作资源
public partial class MainWindow : Window
{
    public MainWindow()
    {
        UpdateImage = ImageHelpers.ConvertBitmapToImageSource(...);
        DeleteImage = ImageHelpers.ConvertBitmapToImageSource(...);

        InitializeComponent();
    }

    public ImageSource UpdateImage { get; set; }
    public ImageSource DeleteImage { get; set; }
}

您可以通过为 Window

分配名称来绑定到这些属性
<Window ... x:Name="window">

并声明一个 ElementName 绑定:

<Button ...>
    <Button.Content>
        <Image Source="{Binding UpdateImage, ElementName=window}"/>
    </Button.Content>
</Button>

为了回答您的问题,您的问题是您在将新的 Image 实例分配给资源实例后立即将其分配给 iUpdate 字段。您的代码应如下所示:

iUpdate = (Image)Resources["iUpdate"];
iUpdate.Source = ImageHelpers.ConvertBitmapToImageSource(...);