В шаблоне управления кнопки, как я могу установить цвет текста?

Используя Silverlight 4 и WPF 4, я пытаюсь создать стиль кнопки, который изменяет цвет текста любого содержащегося в нем текста, когда кнопка наведена на мышь. Поскольку я пытаюсь сделать это совместимым как с Silverlight, так и с WPF, я использую диспетчер визуального состояния:

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

Поскольку это шаблон для обычной старой кнопки, я знаю, что нет гарантии, что внутри нее даже есть текстовый блок, и сначала я не был уверен, что это вообще возможно. Любопытно, что цвет текстаделает изменить, если кнопка объявлена ​​как:

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

но этоне изменить, если кнопка объявлена ​​как:

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

Хотя визуальное дерево (при проверке в snoop) идентично (Button -> ContentPresenter -> TextBlock), с оговоркой, что текстовый блок, созданный в 1-й версии, имеет свой контекст данных, установленный на «Hello, World», тогда как текстовый блок в вторая версия просто имеет свой набор свойств текста. Я предполагаю, что это как-то связано с порядком создания элемента управления (в первой версии кнопка создает текстовый блок, во второй версии текстовый блок может быть создан первым? Действительно не уверен в этом).

В ходе исследования этого я видел несколько решений, которые работают в Silverlight (например, замена ContentPresenter на ContentControl), но они не будут работать в WPF (на самом деле происходит сбой программы).

Поскольку это находится в шаблоне элемента управления кнопки, и я хотел бы использовать VSM, если это возможно, я думаю, что это также исключает явное изменение собственного свойства Foreground кнопки (я не знаю, как бы я получил к нему доступ из шаблона? )

Я очень ценю любую помощь, совет, который может дать любой.

Ответы на вопрос(3)

Ваш ответ на вопрос