【问题标题】:How do I know if a drag/drop has been cancelled in WPF如何知道 WPF 中的拖放是否已取消
【发布时间】:2010-04-07 08:37:05
【问题描述】:

我正在 WPF 中编写一个基于 ListBox 的用户控件。主要功能之一是能够通过拖动项目来重新排序列表。当用户拖动一个项目时,我将项目 Opacity 更改为 50%,并根据用户想要的位置在我的 ViewModel 中物理移动项目 ObservableCollection。在 drop 事件中,我将 Opacity 更改回 100%。

我遇到的问题是,如果用户将项目拖离我的控件并将其放到其他地方,那么我需要将 Opacity 更改回 100% 并将项目移回用户时的位置开始拖动。是否有我可以处理的事件来捕获此操作?如果没有,还有其他巧妙的方法可以解决这个问题吗?

【问题讨论】:

    标签: wpf drag-and-drop


    【解决方案1】:

    假设您使用的是内置拖放功能,您可以使用 DoDragDrop 方法的返回值。如果放置目标不接受拖动的对象,则 DoDragDrop 返回 DragDropEffects.None。

    这当然假设表单上的其他控件不允许删除列表项。

    【讨论】:

    • 我从来没有意识到 DragDrop.DoDragDrop 是一个阻塞调用。直到发生丢弃(成功或其他)之后它才会返回。很有用!
    【解决方案2】:

    我之前在 XAML 中使用事件触发器完成了这项工作。在我的例子中,它们在用户拖动之前和之前是透明的(不透明度为 30%),不透明度设置为 100%。

    <EventTrigger RoutedEvent="DragDrop.DragEnter">
      <BeginStoryboard Storyboard="{StaticResource FadeInStoryboard}" x:Name="FadeInStoryboard_BeginStoryboard1"/>
    </EventTrigger>
    <EventTrigger RoutedEvent="DragDrop.DragLeave">
      <BeginStoryboard Storyboard="{StaticResource FadeOutStoryboard}" x:Name="FadeOutStoryboard_BeginStoryboard1"/>
    </EventTrigger>
    

    故事板然后会为不透明度设置动画

    <Storyboard x:Key="FadeInStoryboard">
        <DoubleAnimation To="1" Duration="0:00:00.2" Storyboard.TargetName="UserControl" Storyboard.TargetProperty="(UIElement.Opacity)" />
    </Storyboard>
    <Storyboard x:Key="FadeOutStoryboard">
      <DoubleAnimation To="0.3" Duration="0:00:00.2" Storyboard.TargetName="UserControl" Storyboard.TargetProperty="(UIElement.Opacity)" />
    </Storyboard>
    

    【讨论】:

      猜你喜欢
      • 2021-10-07
      • 2012-06-28
      • 2018-04-23
      • 1970-01-01
      • 2014-11-18
      • 2018-10-08
      • 2021-05-24
      • 2012-01-05
      • 1970-01-01
      相关资源
      最近更新 更多