使用非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