从非WPF代码访问WPF XAML资源

Joe*_*oey 7 c# wpf embedded-resource

我目前正在构建一个由几个组件组成的应用程序,每个组件本质上都是一个WPF用户控件,周围有一些C#代码,以便插件系统工作(使用MEF).

我遇到的问题是每个组件都应该包含一个图标,为了更好的目的,我将其定义为,System.Windows.Media.Brush所以我可以使用DrawingBrush从那里导出的设计.现在我需要从非WPF C#访问那段XAML,其中我目前有实例化用户控件并要求它获取资源的可怕解决方法:

private Brush CachedIcon = null;

public override Brush Icon
{
    get
    {
        if (CachedIcon == null)
        {
            CachedIcon = (Brush)(new BlahControl().TryFindResource("Icon"));
        }
        return CachedIcon;
    }
}
Run Code Online (Sandbox Code Playgroud)

我找不到ResourceDictionary从"普通"C#类读取该资源(这是一个.xaml文件,并在自定义控件中引用)的方法.属于WPF的任何东西都有这个不错的TryFindResource方法但是怎么办呢?我不希望XAML文件的图标位于未嵌入的位置.

TFD*_*TFD 2

在 XAML 代码中,确保图标资源的构建选项设置为“资源”,然后引用该资源以使其成为 xaml 静态资源

<UserControl.Resources>
    <BitmapImage x:Key="icon1" UriSource="Resources/Icon1.ico" />
</UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)

然后在您的 .Net 2.0 代码中,您将在“{xamlName}.g.resource”流中找到该资源

将 xaml dll 中的所有图标加载到字典中的示例代码:

using System.IO;
using System.Reflection;
using System.Collections;
using System.Resources;

...

var icons = new Dictionary<String, Bitmap>();
var externalBaml = Assembly.LoadFile(Path.Combine(Environment.CurrentDirectory, "MyXaml.dll"));
Stream resourceStream = externalBaml.GetManifestResourceStream(externalBaml.GetName().Name + ".g.resources");
using (ResourceReader resourceReader = new ResourceReader(resourceStream)) {
    foreach (DictionaryEntry resourceEntry in resourceReader) {
        if (resourceEntry.Key.ToString().ToUpper().EndsWith(".ICO")) {
            icons.Add(resourceEntry.Key.ToString(), Image.FromStream(resourceEntry.Value as Stream) as Bitmap);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)