我想在我的WinForms应用程序中使用一个WPF控件(使用ElementHost)在几个地方(=>此控件的多个实例)。
此外,我希望UserControl的所有实例共享一个ResourceDictionary的实例。
在WPF应用程序中,我可以通过在应用程序资源中合并我的ResourceDictionary来实现这一目的。
但是,我不想在WinForms应用程序中创建WPF应用程序实例。 相反,我正在寻找另一种方式。
我找到了一个解决方案,但我希望你知道一个更好的方法,不需要任何代码:
public static class StaticRDProvider
{
static ResourceDictionary rd;
static StaticRDProvider()
{
var uri = new Uri("WpfControls;Component/GlobalResourceDictionary.xaml", UriKind.Relative);
rd = (ResourceDictionary) Application.LoadComponent(uri);
}
public static ResourceDictionary GetDictionary
{
get { return rd; }
}
}
UserControl.xaml.cs:
public partial class MyCustomUserControl : UserControl
{
public MyCustomUserControl()
{
Resources.MergedDictionaries.Add(StaticRDProvider.GetDictionary);
InitializeComponent();
}
}
有效。但我更喜欢只适用于XAML的解决方案。另外,我希望能够使用StaticResources。因此,在初始化控件之后将静态ResourceDictionary添加到Controls MergedDictionaries不是一种选择。
我尝试了以下内容,但它抛出了一个奇怪的“堆栈是空的”异常:
<UserControl x:Class="WpfControls.MyCustomUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:WpfControls="clr-namespace:WpfControls" mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<x:Static Member="WpfControls:StaticRDProvider.GetDictionary"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
</Grid>
也许有人知道更好的方法。
谢谢, TwinHabit
答案 0 :(得分:-1)
您是否尝试在UserControl中加载RD,就像使用Application类一样?
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="WpfControls;Component/GlobalResourceDictionary.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
这样您只需在用户控件中指定URI,并避免静态成员完全麻烦。
顺便说一句,如果RD与UserControl不在同一个程序集中,请确保使用正确的URI语法。例如: pack:// application:,,, / YourAssembly; component / Subfolder / YourResourceFile.xaml (more info on pack URIs)