C# 防拖;滚动时下降
我正在做一个Wpf项目,但现在我被一个C# 防拖;滚动时下降,c#,wpf,listview,drag-and-drop,scroll,C#,Wpf,Listview,Drag And Drop,Scroll,我正在做一个Wpf项目,但现在我被一个ListView问题绊住了 事实证明,我在ListView上实现了一个运行良好的拖放功能。当我尝试向下或向上滚动时,问题就出现了。通过这样做,拖放功能被激活,防止我继续滚动 我发现这表明我们需要将控件附加到ScrollChanged事件 <ListView ScrollViewer.ScrollChanged="listView1_ScrollChanged"... 提前感谢。如果您未处于MouseDown事件中,您可以阻止MouseMove事件:
ListView
问题绊住了
事实证明,我在ListView上实现了一个运行良好的拖放功能。当我尝试向下或向上滚动时,问题就出现了。通过这样做,拖放
功能被激活,防止我继续滚动
我发现这表明我们需要将控件附加到ScrollChanged
事件
<ListView ScrollViewer.ScrollChanged="listView1_ScrollChanged"...
提前感谢。如果您未处于MouseDown事件中,您可以阻止MouseMove事件:
bool stopDrag = true;
private void listView1_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
// Store the mouse position
startPoint = e.GetPosition(null);
stopDrag = false;
}
private void listView1_MouseMove(object sender, MouseEventArgs e)
{
if(stopDrag)
return;
// Get the current mouse position
Point mousePos = e.GetPosition(null);
Vector diff = startPoint - mousePos;
if (e.LeftButton == MouseButtonState.Pressed &&
(Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance ||
Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance))
{
// Get the dragged ListViewItem
ListView listView = sender as ListView;
// Get items to drag
var a = listView.SelectedItems;
// Initialize the drag & drop operation
DataObject dragData = new DataObject("myFormat", a);
DragDrop.DoDragDrop(listView, dragData, DragDropEffects.Move);
}
}
private void listView1_MouseUp(...)
{
stopDrag = true;
}
这应该行得通,我是在浏览器中写的,所以如果我做错了什么,请原谅我的格式化,我希望您能理解。我使用一种简单的方法来确认是否使用系统参数确认拖动操作。最小水平拖动距离
和系统参数。最小垂直拖动距离
,用于此目的:
private bool IsDragConfirmed(Point point)
{
bool horizontalMovement = Math.Abs(point.X - dragStartPosition.X) >
SystemParameters.MinimumHorizontalDragDistance;
bool verticalMovement = Math.Abs(point.Y - dragStartPosition.Y) >
SystemParameters.MinimumVerticalDragDistance;
return (horizontalMovement | verticalMovement);
}
它在PreviewMouseMove
事件中调用。。。以下是一个简化的示例:
private void DragSourcePreviewMouseMove(object sender, MouseEventArgs e)
{
if (isMouseDown && IsDragConfirmed(e.GetPosition(sender as ListBox)))
{
// Start your drag operation here
}
}
我得到了与下面答案相同的问题和来源。
我已经决定,如果鼠标位置不在listview项(rect 0,0,lv.width-scroll.width,lv.height-scroll.height)上,就防止拖动
所以我有一个“allowdrag”标志,当PreviewMouseLeftButtonDown运行时,如果鼠标指针在必需的rect上,则该标志变为真
VB.NET
Private allowdrag As Boolean
Private Sub lv_PreviewMouseLeftButtonDown(sender As Object, e As MouseButtonEventArgs) Handles lvAttributesDefault.PreviewMouseLeftButtonDown
Dim listView As ListView = TryCast(sender, ListView)
allowdrag = e.GetPosition(sender).X < listView.ActualWidth - SystemParameters.VerticalScrollBarWidth And e.GetPosition(sender).Y < listView.ActualHeight - SystemParameters.HorizontalScrollBarHeight
End Sub
Private Sub lv_MouseMove(sender As Object, e As MouseEventArgs) Handles lvAttributesDefault.MouseMove
Dim listView As ListView = TryCast(sender, ListView)
If e.LeftButton = MouseButtonState.Pressed And listView.SelectedItem IsNot Nothing And allowdrag Then
Dim obj As clsAttribute = CType(listView.SelectedItem, clsAttribute)
Dim dragData As New DataObject("clsAttribute", obj)
DragDrop.DoDragDrop(listView, dragData, DragDropEffects.Copy)
End If
End Sub
Private allowdrag作为布尔值
私有子lv_PreviewMouseLeftButtonDown(发送者作为对象,e作为鼠标按钮ventargs)处理lvAttributesDefault.PreviewMouseLeftButtonDown
将listView设置为listView=TryCast(发送方,listView)
allowdrag=e.GetPosition(发送方).X
C#(电传码转换器)
private bool allowdrag;
私有void lv_PreviewMouseLeftButtonDown(对象发送器,鼠标按钮ventargs e)
{
ListView ListView=发件人作为ListView;
allowdrag=e.GetPosition(发送方)。X
PS.ClsaAttribute是我的自定义类。这个
listview已绑定到ObservableCollection(属于CLSATAttribute)如果您能告诉我们您是如何实现拖放功能的。@Georgi it Code Adddhi,我刚刚尝试过,但它不起作用,它一直以同样的方式运行:(理论上,如果你调试它并给我一些额外的信息,它应该可以工作。)我这样做了,这里的问题是当我按下鼠标左键时,stopDrag
变成false
,因此,当它得到listView1\u MouseMove
方法时,条件if(stopDrag)return
不满足。我可以反转条件,但这样做,拖放功能就永远不会启动,因为我的拖放功能是在获取鼠标位置的PreviewMouseLeftButtonDown
事件中启动的
Private allowdrag As Boolean
Private Sub lv_PreviewMouseLeftButtonDown(sender As Object, e As MouseButtonEventArgs) Handles lvAttributesDefault.PreviewMouseLeftButtonDown
Dim listView As ListView = TryCast(sender, ListView)
allowdrag = e.GetPosition(sender).X < listView.ActualWidth - SystemParameters.VerticalScrollBarWidth And e.GetPosition(sender).Y < listView.ActualHeight - SystemParameters.HorizontalScrollBarHeight
End Sub
Private Sub lv_MouseMove(sender As Object, e As MouseEventArgs) Handles lvAttributesDefault.MouseMove
Dim listView As ListView = TryCast(sender, ListView)
If e.LeftButton = MouseButtonState.Pressed And listView.SelectedItem IsNot Nothing And allowdrag Then
Dim obj As clsAttribute = CType(listView.SelectedItem, clsAttribute)
Dim dragData As New DataObject("clsAttribute", obj)
DragDrop.DoDragDrop(listView, dragData, DragDropEffects.Copy)
End If
End Sub
private bool allowdrag;
private void lv_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
ListView listView = sender as ListView;
allowdrag = e.GetPosition(sender).X < listView.ActualWidth - SystemParameters.VerticalScrollBarWidth & e.GetPosition(sender).Y < listView.ActualHeight - SystemParameters.HorizontalScrollBarHeight;
}
private void lv_MouseMove(object sender, MouseEventArgs e)
{
ListView listView = sender as ListView;
if (e.LeftButton == MouseButtonState.Pressed & listView.SelectedItem != null & allowdrag) {
clsAttribute obj = (clsAttribute)listView.SelectedItem;
DataObject dragData = new DataObject("clsAttribute", obj);
DragDrop.DoDragDrop(listView, dragData, DragDropEffects.Copy);
}
}