2017-02-09 85 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