当发生拖动操作时,如何在XAML中激活WPF触发器?

当发生拖动操作时,如何在XAML中激活WPF触发器?,wpf,triggers,drag-and-drop,Wpf,Triggers,Drag And Drop,我们正在寻找一种在XAML中基于是否处于拖放操作的WPF触发器的方法。取决于我们是否需要,我们需要不同的悬停行为,这就是为什么需要这样做 我能想到的唯一方法是处理拖动开始和结束事件并手动跟踪状态,但这需要代码隐藏,而不是纯XAML。此外,这似乎完全是杀伤力过大,特别是因为我们必须对每一个潜在的下降目标都这样做,这是一个真正的痛苦 那么,有没有一种简单的方式来说‘嘿。。。我正在进行拖放操作,所以请激活此触发器“还是我在这里运气不好?” 更新 为了阐明我们目前在纯XAML中试图做什么,您可以创建一

我们正在寻找一种在XAML中基于是否处于拖放操作的WPF触发器的方法。取决于我们是否需要,我们需要不同的悬停行为,这就是为什么需要这样做

我能想到的唯一方法是处理拖动开始和结束事件并手动跟踪状态,但这需要代码隐藏,而不是纯XAML。此外,这似乎完全是杀伤力过大,特别是因为我们必须对每一个潜在的下降目标都这样做,这是一个真正的痛苦

那么,有没有一种简单的方式来说‘嘿。。。我正在进行拖放操作,所以请激活此触发器“还是我在这里运气不好?”


更新
为了阐明我们目前在纯XAML中试图做什么,您可以创建一个样式,然后设置一个样式触发器来检查IsMouseOver属性,即绘制背景高亮。好的,我们想这样做,但是我们想说如果'IsMouseOver'为真,如果IsDraging=真,那么应用这个触发器。

我只见过使用事件处理程序实现拖放,所以我认为你运气不好。我建议您创建自己的dependency属性以指示正在进行的拖放。

如果这是一个真正的DragDrop事件,请注意DragOver事件

            <EventTrigger RoutedEvent="DragOver">
                <BeginStoryboard>
                    <Storyboard Storyboard.TargetProperty="Fill.Color">
                        <ColorAnimation From="White" To="Black" Duration="0:0:1" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>

我刚刚遇到了这个问题,我的解决方案是使用一个附加属性来提供缺少的
IsDraging

  • 定义附加属性

    public static readonly DependencyProperty IsDraggingProperty =
        DependencyProperty.RegisterAttached
        (
            "IsDragging",
            typeof(bool),
            typeof(ClassContainingThisProperty),
            new UIPropertyMetadata(false)
        );
    
    public static bool GetIsDragging(DependencyObject source)
    {
        return (bool)source.GetValue(IsDraggingProperty);
    }
    
    public static void SetIsDragging(DependencyObject target, bool value)
    {
        target.SetValue(IsDraggingProperty, value);
    }
    
  • 创建此扩展方法以帮助您设置属性

    public static TParent FindParent<TParent>(this DependencyObject child) where TParent : DependencyObject
    {
        DependencyObject current = child;
        while(current != null && !(current is TParent))
        {
            current = VisualTreeHelper.GetParent(current);
        }
        return current as TParent;
    }
    
    public static void SetParentValue<TParent>(this DependencyObject child, DependencyProperty property, object value) where TParent : DependencyObject
    {
        TParent parent = child.FindParent<TParent>();
        if(parent != null)
        {
            parent.SetValue(property, value);
        }
    }
    
    公共静态TParent FindParent(此DependencyObject子级),其中TParent:DependencyObject
    {
    DependencyObject当前=子对象;
    while(当前!=null&!(当前为TParent))
    {
    当前=VisualTreeHelper.GetParent(当前);
    }
    返回电流为t租金;
    }
    公共静态无效SetParentValue(此DependencyObject子级,DependencyProperty属性,对象值),其中TParent:DependencyObject
    {
    TParent parent=child.FindParent();
    如果(父项!=null)
    {
    parent.SetValue(属性、值);
    }
    }
    
  • 根据所使用的控件(例如ListView)处理DragDrop事件,以设置元素的附加属性

    private void OnDragEnter(object sender, DragEventArgs e)
    {
        DependencyObject source = e.OriginalSource as DependencyObject;
        if (source != null)
        {
            source.SetParentValue<ListViewItem>(ClassContainingTheProperty.IsDraggingProperty, true);
        }
    }
    
    private void OnDragLeave(object sender, DragEventArgs e)
    {
        DependencyObject source = e.OriginalSource as DependencyObject;
        if(source != null)
        {
            source.SetParentValue<ListViewItem>(ClassContainingTheProperty.IsDraggingProperty, false);
        }
    }
    
    private void OnDrop(object sender, DragEventArgs e)
    {
        DependencyObject source = e.OriginalSource as DependencyObject;
        if(source != null)
        {
            source.SetParentValue<ListViewItem>(ClassContainingTheProperty.IsDraggingProperty, false);
        }
    }
    
    private void OnDragEnter(对象发送方,DragEventArgs e)
    {
    DependencyObject源=e.OriginalSource作为DependencyObject;
    如果(源!=null)
    {
    source.SetParentValue(ClassContainingTheProperty.isDragingProperty,true);
    }
    }
    私有void OnDragLeave(对象发送方、DragEventArgs e)
    {
    DependencyObject源=e.OriginalSource作为DependencyObject;
    如果(源!=null)
    {
    source.SetParentValue(ClassContainingTheProperty.isDragingProperty,false);
    }
    }
    私有void OnDrop(对象发送方,DragEventArgs e)
    {
    DependencyObject源=e.OriginalSource作为DependencyObject;
    如果(源!=null)
    {
    source.SetParentValue(ClassContainingTheProperty.isDragingProperty,false);
    }
    }
    
  • 使用触发器中的属性

    <ControlTemplate TargetType="{x:Type ListViewItem}">
      <ControlTemplate.Triggers>
        <Trigger Property="namespace:ClassContainingTheProperty.IsDragging" Value="True">
          <Setter Property="Background" Value="White" />
          <Setter Property="BorderBrush" Value="Black" />
        </Trigger>
      </ControlTemplate.Triggers>
    </ControlTemplate>
    
    
    

  • 你找到什么了吗?我试图找到如何在视图上使用纯xaml进行拖放行为的答案:(@Anon,我很确定XAML中没有内置功能。您至少需要为
    Drop
    事件实现一个处理程序。它可以在
    UIElement
    上找到。在我的情况下,我不是在寻找Drop事件。我正在尝试应用一种样式。我已经在上面澄清了。您是否确实有一个属性在对象上运行?问题是正如我上面所说的,你不能只做一个附加属性,因为你会附加到什么?我不关心被拖动的对象,而是它被拖动的对象,所以我必须在每个可以拖动的控件上附加该属性,实际上它将是两个属性…一个用来“打开”monito我的意思是,这是可以做到的,但这似乎完全是矫枉过正。然后,这也会奏效。不过,他们确实应该在某个地方将该属性添加到控件类层次结构中。