对于一个WPF应用程序,它将需要10 - 20个小图标和图像用于说明目的,将它们作为嵌入式资源存储在程序集中是正确的方法吗?

如果是这样,我如何在XAML中指定图像控件应该从嵌入式资源加载图像?


当前回答

根据Drew Noakes的回答,以下是创建资源字典、向其中添加BitmapImage资源以及在用户控件中引用BitmapImage资源的完整步骤。

在项目根目录下添加Images文件夹。 在Images文件夹下添加MyImage.png。 在“MyImage.png属性”窗口中,将“生成操作”设置为“资源”。 在项目根目录下创建一个名为MainResourceDictionary.xaml的资源字典:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <BitmapImage x:Key="MyImageSource" UriSource="Images/MyImage.png" />
</ResourceDictionary>

在控件中添加对资源字典的引用:

<UserControl ...>
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="MainResourceDictionary.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>
    ...

在控件中引用图像资源:

<UserControl ...>
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="MainResourceDictionary.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>
    ...
    <Image Source="{DynamicResource ResourceKey=ServiceLevel1Source}" />
    ...

其他回答

是的,这是正确的方法。

你可以在资源文件中使用图像,只使用路径:

<Image Source="..\Media\Image.png" />

您必须将映像文件的构建操作设置为“资源”。

有些人问在代码中这样做,但没有得到答案。

在花了很多时间搜索之后,我找到了一个非常简单的方法,我没有找到任何例子,所以我在这里分享我的方法 它适用于图像。(我的是gif格式)

简介:

它返回一个ImageSource“目的地”似乎喜欢的BitmapFrame。

Use:

doGetImageSourceFromResource ("[YourAssemblyNameHere]", "[YourResourceNameHere]");

方法:

static internal ImageSource doGetImageSourceFromResource(string psAssemblyName, string psResourceName)
{
    Uri oUri = new Uri("pack://application:,,,/" +psAssemblyName +";component/" +psResourceName, UriKind.RelativeOrAbsolute);
    return BitmapFrame.Create(oUri);
}

经验:

根据我的经验,包字符串不是问题,检查你的流,特别是如果第一次读取它已经设置了指针 到文件的末尾,您需要在再次读取之前将其重新设置为零。

我希望这能节省你很多时间,我希望这篇文章为我!

如果您正在使用Blend,为了使它更加简单,并且没有任何问题,为Source属性获取正确的路径,只需将图像从Project面板拖放到设计器上。

根据Drew Noakes的回答,以下是创建资源字典、向其中添加BitmapImage资源以及在用户控件中引用BitmapImage资源的完整步骤。

在项目根目录下添加Images文件夹。 在Images文件夹下添加MyImage.png。 在“MyImage.png属性”窗口中,将“生成操作”设置为“资源”。 在项目根目录下创建一个名为MainResourceDictionary.xaml的资源字典:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <BitmapImage x:Key="MyImageSource" UriSource="Images/MyImage.png" />
</ResourceDictionary>

在控件中添加对资源字典的引用:

<UserControl ...>
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="MainResourceDictionary.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>
    ...

在控件中引用图像资源:

<UserControl ...>
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="MainResourceDictionary.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>
    ...
    <Image Source="{DynamicResource ResourceKey=ServiceLevel1Source}" />
    ...

如果要在多个地方使用图像,那么值得将图像数据只加载一次到内存中,然后在所有image元素之间共享。

要做到这一点,在某处创建一个BitmapSource作为资源:

<BitmapImage x:Key="MyImageSource" UriSource="../Media/Image.png" />

然后,在你的代码中,使用如下代码:

<Image Source="{StaticResource MyImageSource}" />

在我的例子中,我发现我必须将Image.png文件设置为资源而不仅仅是内容的构建操作。这将导致在已编译程序集中携带映像。