我正在WPF中编写一个基于ListBox的用户控件。其中一个主要功能是通过拖动项目来重新排序列表。当用户拖动项目时,我将项目Opacity
更改为50%,并根据用户想要的位置在我的ViewModel中将项目物理移动到ObservableCollection
。在放置事件中,我将Opacity
更改回100%。
我遇到的问题是,如果用户将项目拖离我的控制并将其丢弃到其他地方,那么我需要将Opacity
更改回100%并将项目移回原来的位置用户开始拖动。是否有我可以处理的事件来捕获此操作?如果没有,还有其他狡猾的方法可以解决这个问题吗?
答案 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>