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

时间:2015-02-11 21:19:39

标签: c# wpf image xaml

我有一个xaml文件,其中包含我在窗口中使用的一系列资源。具体来说,我有两个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(...)的调用是一个特殊的调用来解析文件的位置。这可能因用户与用户而有很大差异,这就是首先存在辅助方法的原因。

1 个答案:

答案 0 :(得分:1)

您可以声明并绑定到MainWindow类中的两个属性,而不是使用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 ... 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(...);