Überschreibt Schaltflächenhintergrund in WPF auf Aero

9

Der Wunsch ist also einfach: Ändern Sie den Hintergrund einer Schaltfläche in Hellgrün, Grün, wenn Sie den Mauszeiger darüber bewegen, und Dunkelgrün, wenn Sie darauf drücken. Der folgende XAML ist mein erster Versuch:

%Vor%

Aber leider funktioniert das nicht. Wir sind nur 1/3 des Weges zum Ziel. Ja, die Schaltfläche wird hellgrün, aber sobald Sie darüber schweben oder sie drücken, erhalten Sie Standard-Aero-Chrom für die jeweiligen Tastenzustände. Ich möchte nicht aufgeben und versuche folgende Ausschweifung:

%Vor%

Jetzt haben wir die ganze Friggin 'Control-Vorlage, die von Aero.NormalColor.xaml geladen wurde. Leider ändert dies nichts. Ich gehe dann zwei Attribute ( RenderPressed und RenderMouseOver ) aus dem Element Microsoft_Windows_Themes:ButtonChrome entfernen. Dennoch gibt es keine Veränderung. Ich entferne dann die Einstellung des% c_de% -Attributs des Knopfes und lasse nur die Namensraumdeklaration für die PresentationFramework.Aero Versammlung:

%Vor%

Endlich haben wir Fortschritte. Wir sind von 1/3 der Anforderungen auf 2/3 der Art und Weise gegangen, während IsMouseOver und IsPressed funktionieren, aber keinen hellgrünen Hintergrund während des normalen Zustands der Schaltfläche (ohne Maus oder gedrückt zu werden), da ich entfernt habe Klicken Sie auf die Schaltfläche Hintergrund, um die anderen beiden Status zu übernehmen und sichtbar zu machen. Nun, nachdem dieser wahnsinnige XAML uns nicht den LightGreen-Hintergrund für den normalen Button-Status gebracht hat, modifiziere ich den Style, um auch die Hintergrundfarbe dorthin zu werfen:

%Vor%

Schließlich funktioniert es wie beabsichtigt.

Bin ich verrückt, oder sind das (und mehr) die Reifen, die man mit einem Aero-Thema durchgehen muss, um nur die Hintergrundfarbe eines Knopfes in einigen seiner verschiedenen Zustände zu ändern (normal, schwebend, gedrückt)? Vielleicht wäre das Leben nicht so schlecht, wenn ich nicht das gesamte dang ButtonTemplate darin einfügen müsste, nur um die beiden Attribute ( Background und RenderMouseOver ) daraus zu entfernen.

Danke für jede Hilfe - ich bin am Ende des Witzes.

Update: Aber warten Sie, es gibt mehr dazu. Anstatt die Attribute RenderMouseOver und RenderPressed aus der Steuerelementvorlage zu entfernen, ändern Sie sie einfach von:

%Vor%

zu:

%Vor%

... behebt auch das Problem (das Ignorieren der Style-Trigger der Taste). Ich denke, der Grund des Problems ist, dass die Template-Bindungen zur Kompilierungszeit (aus Leistungsgründen) angewendet werden, während reguläre Bindungen zur Laufzeit angewendet werden. Aus diesem Grund werden die Bindungen aus den Stilauslösern der einzelnen Schaltflächen nicht verwendet, wenn Attribute Vorlagenbindungen verwenden (d. H. Stattdessen werden IsMouseOver und IsPressed aus der ursprünglichen Vorlage verwendet).

Nachdem Sie alle oben genannten Punkte angegeben haben, ist hier das Beispiel für das Ändern des Hintergrunds einer Schaltfläche in Aero unter Beibehaltung der ursprünglichen Steuerelementvorlage:

%Vor%

Dies setzt natürlich voraus, dass nur ein Button so gestylt ist, ansonsten können Template und Style irgendwo in einen Ressourcenbereich verschoben werden. Es gibt auch keinen Auslöser für den Standardzustand einer Schaltfläche, aber es wird leicht zum obigen Beispiel hinzugefügt (vergessen Sie nicht, das RenderDefault-Attribut in der Steuerelementvorlage so zu ändern, dass Binding anstelle von TemplateBinding verwendet wird).

Wenn jemand Vorschläge dafür hat, wie Sie die TemplateBinding mit Binding für nur die beiden Attribute in der Steuerelementvorlage, die geändert werden müssen, überschreiben, ohne die gesamte chrome-Definition aus dem aero xaml-Großhandel zu wiederholen, I bin ganz Ohr.

    
Michael Goldshteyn 12.12.2010, 23:20
quelle

1 Antwort

2

Die Standardvorlage für Button verwendet eine ButtonChrome , die eine eigene Zeichnung ausführt. Wenn Sie die Standarddarstellung vollständig entfernen möchten, müssen Sie eine eigene Vorlage ohne ButtonChrome definieren. Ich weiß, dass es sich mühsam anhört, aber Sie müssen es nur einmal tun: Sie können Ihren benutzerdefinierten Stil in ein Ressourcenwörterbuch einfügen und einfach mit StaticResource darauf verweisen. Beachten Sie, dass Sie den Stil auch auf alle Schaltflächen in Ihrer App anwenden können, indem Sie {x:Type Button} als Schlüssel des Stils ( x:Key attribut) verwenden

    
Thomas Levesque 13.12.2010, 01:04
quelle

Tags und Links