C# 如果处理对象,则阻止鼠标移动触发器

C# 如果处理对象,则阻止鼠标移动触发器,c#,wpf,xaml,animation,mouseleave,C#,Wpf,Xaml,Animation,Mouseleave,我有一个网格,当鼠标悬停在它上面时,它会使它的一个子元素变得生动(不透明度从0到1),但是这个网格也可以被处理掉(这个网格是列表框的一部分,可以通过网格上的关闭按钮移除) 当用户单击remove按钮时,它还会启动MouseLeave事件,在该事件下,当然无法再找到my DockStackPanel控件,因为它已被释放。如何解决此问题 <Grid.Triggers> <EventTrigger RoutedEvent="UIElement.MouseE

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

当用户单击remove按钮时,它还会启动MouseLeave事件,在该事件下,当然无法再找到my 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>

您是否尝试过用代码创建动画。我在这里假设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);
    }

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

 <Style TargetType="{x:Type Grid}">
   <Style.Triggers>
        <DataTrigger Binding="{Binding DisableTriggers}" Value="True">
          <Setter Property="Style" Value="{StaticResource GridStyleWithoutStoryboards}" />
        </DataTrigger>
   </Style.Triggers>
 </Style>
总之,您必须添加带有
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);
    };
foreach(var eventToUnsubscribe in grid.Triggers.OfType()中)
.其中(x=>x.RouteEvent==UIElement.MouseEnterEvent
||x.RouteEvent==UIElement.MouseLeaveEvent.ToList())
{
grid.Triggers.Remove(eventToUnsubscribe);
};

您将需要发布更多的代码主管。我希望避免代码落后,但这似乎是最好的解决方案,谢谢!没问题,很乐意帮忙
    foreach (var eventToUnsubscribe in grid.Triggers.OfType<EventTrigger>()
                                                  .Where(x => x.RoutedEvent == UIElement.MouseEnterEvent
                                                              || x.RoutedEvent == UIElement.MouseLeaveEvent).ToList())
    {
        grid.Triggers.Remove(eventToUnsubscribe);
    };