Как узнать, было ли отменено перетаскивание в WPF? - PullRequest
5 голосов
/ 07 апреля 2010

Я пишу пользовательский элемент управления в WPF, который основан на ListBox. Одним из основных элементов функциональности является возможность упорядочить список, перетаскивая элементы. Когда пользователь перетаскивает элемент, я изменяю элементы Opacity на 50% и физически перемещаю элемент в ObservableCollection в моей модели представления в зависимости от того, где пользователь хочет его. В случае выпадения я изменяю Opacity обратно на 100%.

Проблема, с которой я столкнулся, заключается в том, что если пользователь перетаскивает элемент из моего элемента управления и отбрасывает его куда-то еще, мне нужно изменить Opacity обратно на 100% и переместить элемент туда, где он был, когда пользователь начал перетаскивать. Могу ли я обработать событие, чтобы захватить это действие? Если нет, то есть ли другой хитрый способ решить эту проблему?

Ответы [ 2 ]

14 голосов
/ 07 апреля 2010

Если вы используете встроенную функцию перетаскивания, вы можете использовать возвращаемое значение метода DoDragDrop. Если цель отбрасывания не принимает перетаскиваемый объект, то DoDragDrop возвращает DragDropEffects.None.

Это, конечно, предполагает, что другие элементы управления в вашей форме не позволяют отбрасывать элементы вашего списка.

1 голос
/ 07 апреля 2010

Я делал это раньше, используя триггеры событий в 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...