2011-06-27 54 views
0

我有這樣的代碼:問題的條件觸發(或動畫)

<UserControl.Resources> 
    <Storyboard x:Key="OnMouseEnterToDocumentsMenu"> 
     <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="Documents"> 
      <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0.8"/> 
     </DoubleAnimationUsingKeyFrames> 
    </Storyboard> 
    <Storyboard x:Key="OnMouseLeaveFromDocumentsMenu"> 
     <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="Documents"> 
      <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0.3"/> 
     </DoubleAnimationUsingKeyFrames> 
    </Storyboard> 
    <Storyboard x:Key="OnMouseEnterToPeopleMenu"> 
     <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="People"> 
      <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0.8"/> 
     </DoubleAnimationUsingKeyFrames> 
    </Storyboard> 
    <Storyboard x:Key="OnMouseLeaveFromPeopleMenu"> 
     <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="People"> 
      <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0.3"/> 
     </DoubleAnimationUsingKeyFrames> 
    </Storyboard> 
    </Storyboard> 
</UserControl.Resources> 
<UserControl.Triggers> 
    <EventTrigger RoutedEvent="Mouse.MouseEnter" SourceName="Documents"> 
     <BeginStoryboard Storyboard="{StaticResource OnMouseEnterToDocumentsMenu}"/> 
    </EventTrigger> 
    <EventTrigger RoutedEvent="Mouse.MouseLeave" SourceName="Documents"> 
     <BeginStoryboard Storyboard="{StaticResource OnMouseLeaveFromDocumentsMenu}"/> 
    </EventTrigger> 
    <EventTrigger RoutedEvent="Mouse.MouseEnter" SourceName="People"> 
     <BeginStoryboard Storyboard="{StaticResource OnMouseEnterToPeopleMenu}"/> 
    </EventTrigger> 
    <EventTrigger RoutedEvent="Mouse.MouseLeave" SourceName="People"> 
     <BeginStoryboard Storyboard="{StaticResource OnMouseLeaveFromPeopleMenu}"/> 
    </EventTrigger> 
    </EventTrigger> 
</UserControl.Triggers> 

目的

我是動畫的菜單。菜單元素是TextBlocks,我正在模擬「懸停衰落」。

問題

我發佈的代碼動畫一旦鼠標進入或離開的不透明度。我有另一種方法(後面的代碼),一旦用戶在菜單上點擊它(並在相應的容器上加載適當的用戶控件),就將菜單元素的不透明度設置爲「1」。我猜這種方法是有效的,但是一旦MouseLeave動畫開始,無論該元素是否被選中(如果其不透明度是1而不是0.8),它都會再次消失不透明度。

需要

是否有指定只有鼠標離開觸發器觸發時,源透明度不爲1或僅如果TargetProperty不是1

感謝執行故事板的方式。

PS

有沒有一種方法,以防止因爲動畫故事板是相同(重點和褪色)的和更多的菜單會重複代碼。我複製它,因爲我需要把目標名稱,是不同的,但我想有另一種「更清潔」的方式。

+0

嘗試'表達Blend'。它可以幫助你創建儘可能簡單的動畫。 – Rev

+1

我正在使用表情混合。這就是我創建上述動畫的方式。但它沒有提供我所要求的指導。 –

+0

'Anivas'提供很好的答案。對於動畫問題,您必須處理'UserControl CodeBehind'並檢查不透明度的當前狀態。 – Rev

回答

0

此行爲由於依賴項屬性值precedence。我還沒有找到一個xamlish的方式來做到這一點。但代碼如下:

  • 訂閱故事板的完成事件。
  • 查找已選定的menuItem並調用BeginAnimation。
  • 您可以在此here找到更多信息。

    private void Storyboard_Completed(object sender, EventArgs e) 
    { 
        foreach (var menuItem in this.file.Items) 
        { 
         var item = (MenuItem)menuItem; 
         if (item.IsChecked) 
         { 
          item.BeginAnimation(UIElement.OpacityProperty, null); 
          item.Opacity = 1; 
         } 
        } 
    } 
    

    我已經看過,如果選擇了菜單項用於向器isChecked說。如果這不適合你,請使用你自己的方法。

問題2這增加資源,你可以擺脫所有單個觸發器和重複的故事板:

 <Window.Resources> 
    <Storyboard x:Key="HoverOn"> 
     <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(UIElement.Opacity)"> 
      <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0.8"/> 
     </DoubleAnimationUsingKeyFrames> 
    </Storyboard> 
    <Storyboard x:Key="HoverOff" Completed="Storyboard_Completed"> 
     <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(UIElement.Opacity)"> 
      <SplineDoubleKeyFrame KeyTime="00:00:00.5000000" Value="0.3"/> 
     </DoubleAnimationUsingKeyFrames> 
    </Storyboard> 
    <Style TargetType="{x:Type MenuItem}"> 
     <Style.Triggers> 
     <EventTrigger RoutedEvent="Mouse.MouseEnter" > 
      <BeginStoryboard Storyboard="{StaticResource HoverOn}"/> 
     </EventTrigger> 
     <EventTrigger RoutedEvent="Mouse.MouseLeave"> 
      <BeginStoryboard Storyboard="{StaticResource HoverOff}"/> 
     </EventTrigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 
+0

感謝您的回覆Anivas。 我嘗試你的解決方案,但沒有奏效。 Storyboard_Completed執行並設置不透明度的行執行。但用調試器檢查我發現無論我把文檔放在哪裏。不透明度= 1,不透明度不會改變。 –

+0

你可以在更改後發佈你的最新代碼,我會看看。 – anivas

+0

其實是一樣的。我諮詢了MVP並告訴我這個問題與代碼的執行方式有關。一旦設置了不透明度(不管是在代碼還是我的代碼中),該集合將被推遲到故事板釋放其鎖定(由於調用層次結構,不會在完成的事件中發生),並且設置不透明度的邏輯只有當它的0.3,一旦故事板執行時仍然是0.8,所以不會發生轉換。 無論如何感謝Anivas! –