Frage

Ich mag den Standard-Fensterstil zur Laufzeit dynamisch aktualisieren, damit ich die Fontsize und Fontfamily dynamisch zur Laufzeit ändern kann. Ich fand, dass Styles in Ihrem Ressource-Wörterbuch werden zur Laufzeit versiegelt und kann nicht geändert werden, so dass ich die folgende Methode der Aktualisierung der Stil verwendet:

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

Mit dem folgenden Code:

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

Es gibt mehrere Probleme mit diesem Ansatz, und ich habe ein paar Fragen, warum die Dinge so sind, wie sie sind.

  1. Warum Stile werden zur Laufzeit versiegelt und ist es eine Möglichkeit, sie nicht abgedichtete machen?
  2. Wenn ich den neuen Stil erneut hinzufügen, warum dies nicht durch alle meine Fenster abgeholt? Warum muss ich gehen und wenden Sie es manuell zu jedem Fenster?
  3. Gibt es einen besseren Weg?
War es hilfreich?

Lösung

Ich würde wahrscheinlich diese angehen mit einem „Einstellungen Service“, die Eigenschaften für die verschiedenen Einstellungen aussetzt, und feuert INPC wie für normale Bindung. Als nächstes ich diesen Stil ändern würde so etwas wie zu sein:

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

Mit Ihrem "Einstellung Service" definiert als eine statische Ressource:

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

Dann in jedem Fenster stellen Sie sicher, den Stil als Dynamic eingestellt ist:

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

Oft gibt es viele Missverständnisse rund um die Unterschiede zwischen statischen und dynamischen Ressourcen, aber der grundlegende Unterschied ist Static ist ein „one time“ -Einstellung während Dynamische werden die Einstellungen, wenn die Ressource Änderungen aktualisieren.

Nun, wenn Sie diese Eigenschaften in Ihrem „Einstellungen Service“ setzen sie INPC Feuer, die den Stil aktualisiert, die die Dynamic auf abholen und die Fenstereigenschaften entsprechend ändern.

Es scheint wie eine Menge Arbeit, aber es gibt Ihnen ein paar schöne Flexibilität und all das „schweres Heben“ ist lediglich mit Bindungen erfolgen. Wir verwenden eine ähnliche Technik an einem Projekt arbeite ich an im Moment so, wenn ein Benutzer eine Füllung / Strichfarbe Update die verschiedenen Werkzeuge in der Werkzeugleiste wählt die neuen Werte zu reflektieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top