Как просмотреть элемент перетаскивания в WPF? - PullRequest
2 голосов
/ 22 декабря 2010

У меня есть ListBox и DockPanel.Поле со списком содержит элементы, которые должны быть перетащены на панель док-станции.Я реализовал это, перейдя по этой ссылке .

Есть пара вещей, которые я не понимаю:

  1. При перетаскивании все, что я вижу, это курсор.Я бы хотел, чтобы литературно увидел элемент списка, который я перетаскиваю, чтобы перемещаться с помощью курсора.Как мне это сделать?
  2. Является ли свойство DragDropEffect только для другой конструкции курсора или имеет более высокую цель?:)
  3. Как сделать так, чтобы элемент списка исчез из ListBox после его перетаскивания на DockPanel?
  4. Я хотел бы включить анимацию для перетаскиваемых объектовкак свечение, когда оно упало.Какой триггер / установщик мне следует использовать для этого?

Вот мой код для базового перетаскивания:

Код для компонента ListBox

private Point startPosition;

private void ListBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    startPosition = e.GetPosition(null);
}

private void ListBox_PreviewMouseMove(object sender, MouseEventArgs e)
{
    Point currentPosition;
    Vector offset;
    ListBox listBox;
    ListBoxItem item;
    Match match;
    DataObject dragData;

    currentPosition = e.GetPosition(null);
    offset = startPosition - currentPosition;

    if (e.LeftButton == MouseButtonState.Pressed &&
        (Math.Abs(offset.X) > SystemParameters.MinimumHorizontalDragDistance ||
         Math.Abs(offset.Y) > SystemParameters.MinimumVerticalDragDistance))
    {
        // Get the data binded to ListBoxItem object, which is "match"
        listBox = sender as ListBox;
        item = FindAnchestor<ListBoxItem>((DependencyObject)e.OriginalSource);
        match = (Match)listBox.ItemContainerGenerator.ItemFromContainer(item);

        dragData = new DataObject("match", match);
        DragDrop.DoDragDrop(item, dragData, DragDropEffects.Move);
    }
}

Кодовая часть для DockPanel

private void DockPanel_DragEnter(object sender, DragEventArgs e)
{
    if (!e.Data.GetDataPresent("match") ||
        sender == e.Source)
    {
        e.Effects = DragDropEffects.None;
    }
}

private void DockPanel_Drop(object sender, DragEventArgs e)
{
    Match match;
    DockPanel matchSlot;
    ContentPresenter contentPresenter;
    Binding binding;

    if (e.Data.GetDataPresent("match"))
    {
        match = e.Data.GetData("match") as Match;
        matchSlot = sender as DockPanel;

        contentPresenter = new ContentPresenter();
        contentPresenter.ContentTemplate = this.FindResource("MatchTemplate") as DataTemplate;
        binding = new Binding();
        binding.Source = match;
        contentPresenter.SetBinding(ContentPresenter.ContentProperty, binding);

        matchSlot.Children.Clear();
        matchSlot.Children.Add(contentPresenter);
    }
}

Спасибо за помощь.

1 Ответ

0 голосов
/ 27 декабря 2010

Хорошо, через некоторое время я нашел несколько ответов и обнаружил несколько вещей самостоятельно.

Что касается перечисления DragDropEffect, его следует использовать по двум причинам:

  1. Чтобы определить, перемещается или копируется элемент в коде. Он работает как флаг и должен использоваться чаще всего так:

    if (e.DragDropEffect == DragDropEffect.Move)
    {
    ...
    }
    еще ...

  2. Для оформления курсора мыши на основе значения перечисления. Таким образом, он сообщает пользователю, перемещает ли он или копирует элемент.

Что касается визуализации с помощью перетаскивания, вот ссылка на публикацию, содержащую ссылку, которая является отличной отправной точкой для перетаскивания: WPF Drag & Drop: как буквально перетащить элемент?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...