82 votes

Comment combiner des ressources importées et locales dans un contrôle utilisateur WPF ?

J'écris plusieurs contrôles utilisateur WPF qui ont besoin de ressources partagées et individuelles.

J'ai trouvé la syntaxe pour charger des ressources à partir d'un fichier de ressources séparé :

<UserControl.Resources>
    <ResourceDictionary Source="ViewResources.xaml" />
</UserControl.Resources>

Toutefois, lorsque je fais cela, je ne peux pas ajouter de ressources localement, par exemple :

<UserControl.Resources>
    <ResourceDictionary Source="ViewResources.xaml" />
    <!-- Doesn't work: -->
    <ControlTemplate x:Key="validationTemplate">
        ...
    </ControlTemplate>
    <style x:key="textBoxWithError" TargetType="{x:Type TextBox}">
        ...
    </style>
    ...
</UserControl.Resources>

J'ai jeté un coup d'œil à ResourceDictionary.MergedDictionaries, mais cela ne me permet que de fusionner plus d'un dictionnaire externe, et non de définir d'autres ressources localement.

Je dois manquer quelque chose d'insignifiant ?

Il faut le mentionner : J'héberge mes contrôles utilisateur dans un projet WinForms, donc mettre des ressources partagées dans App.xaml n'est pas vraiment une option.

155voto

Tor Haugen Points 8258

J'ai trouvé la solution. La solution implique des MergedDictionaries, mais les spécificités doivent être justes, comme ceci :

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="ViewResources.xaml" />
        </ResourceDictionary.MergedDictionaries>
        <!-- This works: -->
        <ControlTemplate x:Key="validationTemplate">
            ...
        </ControlTemplate>
        <style x:key="textBoxWithError" TargetType="{x:Type TextBox}">
            ...
        </style>
        ...
    </ResourceDictionary>
</UserControl.Resources>

C'est-à-dire que les ressources locales doivent être imbriquées sur la balise ResourceDictionary. Ainsi, l'exemple ici est incorrecte.

5voto

Preet Sangha Points 39414

Utilisez MergedDictionaries .

J'ai obtenu l'exemple suivant de ici.

Dossier 1

<ResourceDictionary 
  xmlns=" http://schemas.microsoft.com/winfx/2006/xaml/presentation "
  xmlns:x=" http://schemas.microsoft.com/winfx/2006/xaml " > 
  <Style TargetType="{x:Type TextBlock}" x:Key="TextStyle">
    <Setter Property="FontFamily" Value="Lucida Sans" />
    <Setter Property="FontSize" Value="22" />
    <Setter Property="Foreground" Value="#58290A" />
  </Style>
</ResourceDictionary>

Dossier 2

   <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
          <ResourceDictionary Source="TextStyle.xaml" />
        </ResourceDictionary.MergedDictionaries>
      </ResourceDictionary>

5voto

Lu55 Points 2339

Vous pouvez définir des ressources locales dans la section MergedDictionaries :

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <!-- import resources from external files -->
            <ResourceDictionary Source="ViewResources.xaml" />

            <ResourceDictionary>
                <!-- put local resources here -->
                <Style x:key="textBoxWithError" TargetType="{x:Type TextBox}">
                    ...
                </Style>
                ...
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X