1

我定義的控件模板的按鈕的VisualState:如何根據某些條件禁用/啓用VisualState? (地鐵)

<ControlTemplate x:Key="ButtonTemplate" TargetType="Button"> 
     ... 
     <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup x:Name="CommonStates"> 
      ... 
      <VisualState x:Name="PointerOver"> 
      <Storyboard> 
       <DoubleAnimation Storyboard.TargetName="c1" Storyboard.TargetProperty="Opacity" To="0.7"/> 
      </Storyboard> 
      </VisualState> 
      ... 
     </VisualStateGroup> 
     </VisualStateManager.VisualStateGroups> 
     ... 
    </ControlTemplate> 

但這種影響(改變不透明度時,鼠標懸停)應根據視圖模型條件下啓用/禁用,所以我怎麼辦用XAML?

我試着爲DoubleAnimation的To值創建一個綁定,它不起作用,因爲Storyboard被凍結。我也在想像一個模板選擇器,但VisualState Manager沒有這樣的事情。

回答

1

我最近和某人討論過這個問題,我可能會將問題的通用解決方案添加到WinRT XAML工具包中,該工具類似於WPF中的DataTriggers,但現在我只需將DependencyProperty添加到您的控件中,bind視圖模型和值更改的屬性 - 更新視覺狀態。

+0

感謝您的回覆。但是當你說「更新可視狀態」時,你的意思是「切換到另一個可視狀態」或「更改VisualStateManager的邏輯樹」。對於前者,它不起作用,因爲可以通過鼠標操作觸發「PointerOver」狀態,所以即使我手動切換到另一個狀態,「PointerOver」狀態仍然存在,但鼠標仍然會被觸發除非我可以「禁用」它。對於後者,我需要先找到C#中的VisualState對象,但它看起來不在可視化樹中。 (在Button上找不到GetDescendants()) – 2013-02-13 00:28:07

+1

我的意思是「切換到另一個視覺狀態」。如果'PointerOver'被按鈕的邏輯覆蓋 - 清除它的'Storyboard'並在一個新的'VisualStateGroup'中添加你自己定製的'CustomPointerOver'狀態,它可以做到你想要的那個按鈕,所以它不會使用或覆蓋它。我不認爲你需要在運行時修改'VisualStateGroup'的設置,但GetDescendants()只適用於可視化樹元素('UIElement's),而'VisualStateManager'不是。 – 2013-02-13 01:27:04

+0

謝謝。有效!從來沒有想過我可以在同一個VisualStateGroup中使用混合狀態(Button知道並且不知道)。我只需要處理PointerEntered事件並根據條件決定是否轉到我的CustomPointerOver狀態。 – 2013-02-13 02:23:32

相關問題