如何知道WPF中是否已取消拖放

时间:2010-04-07 08:37:05

标签: wpf drag-and-drop

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

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

2 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分: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>