2017-02-09 86 views
1

在我的WPF應用程序中,在可見空間的底部有一個部分可見的網格。當您將鼠標懸停在上面時,它會向上滑動,網格中的所有內容都可以看到。當鼠標離開網格時,它向下滑動。網格中有Combo和TextBoxes,它們將包含信息並能夠被用戶更新。單擊網格時更改MouseLeave動畫

我該如何做到這一點,如果我點擊網格中的任何位置,MouseLeave動畫不再消失(即使您的鼠標離開,網格也會保持不變)?

我已經實現了我的動畫2種不同的方式,試圖讓它按照我想要的方式行事,但至今沒有運氣。

實現1:

`<Grid x:Name="PopupAnimation" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Height="30"> 
      <Grid.Triggers> 
       <EventTrigger RoutedEvent="MouseEnter"> 
        <BeginStoryboard Name="MouseOn"> 
         <Storyboard> 
          <DoubleAnimation Storyboard.TargetProperty="Height" From="30" To="90" Duration="0:0:.15"/> 
         </Storyboard> 
        </BeginStoryboard> 
       </EventTrigger> 
       <EventTrigger RoutedEvent="MouseLeave"> 
        <BeginStoryboard Name="MouseOff"> 
         <Storyboard> 
          <DoubleAnimation Storyboard.TargetProperty="Height" From="90" To="30" Duration="0:0:0.15"/> 
         </Storyboard> 
        </BeginStoryboard> 
       </EventTrigger> 
       <EventTrigger RoutedEvent="MouseLeftButtonDown"> 
        <StopStoryboard BeginStoryboardName="MouseOff" /> 
       </EventTrigger> 
      </Grid.Triggers> 

`

實現2:

<Grid> 
     <Grid.Style> 
      <Style TargetType="Grid"> 
       <Style.Triggers> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Trigger.EnterActions> 
          <BeginStoryboard Name="MouseOn"> 
           <Storyboard> 
            <DoubleAnimation Storyboard.TargetProperty="Height" From="30" To="90" Duration="0:0:.15"/> 
           </Storyboard> 
          </BeginStoryboard> 
         </Trigger.EnterActions> 
         <Trigger.ExitActions> 
          <BeginStoryboard Name="MouseOff"> 
           <Storyboard> 
            <DoubleAnimation Storyboard.TargetProperty="Height" From="90" To="30" Duration="0:0:0.15"/> 
           </Storyboard> 
          </BeginStoryboard> 
         </Trigger.ExitActions> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </Grid.Style> 
    </Grid> 

要麼是這些標題下正確的道路?如何禁用(並啓用)動畫?

+0

如果沒有什麼在網格一旦它表明是用戶可操作的。一個快速的事情,你可以做的只是在網格的單擊事件只是做一個布爾切換到父Grid上的IsHitTestVisible屬性顯示,所以它會忽略任何鼠標事件,如果點擊和IsHitTestVisible =「false」,這將使任何這些IsMouseOver觸發器及其操作。 –

+0

@ChrisW。不幸的是網格中有用戶可操作的部分(組合框和什麼)。我希望能夠讓用戶快速查看信息(鼠標懸停)並對其進行編輯(一旦單擊後,保持直到按鈕指向下),使用起來更容易一些。現在將編輯成問題。 – Pants

回答

1

我該如何做到這一點,如果我點擊網格中的任何位置,MouseLeave動畫不再消失(即使您的鼠標離開,網格也會保持不變)?

不要執行由風格的上下運動,而不是訂閱有關的一切活動,並與mouse entermouse leave事件中運行代碼隱藏的故事板。

然後在最後的事件中,在代碼隱藏網格點擊事件後,設置一個布爾標誌,將由mouse leave事件讀取並允許它不執行故事板。


這裏是代碼,我要搬進/窗口出來在代碼隱藏要給大家介紹的故事板的想法:

if (moveRight) 
{ 
    (Resources["MoveToOpen"] as Storyboard)?.Begin(this, false); 
    (Resources["FlipArrowClose"] as Storyboard)?.Begin(this, false); 
} 
else 
{ 
    if (closeWindow == false) 
    { 
     (Resources["MoveToClose"] as Storyboard)?.Begin(this, false); 
     (Resources["FlipArrowOpen"] as Storyboard)?.Begin(this, false); 
    } 
} 
+0

這指出我在正確的方向,我得到它的功能。我很好奇,這是如何融入MVVM範例的? – Pants

+0

@Pants MVVM是「三層設計」的一個奇特名稱,其視圖與從數據層分離的biz分開。 MVVM的教條讓人認爲所有事情都必須在XAML中完成。這顯然是錯誤的。只要保持虛擬機上的業務邏輯以及XAML中的視圖邏輯或代碼隱藏,那就是MVVM。只要記住XAML被解析,變成* code-behind *並鏈接;因此在XAML中人們可以在代碼隱藏方面做些什麼。當最終將其集成到代碼中時,是否需要通過XAML來獲取全部內容? :-)不,這只是我的看法,我可能是錯的。 – OmegaMan

+0

有趣。我正在研究我的第一個完整堆棧應用程序,並在討論WPF時繼續看到MVVM。你對它的理解對我來說很有意義。 Anywho,感謝您的幫助! – Pants