2012-03-02 67 views
2

我想觸發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「同步」,我應該定位什麼屬性/事件?

回答

1

也許愚蠢的問題,但你爲什麼不簡單地複製FocusVisualStyle(在混合)並編輯它以顯示你想要的?這是我們通常做這些事情的方式。

乾杯, 洛朗

+0

我無法使用FocusVisualStyle,因爲它在按鈕上放置了一個附加圖層(默認模板只是虛線邊框)。 FocusVisualStyle中的所有設置者都將目標添加到附加圖層中。但是,在這種情況下,我必須與控制本身進行交互。在這個例子中,'foo'是硬連線的,實際上我改變了實際按鈕的內容。這有意義嗎? – 2012-03-02 14:32:58

+1

我明白了。我現在不能嘗試,但在Blend中打開Button控件模板並檢查視覺狀態或觸發器。找到聚焦的人,並檢查他們在模板中做了什麼。 IMHO最好的方法是有兩層,當聚焦隱藏內容和顯示焦點之一。說得通? – LBugnion 2012-03-02 14:37:19

+0

有道理。 wpf模板仍然不是基於Visual State Manager的,但這樣做並不困難(可能從Silverlight模板開始)。謝謝你的提示! – 2012-03-02 14:43:55

0

而不是使用IsKeyboardFocused嘗試IsFocused的。