28 votes

WPF n'applique pas les styles par défaut définis dans les MergedDictionaries ?

Dans une application WPF j'ai défini par défaut de styles de contrôle de séparer les dictionnaires de ressources (par exemple, "ButtonStyle.xaml"), et ajouté comme fusionnés dictionnaires un dictionnaire de ressources nommé "ResDictionary.xaml".

Si je me réfère à ce "ResDictionary.xaml" comme fusionné dictionnaire dans mon Application.xaml, les styles par défaut ne sont pas appliquées. Cependant, si je me réfère à la "ButtonStyle.xaml", il fonctionne correctement.

Si je recompile le même code dans .NET 3.5 ou 3.0, il reconnaît et applique les valeurs par défaut des styles mentionnés dans "App.xaml" par "ResDictionary.xaml", mais pas dans .NET 4.0.

Lors de l'exécution si je vérifier l'Application.Actuel.Ressources dictionnaire, les styles par défaut sont là, mais elles ne sont pas appliquées, que si je spécifier le Style de la propriété explicitement dans le Bouton de contrôle.

Existe-il des solutions pour se référer à un dictionnaire de ressources (contenant les styles par défaut) de cette façon .NET 4.0?


App.xaml:

<Application.Resources>
  <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
      <ResourceDictionary Source="Styles/ResDictionary.xaml"/>
    </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
</Application.Resources>

ResDictionary.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Default/ButtonStyle.xaml"/>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

ButtonStyle.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style TargetType="Button">
        <Setter Property="Background" Value="Yellow"/>
    </Style>
</ResourceDictionary>

22voto

Christian Moser Points 221

La meilleure solution est d'ajouter un style par défaut factice dans le dictionnaire de ressources où vous fusionnez toutes les ressources ensemble.

3voto

user358311 Points 36

Cela pourrait être causé par un bogue connu lorsqu'il existe un seul style dans application.resources dans app.xaml lorsqu'il n'utilise pas un startupuri.

Le correctif est d'ajouter un style supplémentaire comme celui-ci ...

pour plus de détails consultez ce lien .... http://bengribaudo.com/blog/2010/08/19/106/bug-single-application-resources-entry-ignored

1voto

user325376 Points 42

Il y a une sorte de correctif pour ce problème, mais je n'ai pu le faire fonctionner au niveau de la fenêtre (pas de niveau de l'application).

Afin d'inclure un WPF 4.0 ressource à partir d'un projet distinct, la ressource doit être ajouté en tant que ressource dans la fenêtre de code derrière. La déclaration appartient dans la fenêtre du constructeur, avant l'appel de méthode InitializeComponent:

public ControlsWindow()
{
    this.Resources = Application.LoadComponent(new Uri("[WPF 4.0 ResourceProjectName];Component/[Directory and File Name within project]", UriKind.Relative)) as ResourceDictionary;
    InitializeComponent();
}

Remarque: Remplacer le "[WPF 4.0 ResourceProjectName] " texte à votre ressource de nom de projet. Aussi, le " [Répertoire et Nom de Fichier à l'intérieur du projet] doit être remplacé par la position relative de la ressource de fichier (Thèmes/StandardTheme.xaml')

- Je aller dans plus de détails au sujet de cette question ici.

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