Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 防拖;滚动时下降_C#_Wpf_Listview_Drag And Drop_Scroll - Fatal编程技术网

C# 防拖;滚动时下降

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事件:

我正在做一个Wpf项目,但现在我被一个
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);
    }
}