我想觸發Button的模板更改以補充FocusVisualStyle效果。基本上,我想在下面的代碼片段文本「富」變紅當且僅當 FocusVisualStyle可見:WPF按鈕如何決定顯示FocusVisualStyle?
<Style x:Key="ButtonStyle1" TargetType="{x:Type Button}">
<Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid>
<ContentPresenter/>
<TextBlock x:Name="TxtFoo" Text="foo" Foreground="Black"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsKeyboardFocused" Value="true">
<Setter Property="Foreground" TargetName="TxtFoo" Value="Red"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
請忽略的事實,例子是愚蠢的,實際的代碼是比較有用的(它修改了一條路徑)。
這適用於鍵盤導航,但有一個問題:當按下按鈕(在這種情況下不顯示FocusVisualStyle)時,文本也變爲紅色。在GotKeyboardFocus/LostKeyboardFocus上使用eventTrigger會得到相同的結果。
看看框架的源代碼我沒有看到任何特別的東西:KeyboardNavigation.ShowFocusVisual()
按預期調用FrameworkElement.OnGotKeyboardFocus()
。但是,顯然肯定還有其他事情正在進行,因爲並不是每個gotKeyboardFocus事件都會導致FocusVisualStyle顯示。
如果我想與FocusVisualStyle「同步」,我應該定位什麼屬性/事件?
我無法使用FocusVisualStyle,因爲它在按鈕上放置了一個附加圖層(默認模板只是虛線邊框)。 FocusVisualStyle中的所有設置者都將目標添加到附加圖層中。但是,在這種情況下,我必須與控制本身進行交互。在這個例子中,'foo'是硬連線的,實際上我改變了實際按鈕的內容。這有意義嗎? – 2012-03-02 14:32:58
我明白了。我現在不能嘗試,但在Blend中打開Button控件模板並檢查視覺狀態或觸發器。找到聚焦的人,並檢查他們在模板中做了什麼。 IMHO最好的方法是有兩層,當聚焦隱藏內容和顯示焦點之一。說得通? – LBugnion 2012-03-02 14:37:19
有道理。 wpf模板仍然不是基於Visual State Manager的,但這樣做並不困難(可能從Silverlight模板開始)。謝謝你的提示! – 2012-03-02 14:43:55