在WPF中,我如何知道拖放操作是否被取消?

7
我正在WPF中编写一个基于ListBox的用户控件。其中一个主要功能是通过拖动项目来重新排序列表。当用户拖动项目时,我会将其透明度更改为50%,并根据用户所需位置在我的ViewModel中实际移动ObservableCollection中的项目。放下事件后,我将Opacity更改回100%。

我的问题是,如果用户将项目从我的控件中拖出并在其他地方放下,则需要将Opacity更改回100%并将项目移回到用户开始拖动时所在的位置。是否有事件可以处理以捕获此操作?如果没有,是否有其他聪明的方法来解决这个问题?

2个回答

23

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

当然,这是基于您的表单上的其他控件不允许放置列表项。


12
我从未意识到DragDrop.DoDragDrop是一个阻塞调用。它直到拖放完成(无论成功与否)后才返回。非常有用! - Darren

1

我以前使用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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接