列表框单击并拖动
本文关键字:拖动 单击 列表 | 更新日期: 2023-09-27 18:00:55
我有一个Listbox、一个MainControl和4个PreviewControls。我希望当我从列表框中单击一个项目时,主控件会更改(发生这种情况(。但我想在listboxitems中添加一个拖动行为,这样我就可以将listboxitem拖动到其中一个previewControls中。我尝试过这样做,但当我尝试拖动列表框项目时,selectionchanged事件总是被触发。
所以我希望当我按下鼠标左键并移动列表框项目时,拖动。当Click或MouseLeftUp(选择已更改(发生时,MainControl会发生更改。
我试过了,但PreviewMouseLeftButtonDown事件再次发生,其他事件没有执行。
private void lstCameras_PreviewMouseLeftButtonDown_1(object sender, MouseButtonEventArgs e)
{
startPoint = e.GetPosition(null);
if (!Test) e.Handled = true;
else
{
Test = false;
}
Console.WriteLine("lstCameras_PreviewMouseLeftButtonDown_1 Handled = " + e.Handled);
}
private void lstCameras_PreviewMouseUp_1(object sender, MouseButtonEventArgs e)
{
Console.WriteLine("lstCameras_MouseUp_1");
if (!Test)
{
Test = true;
lstCameras.RaiseEvent(new MouseButtonEventArgs(Mouse.PrimaryDevice, Environment.TickCount, MouseButton.Left) { RoutedEvent = ListBox.PreviewMouseLeftButtonDownEvent });
}
else
{
Test = false;
}
Console.WriteLine("end lstCameras_MouseUp_1 Test = " + Test);
}
不知道这是否是最好的方法,但它确实有效。
private object GetDataFromListBox(ListBox source, Point point)
{
DependencyObject element = source.InputHitTest(point) as DependencyObject;
if (element != null)
{
object data = DependencyProperty.UnsetValue;
while (data == DependencyProperty.UnsetValue)
{
data = source.ItemContainerGenerator.ItemFromContainer(element);
if (data == DependencyProperty.UnsetValue)
{
element = (DependencyObject)VisualTreeHelper.GetParent(element);
}
if (element == source)
{
return null;
}
}
if (data != DependencyProperty.UnsetValue)
{
return data;
}
}
return null;
}
private void lstCameras_PreviewMouseMove_1(object sender, MouseEventArgs e)
{
Point mousePos = e.GetPosition(null);
Vector diff = startPoint - mousePos;
if (e.LeftButton == MouseButtonState.Pressed && this.DataContext != null &&
(Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance ||
Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance))
{
ListBox parent = (ListBox)sender;
Item data = (Item)GetDataFromListBox(parent, e.GetPosition(parent));
if (data != null)
{
DataObject dragData = new DataObject(typeof(Item), data);
DragDrop.DoDragDrop(this, dragData, DragDropEffects.All);
}
}
}
private void lstCameras_PreviewMouseDown_1(object sender, MouseButtonEventArgs e)
{
ListBox parent = (ListBox)sender;
Item data = (Item)GetDataFromListBox(parent, e.GetPosition(parent));
if (data != null )
{
startPoint = e.GetPosition(null);
e.Handled = true;
}
}
private void lstCameras_PreviewMouseUp_1(object sender, MouseButtonEventArgs e)
{
ListBox parent = (ListBox)sender;
Item data = (Item)GetDataFromListBox(parent, e.GetPosition(parent));
if (data != null)
{
lstCameras.SelectedItem = data;
}
}
将链接到UserControl的事件更改为mouseup,而不是单击。这样,只有完全单击才会激发更改用户控件的代码,并且拖动将不受阻碍地进行。以下是MSDN关于MouseUp事件的链接:(