1

我的程序集中有资源,我可以使用 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?

4

1 回答 1

2

不要使用Properties.ResourcesWindows 窗体嵌入式资源,而是使用 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>
于 2013-10-02T09:34:10.020 回答