在解析XAML之前,将静态ResourceDictionary添加到UserControls

时间:2010-09-26 19:50:39

标签: .net wpf resourcedictionary

我想在我的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

1 个答案:

答案 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