web-dev-qa-db-fra.com

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

J'écris plusieurs contrôles utilisateur WPF qui nécessitent des ressources partagées et individuelles.

J'ai trouvé la syntaxe de chargement des ressources à partir d'un fichier de ressources distinct:

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

Cependant, lorsque je fais cela, je ne peux pas également ajouter des ressources localement, comme:

<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 œil à ResourceDictionary.MergedDictionaries, mais cela ne me permet que de fusionner plus d'un dictionnaire externe, pas de définir d'autres ressources localement.

Je dois manquer quelque chose de trivial?

Il convient de 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.

82
Tor Haugen

Je l'ai compris. La solution implique MergedDictionaries, mais les détails doivent être corrects, 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>

Autrement dit, les ressources locales doivent être imbriquées dans la balise ResourceDictionary. Donc l'exemple ici est incorrect.

152
Tor Haugen

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

Utilisez MergedDictionaries .

J'ai obtenu l'exemple suivant de ici.

File1

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

Fichier 2

   <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
          <ResourceDictionary Source="TextStyle.xaml" />
        </ResourceDictionary.MergedDictionaries>
      </ResourceDictionary> 
4
Preet Sangha