使用非WPF XAML资源

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

我遇到的问题是,每个组件都应该包含一个图标,出于友好的目的,我将它定义为System.Windows.Media.Brush这样我就可以使用从Design中导出的DrawingBrush 。 现在我需要从非WPF C#中访问那片XAML,其中我现在有用于实例化用户控件并请求资源的可怕解决方法:

private Brush CachedIcon = null;

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

我无法从“普通”C#类中找到读取资源(这是一个.xaml文件,并在自定义控件的ResourceDictionary中引用)的方法。 任何属于WPF的东西都有很好的TryFindResource方法,但是怎么做呢? 我不想让XAML文件的图标处于未嵌入状态。


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

<UserControl.Resources>
    <BitmapImage x:Key="icon1" UriSource="Resources/Icon1.ico" />
</UserControl.Resources>

然后在.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);
        }
    }
}

我的建议是:

  • 在控件上提供有关可找到图标的位置的元数据。 您可以使用您自己的自定义属性来完成此操作(请参阅下面的示例1)。 此元数据将允许您加载图标而不创建控件的实例。

  • 由于您使用的是MEF,因此您可以在导出中使用元数据来实现与上述相同的功能。 详情在这里。 见下面的例子2。

  • 将您的图标视为ImageSource而不是Brush 。 你可以使用WPF的Image控件来显示你的ImageSource ,或者你可以用ImageBrush来绘制它。

  • 使用TFD提供的技术以元数据中指定的名称读取资源。 不幸的是,WPF似乎没有提供任何类似BamlReader东西,这会使它从非WPF上下文中加载WPF资源更加BamlReader

  • 例1:

    [Icon("MyIconResourceName")]
    public class BlahControl : Control
    {
        ...
    }
    

    例2:

    [Export(typeof(IApplicationComponent))]
    [ExportMetadata("IconResource", "MyIconResourceName")]
    public class BlahControl : Control
    {
        ...
    }
    

    您可以从流中读取组件中的资源。

    示例代码在这里:http://www.wpftutorial.net/ReadWPFResourcesFromWinForms.html

    链接地址: http://www.djcxy.com/p/50429.html

    上一篇: Acessing WPF XAML Resources from non

    下一篇: Setting WPF image source in code