5

我有一个网格,当用鼠标悬停在它上面时,它的一个子元素会变得栩栩如生(不透明度从 0 到 1),但该网格也可以被处理(该网格是列表框的一部分,可以通过网格上的关闭按钮)。

当用户单击删除按钮时,它还会在下面启动 MouseLeave 事件,因为它已被释放,所以当然无法再找到我的 DockStackPanel 控件。我该如何解决这个问题?

     <Grid.Triggers>
         <EventTrigger RoutedEvent="UIElement.MouseEnter">
             <BeginStoryboard>
                 <Storyboard>
                     <DoubleAnimation Duration="0:0:0.5" Storyboard.TargetName="DockStackPanel" Storyboard.TargetProperty="Opacity" To="1" />
                 </Storyboard>
             </BeginStoryboard>
         </EventTrigger>
         <EventTrigger RoutedEvent="UIElement.MouseLeave">
             <BeginStoryboard>
                 <Storyboard>
                     <DoubleAnimation Duration="0:0:0.5" Storyboard.TargetName="DockStackPanel" Storyboard.TargetProperty="Opacity" To="0" />
                 </Storyboard>
             </BeginStoryboard>
         </EventTrigger>
     </Grid.Triggers>
4

2 回答 2

2

您是否尝试过在代码中创建动画。我在这里假设 DockStackPanel 控件是 StackPanel。

public MainWindow()
    {
        InitializeComponent();

        MyGrid.MouseEnter += MyGrid_MouseEnter;
        MyGrid.MouseLeave += MyGrid_MouseLeave;
    }

    void MyGrid_MouseLeave(object sender, MouseEventArgs e)
    {
        if (DockStackPanel != null)
        {
            var dur = new Duration(new TimeSpan(0, 0, 0, 0, 500));
            var anim = new DoubleAnimation(0, dur);
            DockStackPanel.BeginAnimation(StackPanel.OpacityProperty, anim);
        }
    }

    void MyGrid_MouseEnter(object sender, MouseEventArgs e)
    {
        var dur = new Duration(new TimeSpan(0, 0, 0, 0, 500));
        var anim = new DoubleAnimation(1, dur);
        DockStackPanel.BeginAnimation(StackPanel.OpacityProperty, anim);
    }
于 2013-11-21T22:26:30.607 回答
1

您可以做的另一件事是实现DataTrigger它将Grid覆盖默认值MouseLeave,并且在属性更改MouseEnter时不执行任何操作的事件。DisableTriggers

 <Style TargetType="{x:Type Grid}">
   <Style.Triggers>
        <DataTrigger Binding="{Binding DisableTriggers}" Value="True">
          <Setter Property="Style" Value="{StaticResource GridStyleWithoutStoryboards}" />
        </DataTrigger>
   </Style.Triggers>
 </Style>

当您不想使用AttachedBehaviors. 否则,我建议在行为中处理情节提要清理。这要容易得多:

void OnDisableTriggersPropertyChanged( object sender, EventArgs args )
{
    // If IsDisposed property was changed and it is true now - cleanup triggers.
    if ((bool)args.NewValue)
    {
       var grid = (Grid)sender;

       // Ideally you can remove specific triggers. 
       // Clear all will work for simple cases.
       grid.Triggers.Clear();
    }
}

因此,总而言之,您将不得不添加带有依赖属性的附加行为,该属性在处理程序DisableTriggers中执行清理操作。OnChanged

如果您只想退订特定事件:

    foreach (var eventToUnsubscribe in grid.Triggers.OfType<EventTrigger>()
                                                  .Where(x => x.RoutedEvent == UIElement.MouseEnterEvent
                                                              || x.RoutedEvent == UIElement.MouseLeaveEvent).ToList())
    {
        grid.Triggers.Remove(eventToUnsubscribe);
    };
于 2013-11-22T09:24:57.663 回答