Wie kann ich in der Steuerungsvorlage einer Schaltfläche die Farbe des enthaltenen Texts festlegen?

Verwenden Sie Silverlight 4 und WPF 4, um einen Schaltflächenstil zu erstellen, der die Textfarbe von enthaltenem Text ändert, wenn Sie mit der Maus über die Schaltfläche fahren. Da ich versuche, dies sowohl mit Silverlight als auch mit WPF kompatibel zu machen, verwende ich den Visual State Manager:

<Style TargetType="{x:Type Button}">
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="Button">
            <Border x:Name="outerBorder" CornerRadius="4" BorderThickness="1" BorderBrush="#FF757679">
                <VisualStateManager.VisualStateGroups>
                    <VisualStateGroup x:Name="CommonStates">
                        <VisualState x:Name="Normal" />
                        <VisualState x:Name="MouseOver">
                            <Storyboard>
                                <ColorAnimation Duration="0" To="#FFFEFEFE"
                                                Storyboard.TargetProperty="(TextElement.Foreground).(SolidColorBrush.Color)"
                                                Storyboard.TargetName="contentPresenter"/> 
                            </Storyboard>
                        </VisualState>
                    </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
                <Grid>
                    <Border x:Name="Background" CornerRadius="3" BorderThickness="1" BorderBrush="Transparent">
                        <Grid>
                            <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}"/>
                        </Grid>
                    </Border>
                </Grid>
            </Border>
        </ControlTemplate>
    </Setter.Value>
</Setter>

Da dies eine Vorlage für einen normalen alten Knopf ist, gibt es keine Garantie, dass sich sogar ein Textblock darin befindet, und ich war mir zunächst nicht sicher, ob dies überhaupt möglich war. Seltsamerweise ist die Textfarbe does ändern, wenn die Schaltfläche wie folgt deklariert ist:

<Button Content="Hello, World!" />

aber esnich ändern, wenn die Schaltfläche wie folgt deklariert ist:

<Button>
    <TextBlock Text="Hello, World!" /> <!-- Same result with <TextBlock>Hello, World </TextBlock> -->
</Button>

Auch wenn der visuelle Baum (bei Prüfung in snoop) identisch ist (Button -> ContentPresenter -> TextBlock), mit der Einschränkung, dass der Datenkontext des in der 1. Version erstellten Textblocks auf "Hello, World" festgelegt ist, während der Textblock In der zweiten Version ist lediglich die Eigenschaft text festgelegt. Ich gehe davon aus, dass dies etwas mit der Reihenfolge der Steuerelementerstellung zu tun hat (in der ersten Version erstellt der Button den TextBlock, in der zweiten Version wird der Textblock möglicherweise zuerst erstellt? Wirklich nicht sicher).

Während der Recherche habe ich einige Lösungen gesehen, die in Silverlight funktionieren (wie das Ersetzen des ContentPresenter durch ein ContentControl), aber in WPF nicht funktionieren (Programm stürzt tatsächlich ab).

Da dies in der Steuerungsvorlage der Schaltfläche enthalten ist und ich die VSM nach Möglichkeit verwenden möchte, sollte auch die Vordergrundeigenschaft der Schaltfläche nicht explizit geändert werden (ich weiß nicht, wie ich in der Vorlage darauf zugreifen soll) ?)

Ich würde mich über jede Hilfe und jeden Rat sehr freuen.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage