2012-09-23 40 views
0

終於我得到我的自定義按鈕幾乎就像我想要它的行爲。
問題是代碼:d(IsCheckedDependencyProperty簡化這個XAML代碼可能嗎? (MultiDataTrigger,DependencyProperty)

<ControlTemplate.Triggers> 
      <!-- EventTriggers for LMBUp/LMBDown/MouseEnter/MouseLeave --> 
      <MultiDataTrigger> 
       <MultiDataTrigger.Conditions> 
        <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True"/> 
        <Condition Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsChecked}" Value="False"/> 
       </MultiDataTrigger.Conditions> 
       <MultiDataTrigger.EnterActions> 
        <BeginStoryboard Storyboard="{StaticResource MouseEnter}"/> 
       </MultiDataTrigger.EnterActions> 
       <MultiDataTrigger.ExitActions> 
        <BeginStoryboard Storyboard="{StaticResource MouseLeave}"/> 
       </MultiDataTrigger.ExitActions> 
      </MultiDataTrigger>     
      <MultiDataTrigger> 
       <MultiDataTrigger.Conditions> 
        <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True"/> 
        <Condition Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsChecked}" Value="True"/> 
       </MultiDataTrigger.Conditions> 
       <Setter TargetName="LayoutRoot" Property="Background" Value="Red"/> 
      </MultiDataTrigger> 
      <MultiDataTrigger> 
       <MultiDataTrigger.Conditions> 
        <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="False"/> 
        <Condition Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsChecked}" Value="True"/> 
       </MultiDataTrigger.Conditions> 
       <Setter TargetName="LayoutRoot" Property="Background" Value="Red"/> 
      </MultiDataTrigger> 
     </ControlTemplate.Triggers> 

我認爲這是一個有點「髒」,並沒有完全像預期。 每次用戶點擊按鈕IsChecked都會從true切換到false,反之亦然。 現在,如果發生以下情況

  • ==器isChecked真正
  • 用戶點擊即可切換器isChecked假
  • 所有的時間,鼠標上的按鈕

那麼我會想到的是,按鈕變成$ MouseOverColor $而不是$ ButtonNormalBackground $,因爲第一個MultiDataTrigger

我的問題是,如果有可能簡化代碼並糾正最後一個問題?

在此先感謝!

回答

0

您可能有'價值分辨率策略'問題。 DependencyProperty有一套如何解決價值的策略,see here

如果您的動畫設置爲Background的值爲LayoutRoot,那麼其他設置器在您停止動畫之前不會產生任何效果(在這種情況下,設置器被視爲「本地值」)。

您可以在第二個和第三個觸發器的EnterActions中使用<StopStoryboard>元素。請注意,如果故事板在激活觸發器時已停止,則會在輸出窗口中寫入警告。

--Alternatively--

您可以在故事板使用FillBehavior="Stop"