Silverlight4とWPF4を使用して、ボタンをマウスオーバーしたときに、含まれているテキストのテキストの色を変更するボタンスタイルを作成しようとしています。これを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>
ビジュアルツリー(スヌープで検査した場合)は同じですが([ボタン]-> [ContentPresenter]-> [TextBlock])、最初のバージョンで作成されたテキストブロックのデータコンテキストは「Hello、World」に設定されていますが、 2番目のバージョンでは、テキストプロパティが設定されているだけです。これは、コントロールの作成順序と関係があると思います(最初のバージョンでは、ボタンがTextBlockを作成し、2番目のバージョンでは、テキストブロックが最初に作成される可能性がありますか?これについてはよくわかりません)。
これを調査する過程で、Silverlightで機能するソリューション(ContentPresenterをContentControlに置き換えるなど)をいくつか見ましたが、WPFでは機能しません(プログラムが実際にクラッシュします)。
これはボタンのコントロールテンプレートにあり、可能であればVSMを使用したいので、ボタン自体のForegroundプロパティを明示的に変更することも除外されると思います(テンプレート内からアクセスする方法がわかりませんか? )。
私は本当に助け、誰もが与えることができるアドバイスをいただければ幸いです。