У меня есть ListBox
и DockPanel
.Поле со списком содержит элементы, которые должны быть перетащены на панель док-станции.Я реализовал это, перейдя по этой ссылке .
Есть пара вещей, которые я не понимаю:
- При перетаскивании все, что я вижу, это курсор.Я бы хотел, чтобы литературно увидел элемент списка, который я перетаскиваю, чтобы перемещаться с помощью курсора.Как мне это сделать?
- Является ли свойство
DragDropEffect
только для другой конструкции курсора или имеет более высокую цель?:) - Как сделать так, чтобы элемент списка исчез из
ListBox
после его перетаскивания на DockPanel
? - Я хотел бы включить анимацию для перетаскиваемых объектовкак свечение, когда оно упало.Какой триггер / установщик мне следует использовать для этого?
Вот мой код для базового перетаскивания:
Код для компонента 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);
}
}
Спасибо за помощь.