Я пишу пользовательский элемент управления в WPF, который основан на ListBox. Одна из основных частей функциональности является способностью переупорядочить список путем перетаскивания объектов вокруг. Когда пользователь перетаскивает объект, я изменяю объекты Opacity
к 50% и физически перемещают объект в ObservableCollection
в моем ViewModel в зависимости от того, где пользователь хочет это. На событии отбрасывания я изменяюсь Opacity
назад к 100%.
Проблема, которую я имею, состоит в том, что, если пользователь перетаскивает объект от моего управления и отбрасывает его где-то в другом месте затем, я должен измениться Opacity
назад к 100% и кладут обратно объект туда, где это было, когда пользователь запустил перетаскивание. Существует ли событие, которое я могу обработать для получения этого действия? Если не там какой-либо другой хитрый путь состоит в том, чтобы решить эту проблему?
Предполагая, что вы используете встроенную функцию перетаскивания, вы можете использовать возвращаемое значение метода DoDragDrop. Если цель перетаскивания не принимает перетаскиваемый объект, то DoDragDrop возвращает DragDropEffects.None.
Это, конечно, предполагает, что другие элементы управления в вашей форме не позволяют отбрасывать элементы вашего списка.
Я уже делал это с помощью триггеров событий в 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>