| 

.NET C# Java Javascript Exception

1
Guten Abend zusammen,

ich versuche momentan, die Defaultfarben des WPF-Aero.NormalColor-Themes zu verändern. Pauschal ist das kein Problem und auch gar nicht mein Anliegen. Ich bin dabei nur über ein merkwürdiges Verhalten des Buttons gestolpert.

Wenn ich die Background-Color des Buttons z.B. auf Rot setze, dann färbt er sich bei Mouseover bzw. wenn er den Focus hat, immer noch bläulich ein. Und genau dieses Merkmal kann ich in der Aero.NormalColor.xaml nicht finden.

Es ist dort ein Style für den BaseButton definiert. Hier drin wird auf ein ButtonChrome verwiesen. An dieses komme ich aber leider nicht ran. Der Button-Style selbst ist quasi einzeilig in der XAML-Datei und basiert schlicht auf ButtonBase.

Ich vermute, das die Farben bzw. Animationen bei MouseOver mit einem VisualState definiert worden sind. Nur frage ich mich, wie ich an diesen Teil des XAMLs herankomme. Selbst mit Blend bin ich nicht bis dahin gekommen. Da ich auch gar nicht vorhabe, meinen eigenen ButtonStyle zu kreieren, da ich mit dem Default zufrieden bin und ihn nur einfärben möchte, wäre es echt schön, wenn mir hier jemand unter die Arme greifen könnte.

Ich hoffe mich hat überhaupt jemand verstanden :)
21.06.2011
Jens Duczmal 2,6k 1 3 9
Jens Duczmal 2,6k 1 3 9
1
Nachtrag: Ich glaube mittlerweile zu wissen, das der ButtonChrome, welcher hier referenziert wird, eben ausschließlich durch Code eingefärbt wird, also keine Chance für XAML. Ich werde morgen mal mit dem Reflector auf die Suche gehen und schauen, ob man nicht den Originalcode kopieren kann um dann lediglich die Farben mit einer DynamicRessource versehen kann. Das Ergebnis poste ich dann hier.
Jens Duczmal 21.06.2011
2 Antworten
0
Hm.....also selbst mit dem Reflector sieht man hier keine Farben. Dummerweise ist die Klasse nichtmal vererbbar. Ich frage mich, wo die Farben festgelegt werden, welche beim MouseOver über einen Button angezeigt werden.

public sealed class ButtonChrome : Decorator
{
// Fields
public static readonly DependencyProperty BackgroundProperty;
public static readonly DependencyProperty BorderBrushProperty;
public static readonly DependencyProperty RenderDefaultedProperty;
public static readonly DependencyProperty RenderMouseOverProperty;
public static readonly DependencyProperty RenderPressedProperty;
public static readonly DependencyProperty RoundCornersProperty;

// Methods
static ButtonChrome();
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public ButtonChrome();
protected override Size ArrangeOverride(Size finalSize);
protected override Size MeasureOverride(Size availableSize);
protected override void OnRender(DrawingContext drawingContext);

// Properties
public Brush Background { get; set; }
public Brush BorderBrush { get; set; }
internal override int EffectiveValuesInitialSize { get; }
public bool RenderDefaulted { get; set; }
public bool RenderMouseOver { get; set; }
public bool RenderPressed { get; set; }
public bool RoundCorners { get; set; }
}
22.06.2011
Jens Duczmal 2,6k 1 3 9
Hallo,
habe genau das selbe Problem bzw versuche genau dieses zu lösen. Interessanterweise funktioniert es hardcored also in der betreffenden xaml datei direkt den Button mit eignem Style zu überladen so dass dieser Effekt durch den ButtonChrome nicht zu tragen kommt. Leider geht das nicht wenn man versucht ein template per rescouren einzubinden bzw zu gestalten. Vielleicht hat irgend jemand eine Lösung gefunden?!
akaToti 16.05.2012
Ich habe meine Suche leider aus Zeitmangel auf Eis legen müssen. Wie ich jetzt gerade merke ist schon wieder ein Jahr um. *Kopfschüttel*
Jens Duczmal 17.05.2012
0
als "Lösungsansatz" kann ich bestätigen dass eine völlige Überladung des Standard Templates(z.B Areo) mit einem kompletten Control Template das Problem eindämmt. Hierfür braucht man nur ein Control Template, welches alle ButtonChrome Effekte anspricht und überschreibt. Ich hoffe dieser Ansatz hilft weiter!
31.05.2012

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH