Question

Je voudrais mettre à jour le style par défaut de la fenêtre dynamiquement lors de l'exécution afin que je puisse changer le FontSize et FontFamily dynamiquement lors de l'exécution. J'ai trouvé que les styles dans votre dictionnaire de ressources sont scellés à l'exécution et ne peuvent pas être modifiés, donc je la méthode suivante de mise à jour du style:

<Style TargetType="{x:Type Window}">
    <Setter Property="FontFamily" Value="Arial"/>
    <Setter Property="FontSize" Value="12pt"/>
</Style>

Avec le code suivant:

Style newStyle = (Make a copy of the old style but with the FontSize and FontFamily changed)

// Remove and re-add the style to the ResourceDictionary.
this.Resources.Remove(typeof(Window));
this.Resources.Add(typeof(Window), newStyle);

// The style does not update unless you set it on each window.
foreach (Window window in Application.Current.Windows)
{
    window.Style = newStyle;
}

Il y a plusieurs problèmes avec cette approche et j'ai quelques questions pour lesquelles les choses sont comme elles sont.

  1. Pourquoi les styles scellés à l'exécution et est-il un moyen de les rendre non scellées?
  2. Quand j'ajouter à nouveau le nouveau style, pourquoi est-ce pas repris par toutes mes fenêtres? Pourquoi dois-je aller et appliquer manuellement à chaque fenêtre?
  3. Y at-il une meilleure façon?
Était-ce utile?

La solution

J'aborderait probablement cela avec un « paramètres de service », qui expose les propriétés pour les différents paramètres et les feux INPC comme vous le feriez pour une liaison normale. La prochaine étape je changerais ce style pour être quelque chose comme:

<Style x:Key="MyWindowStyle">
    <Setter Property="FontFamily" Value="{Binding Path=FontFamily, Source={StaticResource SettingsService}, FallbackValue=Arial}"/>
    <Setter Property="FontSize" Value="{Binding Path=FontSize, Source={StaticResource SettingsService}, FallbackValue=12}"/>
</Style>

Avec votre "Paramètres de service" défini comme une ressource statique:

<services:SettingsService x:Key="SettingsService"/>

Ensuite, dans chaque fenêtre assurez-vous que le style est défini comme DynamicResource:

<Window Style="{DynamicResource MyWindowStyle}" .... >

Il y a souvent beaucoup de malentendus autour des différences entre les ressources statiques et dynamiques, mais la différence fondamentale est statique est un « temps » mise alors dynamique mettra à jour les paramètres si les changements de ressources.

Maintenant, si vous définissez ces propriétés dans votre « Paramètres de service », ils mettront le feu INPC, qui mettra à jour le style que le DynamicResource ramassera sur et modifier les propriétés de fenêtre en conséquence.

On dirait beaucoup de travail, mais cela vous donne une belle flexibilité, et tous les « soulever des objets lourds » se fait uniquement à l'aide Manchettes. Nous utilisons une technique similaire sur un projet, je travaille en ce moment donc quand un utilisateur choisit une couleur de remplissage / temps les différents outils de la mise à jour de la barre d'outils pour refléter les nouvelles valeurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top