2010-09-26 5 views
4

J'ai un contrôle WPF que je veux utiliser dans mon application WinForms (en utilisant un ElementHost) à plusieurs endroits (=> plusieurs instances de ce contrôle).Ajout d'un ResourceDictionary statique à UserControls avant l'analyse du code XAML

En outre, je souhaite que toutes les instances de mon UserControl partagent une Instance unique d'un ResourceDictionary.

Dans les applications WPF, j'y parviendrais en fusionnant mon ResourceDictionary dans les ressources de l'application. Cependant, je ne souhaite pas créer d'instance d'application WPF dans mon application WinForms. Au lieu de cela, je cherche un autre moyen.

J'ai trouvé une solution mais j'espère que vous savez une meilleure façon qui ne nécessite pas de code derrière:

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(); 
    } 
} 

qui fonctionne. Mais je préfère une solution qui ne fonctionne qu'avec XAML. De plus, je veux être en mesure d'utiliser StaticResources. Par conséquent, l'ajout de ResourceDictionary statique aux contrôles MergedDictionaries après l'initialisation du contrôle n'est pas une option.

J'ai essayé ce qui suit, mais il jette une étrange "pile est vide" exception:

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

Peut-être que quelqu'un connaît une meilleure approche.

Merci, TwinHabit

+0

Je viens d'essayer votre exemple avec x: élément statique dans les MergedDictionaries en XAML et J'ai travaillé très bien avec moi, y compris la possibilité d'utiliser les extensions de balisage StaticResource pour faire référence à des éléments de ce ResourceDictionary. Cela m'a aussi aidé à améliorer les performances dans un domaine de mon application. J'utilise .Net 4. –

Répondre

-1

Avez-vous essayez de charger la RD dans votre UserControl même vous le feriez avec la classe d'application?

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

De cette façon, vous venez de spécifier l'URI dans votre contrôle utilisateur, et d'éviter les membres statiques ennuient tout à fait. Par ailleurs, assurez-vous d'utiliser la syntaxe URI correcte si le RD n'est pas dans le même assembly que le contrôle UserControl. Par exemple: pack : // application: ,,,/votre_assembly; composant/Subfolder/YourResourceFile.xaml (more info on pack URIs)

+1

Corrigez-moi si je me trompe. Mais je suis assez sûr que de cette façon une nouvelle instance de GlobalResourceDictionary est créée chaque fois qu'un UserControl est créé. Par conséquent, les ressources utilisées ne sont pas statiques. – TwinHabit