У меня есть один элемент управления 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