我想在我的WinForms應用程序(使用ElementHost)在幾個地方(=>此控件的多個實例)中使用一個WPF控件。在解析XAML之前向UserControls添加一個靜態ResourceDictionary
此外,我希望我的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
我只是想你的例子與x:靜態元素在MergedDictionaries在XAML和它包括使用StaticResource標記擴展來引用該ResourceDictionary中的項目的能力。它幫助我提高了我應用程序的某個區域的性能。我使用.Net 4. – 2011-03-15 17:37:36