У меня проблема при перетаскивании элементов между двумя списками. Хотя перетаскиваемый элемент - ListBoxItem, он отлично работает, но кнопка перетаскивания оставляет пустое поле.
Я попытался проверить тип перетаскиваемого элемента, но я новичок в WPF и не знаю, как это исправить.
Это мой файл mainWindow.xaml.cs
private const string formatLista = "Format_Lista";
private const string formatElement = "Format_Element";
private void ListBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
ListBox lbSender = sender as ListBox;
ListBoxItem element = lbSender.GetItemAt(e.GetPosition(lbSender));
if (element == null) return;
var item = VisualTreeHelper.HitTest(lbSender, e.GetPosition(lbSender)).VisualHit;
DataObject dane = new DataObject();
dane.SetData(formatLista, lbSender);
dane.SetData(formatElement, element);
DragDrop.DoDragDrop(lbSender, dane, DragDropEffects.Move | DragDropEffects.Copy);
}
private void ListBox_DragEnter(object sender, DragEventArgs e)
{
if (e.KeyStates.HasFlag(DragDropKeyStates.ControlKey))
e.Effects = DragDropEffects.Copy;
else e.Effects = DragDropEffects.Move;
}
private void ListBox_Drop(object sender, DragEventArgs e)
{
ListBox lbSender = sender as ListBox;
ListBox lbŹródło = e.Data.GetData(formatLista) as ListBox;
ListBoxItem element = e.Data.GetData(formatElement) as ListBoxItem;
if (e.KeyStates.HasFlag(DragDropKeyStates.ControlKey))
{
element = new ListBoxItem() { Content = element.Content };
}
else lbŹródło.Items.Remove(element);
lbSender.Items.Add(element);
}
Существует класс GetitemAt, который я использовал в приведенном выше коде
public static class ListBoxExtensions
{
public static ListBoxItem GetItemAt(this ListBox listBox, Point position)
{
var item = VisualTreeHelper.HitTest(listBox, position).VisualHit;
while(item != null && !(item is ListBoxItem))
{
item = VisualTreeHelper.GetParent(item);
}
return item as ListBoxItem;
}
}
, а здесь код xaml:
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="5" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<ListBox Grid.Column="0"
PreviewMouseLeftButtonDown="ListBox_PreviewMouseLeftButtonDown"
AllowDrop="True" DragEnter="ListBox_DragEnter"
Drop="ListBox_Drop">
<ListBoxItem Content="List 1, element 1" />
<ListBoxItem Content="List 1, element 2" />
<ListBoxItem Content="List 1, element 3" />
<ListBoxItem Content="List 1, element 4" />
<ListBoxItem Content="List 1, element 5" />
<Button Content="List 1, button" />
</ListBox>
<ListBox Grid.Column="2"
PreviewMouseLeftButtonDown="ListBox_PreviewMouseLeftButtonDown"
AllowDrop="True" DragEnter="ListBox_DragEnter"
Drop="ListBox_Drop">
<ListBoxItem Content="List 2, element 1" />
<ListBoxItem Content="List 2, element 2" />
<ListBoxItem Content="List 2, element 3" />
<ListBoxItem Content="List 2, element 4" />
<ListBoxItem Content="List 2, element 5" />
<Button Content="Lista 2, button" />
</ListBox>
</Grid>
Мне нужно перетаскивать кнопки между списками, как listboxitem