将System.Drawing.Image资源转换为Wpf MenuItem的System.Windows.Controls.Image

时间:2013-10-02 09:06:52

标签: wpf

我的程序集中有资源可以使用Properties.Resources.MyImage访问 我有一些类,我绑定到包含属性

的WPF MenuItem
public System.Windows.Controls.Image Icon {get; set;}

我想用编程方式设置:

dummy.Icon = Properties.Resources.MyImage;

现在我想将资源System.Drawing.Image转换为WPF System.Windows.Controls.Image。我认为这应该是直截了当的,但我发现我的图像没有可行的解决方案(这是使用透明度的png文件)。

那么如何将System.Drawing.Image转换为System.Windows.Controls.Image?

1 个答案:

答案 0 :(得分:2)

不使用Properties.Resources(Windows窗体嵌入式资源),而是使用WPF资源。在解决方案资源管理器中,单击图像文件,然后在属性窗口中,将其“构建操作”设置为资源嵌入式资源)。这也将图像嵌入到装配体中,但方式不同。

与Windows窗体不同,WPF不会生成资源管理器类,因此您必须使用字符串动态加载图像:

BitmapImage image = new BitmapImage();
image.BeginInit();
image.UriSource = new Uri("pack://application:,,,/NameOfAssembly;component/Path/To/Image.png");
image.EndInit();

请注意,URI的applicationcomponent部分是常量字符串,而NameOfAssemly是图像所在的程序集的名称。您可以构建一个生成的辅助类URI并加载图片。

如果您不打算对图像进行任何更改,也可以调用image.Freeze()(提高性能并允许在非UI线程上创建图像源)。

在您的数据类中,展示ImageSource属性而不是Image。然后使用Image控件显示它:

<Image Source="{Binding Icon}" />

或者在风格中:

<Style TargetType="MenuItem">
    <Style.Resources>
        <Image x:Key="Icon"
                x:Shared="False"
                Source="{Binding Icon}"
                Width="16"
                Height="16" />
    </Style.Resources>
    <Setter Property="Icon" Value="{StaticResource Icon}" />
</Style>