2010-09-26 67 views
4

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

+0

我只是想你的例子與x:靜態元素在MergedDictionaries在XAML和它包括使用StaticResource標記擴展來引用該ResourceDictionary中的項目的能力。它幫助我提高了我應用程序的某個區域的性能。我使用.Net 4. – 2011-03-15 17:37:36

回答

-1

你嘗試加載你的用戶控件,你將與應用類做同樣的內部RD?

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

這樣,您只需在用戶控件中指定URI,並完全避免靜態成員的麻煩。

順便說一句,如果RD與UserControl不在同一個程序集中,請務必使用正確的URI語法。例如:包://應用:,,,/YourAssembly;組件/子文件夾/ YourResourceFile.xamlmore info on pack URIs

+1

如果我錯了,糾正我。但是我非常肯定的是,每次創建UserControl時都會創建一個GlobalResourceDictionary的新實例。因此使用的資源不是靜態的。 – TwinHabit 2010-09-27 20:39:47

相關問題