为了账号安全,请及时绑定邮箱和手机立即绑定

如何单独拖动 SelectedItem 附近的列表框项目

如何单独拖动 SelectedItem 附近的列表框项目

C#
三国纷争 2021-10-24 19:36:04
我想拖动列表框选定的项目。拖动功能工作正常。我的要求是从列表框中的任何其他位置开始拖动时不应发生拖动。我已经这样做了,但这不起作用。请任何人建议我实现这一目标,        private bool IsDragging { get; set; }        private Point _startPoint { get; set; }                protected override void OnAttached()        {                                        this.AssociatedObject.PreviewMouseLeftButtonDown += AssociatedObject_PreviewMouseLeftButtonDown;            this.AssociatedObject.PreviewMouseMove += AssociatedObject_PreviewMouseMove;        }        private void AssociatedObject_PreviewMouseMove(object sender, MouseEventArgs e)        {            if (e.LeftButton == MouseButtonState.Pressed && !IsDragging)            {                Point position = e.GetPosition(null);                                      if (Math.Abs(position.X - _startPoint.X) <= SystemParameters.MinimumHorizontalDragDistance &&                    Math.Abs(position.Y - _startPoint.Y) <= SystemParameters.MinimumVerticalDragDistance)                {                    StartDrag(sender);                }            }        }        private void AssociatedObject_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)        {            _startPoint = e.GetPosition(null);        }        private void StartDrag(object sender)        {            IsDragging = true;            if (sender is ListBox)            {                var listBox = (sender as ListBox);                if (listBox != null)                {                    var selectedMember = listBox.SelectedItem;                    if (selectedMember != null)                    {                        DragDrop.DoDragDrop(listBox, selectedMember, DragDropEffects.Copy);                    }                }            }            IsDragging = false;        }
查看完整描述

1 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

这样做,通过使用System.Windows.Media.VisualTreeHelper.HitTest(this, point)它给出鼠标下的当前元素。我想它会帮助你。


private bool IsDrag { get; set; }              


        protected override void OnAttached()

        {            

            this.AssociatedObject.Drop += AssociatedObject_Drop;            

            this.AssociatedObject.PreviewMouseLeftButtonDown += AssociatedObject_PreviewMouseLeftButtonDown;

            this.AssociatedObject.PreviewMouseMove += AssociatedObject_PreviewMouseMove;


        }


        private void AssociatedObject_PreviewMouseMove(object sender, MouseEventArgs e)

        {                                  

            if (e.LeftButton == MouseButtonState.Pressed)

            {               

                if(IsDrag)

                {

                    StartDrag(sender);

                }

            }

        }


        private void AssociatedObject_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)

        {

            IsDrag = false;    


            if(sender is ListBox)

            {

                Point initialPoint = e.GetPosition((UIElement)sender);

                var histPoint = VisualTreeHelper.HitTest(sender as ListBox, initialPoint);


                if (histPoint.VisualHit != null)

                {

                    if (histPoint.VisualHit is TextBlock || histPoint.VisualHit is Border)

                    {

                        IsDrag = true;

                    }

                }

            }            

        }                   


        private void StartDrag(object sender)

        {            

            if (sender is ListBox)

            {

                var listBox = (sender as ListBox);

                if (listBox != null)

                {

                    var selectedMember = listBox.SelectedItem;

                    if (selectedMember != null)

                    {

                        DragDrop.DoDragDrop(listBox, selectedMember, DragDropEffects.Copy);

                    }

                }

            }           

        }



查看完整回答
反对 回复 2021-10-24
  • 1 回答
  • 0 关注
  • 166 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信