2010-04-07 59 views
5

我正在基于ListBox的WPF中编写用户控件。其中一项主要功能是通过拖放项目来对列表重新排序。当用户拖动一个项目时,我将项目Opacity更改为50%,并在我的ViewModel中物理移动ObservableCollection中的项目,具体取决于用户需要的位置。在下降事件中,我将Opacity更改回100%。如何知道WPF中的拖放操作是否已被取消

我得到的问题是,如果用户拖动我的控件的项目,并将其放在其他地方,然后我需要将Opacity更改回100%,并将项目移回到用户启动时的位置拖动。有没有我能处理的事件来捕捉这个动作?如果没有其他狡猾的方法来解决这个问题?

回答

12

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

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

+4

我从来没有意识到DragDrop.DoDragDrop是一个阻塞调用。直到发生下降(成功或否则)之后才会返回。很有用! – Darren 2015-05-22 11:18:11

+1

圣洁的垃圾+1 .... – 2015-09-01 14:44:13

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>