Добавление статического ResourceDictionary в UserControls до разбора XAML - PullRequest
4 голосов
/ 26 сентября 2010

У меня есть один элемент управления WPF, который я хочу использовать в своем приложении WinForms (используя ElementHost) в нескольких местах (=> несколько экземпляров этого элемента управления).

Более того, я хочу, чтобы все экземпляры моего UserControlобщий доступ к одному экземпляру ResourceDictionary.

В приложениях WPF я достиг бы этого путем слияния моего ResourceDictionary с ресурсами приложения.

Однако я не хочу создавать экземпляр приложения WPF вмое приложение WinForms.Вместо этого я ищу другой путь.

Я нашел одно решение, но я надеюсь, что вы знаете лучший способ, который не требует никакого кода позади:

    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 к элементам управления 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 голосов
/ 27 сентября 2010

Вы пытались загрузить RD внутри UserControl так же, как вы делали бы это с классом Application?

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>                
            <ResourceDictionary Source="WpfControls;Component/GlobalResourceDictionary.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

Таким образом, вы просто указываете URI в своем пользовательском элементе управления и полностью избегаете статических проблем с членами.

Кстати, убедитесь, что вы используете правильный синтаксис URI, если RD не находится в той же сборке, что и UserControl. Например: pack: // application: ,,, / YourAssembly; компонент / подпапка / YourResourceFile.xaml ( больше информации о URI для пакетов )

...