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