同一页面上的两个重新排序列表框,防止用户在两个页面之间进行拖放

蕾妮

我有一个WPF c#应用程序,该应用程序具有一个窗口,该窗口具有彼此相邻的两个“重新排序”列表框。我使用此链接中的示例制作了列表框用户控件。不幸的是,这允许用户从一个框拖动并放入另一个框。我如何确保不会发生这种情况?

这是我的代码:

    public void setItems(List<string> values){
        _items = new ObservableCollection<Item>();
        foreach (string s in values)
        {
            _items.Add(new Item(s));
        }

        listBox.DisplayMemberPath = "Name";
        listBox.ItemsSource = _items;

        listBox.PreviewMouseMove += ListBox_PreviewMouseMove;

        var style = new Style(typeof(ListBoxItem));
        style.Setters.Add(new Setter(ListBoxItem.AllowDropProperty, true));
        style.Setters.Add(
            new EventSetter(
                ListBoxItem.PreviewMouseLeftButtonDownEvent,
                new MouseButtonEventHandler(ListBoxItem_PreviewMouseLeftButtonDown)));
        style.Setters.Add(
                new EventSetter(
                    ListBoxItem.DropEvent,
                    new DragEventHandler(ListBoxItem_Drop)));
        listBox.ItemContainerStyle = style;
    }


    private void ListBox_PreviewMouseMove(object sender, MouseEventArgs e)
    {

            Point point = e.GetPosition(null);
            Vector diff = _dragStartPoint - point;
            if (e.LeftButton == MouseButtonState.Pressed &&
                (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance ||
                    Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance))
            {
                var lb = sender as ListBox;
                var lbi = FindVisualParent<ListBoxItem>(((DependencyObject)e.OriginalSource));
                if (lbi != null)
                {
                    DragDrop.DoDragDrop(lbi, lbi.DataContext, DragDropEffects.Move);
                }
            }

    }


    private void ListBoxItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        _dragStartPoint = e.GetPosition(null);
    }


    private void ListBoxItem_Drop(object sender, DragEventArgs e)
    {
        if (sender is ListBoxItem)
        {
            var source = e.Data.GetData(typeof(Item)) as Item;
            var target = ((ListBoxItem)(sender)).DataContext as Item;


                int sourceIndex = listBox.Items.IndexOf(source);
                int targetIndex = listBox.Items.IndexOf(target);

                Debug.WriteLine("Target: " + targetIndex.ToString());

                Move(source, sourceIndex, targetIndex);

        }
    }


    private void Move(Item source, int sourceIndex, int targetIndex)
    {
        if (sourceIndex < targetIndex)
        {
            _items.Insert(targetIndex + 1, source);
            _items.RemoveAt(sourceIndex);
        }
        else
        {
            int removeIndex = sourceIndex + 1;
            if (_items.Count + 1 > removeIndex)
            {
                _items.Insert(targetIndex, source);
                _items.RemoveAt(removeIndex);
            }
        }
    }
}
蕾妮

我想通了,以防其他人遇到类似的问题...

我将移动功能更改为以下内容:

 private void Move(Item source, int sourceIndex, int targetIndex)
        {
            IList<Item> prevItems = _items;

            try
            {
                _items.RemoveAt(sourceIndex);
                _items.Insert(targetIndex, source);

            }
            catch(ArgumentOutOfRangeException)
            {
                //User doesn't need to be notified about this. It just means that they dragged out of the box they were ordering. 
                //The application does not need to be stopped when this happens.
                _items = prevItems;
                Debug.WriteLine("User tried to drag between boxes.. Order of boxes were not changed. ");

            }
        }

我意识到,如果我先删除项目,则不必担心更改目标或根据sourceIndex相对于targetIndex的位置删除索引。相反,我可以将其包装在try catch中并查找ArgumentOutOfRangeException,如果用户尝试在它们之间拖放,则会发生这种情况。如果发生这种情况,我会将框重置为之前的项目。

据我所知,此解决方案效果很好...可能有一种更简单的方法可以解决此问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在同一页面上放置两个幻灯片框?

来自分类Dev

如何为同一页面上的两个表单定义唯一的validateForm?

来自分类Dev

Angular 2,在同一页面上运行的两个应用程序之间的通信

来自分类Dev

在同一页面上的两个输入(差异ID)上的两个自动完成

来自分类Dev

在同一页面上的两个输入(差异ID)上的两个自动完成

来自分类Dev

如何在同一页面上呈现两个菜单?

来自分类Dev

是否可以在同一页面上运行两个不同版本的ReactJS?

来自分类Dev

动态填充同一页面上其他两个选择的选择

来自分类Dev

同一页面上的两个Angular2组件

来自分类Dev

Apex-同一页面上的两个按钮,分支到不同的位置

来自分类Dev

React Router问题:React在同一页面上渲染两个组件

来自分类Dev

使用react-hook-form在同一页面上添加两个表单

来自分类Dev

在ChakraUI中使用useDisclosure()无法在同一页面上使用两个模式

来自分类Dev

提交在同一页面上呈现的两个不相关的表单

来自分类Dev

Inno Setup禁用同一页面上的两个按钮

来自分类Dev

我希望同一页面上的两个Flexslider以不同的速度运行

来自分类Dev

验证同一页面上的两个表单

来自分类Dev

动态填充同一页面上其他两个选择的选择

来自分类Dev

同一页面上的两个不同的Yammer共享按钮

来自分类Dev

Angular两个应用程序在同一页面上

来自分类Dev

Python请求-在同一页面上发送两个请求?

来自分类Dev

同一页面上的两个圆环图

来自分类Dev

同一页面上的两个 Promise.all()

来自分类Dev

在同一页面上使用两个下拉列表点净MVC剃须刀

来自分类Dev

在同一页面上创建同一地图的两个副本

来自分类Dev

如何将具有不同模块的两个图表放在同一页面上?

来自分类Dev

同一页面上两个不同控制器的Angularjs双向绑定字段

来自分类Dev

在同一页面上的两个对象上的Rails will_paginate不起作用

来自分类Dev

在同一页面上的两个对象上的Rails will_paginate不起作用

Related 相关文章

  1. 1

    如何在同一页面上放置两个幻灯片框?

  2. 2

    如何为同一页面上的两个表单定义唯一的validateForm?

  3. 3

    Angular 2,在同一页面上运行的两个应用程序之间的通信

  4. 4

    在同一页面上的两个输入(差异ID)上的两个自动完成

  5. 5

    在同一页面上的两个输入(差异ID)上的两个自动完成

  6. 6

    如何在同一页面上呈现两个菜单?

  7. 7

    是否可以在同一页面上运行两个不同版本的ReactJS?

  8. 8

    动态填充同一页面上其他两个选择的选择

  9. 9

    同一页面上的两个Angular2组件

  10. 10

    Apex-同一页面上的两个按钮,分支到不同的位置

  11. 11

    React Router问题:React在同一页面上渲染两个组件

  12. 12

    使用react-hook-form在同一页面上添加两个表单

  13. 13

    在ChakraUI中使用useDisclosure()无法在同一页面上使用两个模式

  14. 14

    提交在同一页面上呈现的两个不相关的表单

  15. 15

    Inno Setup禁用同一页面上的两个按钮

  16. 16

    我希望同一页面上的两个Flexslider以不同的速度运行

  17. 17

    验证同一页面上的两个表单

  18. 18

    动态填充同一页面上其他两个选择的选择

  19. 19

    同一页面上的两个不同的Yammer共享按钮

  20. 20

    Angular两个应用程序在同一页面上

  21. 21

    Python请求-在同一页面上发送两个请求?

  22. 22

    同一页面上的两个圆环图

  23. 23

    同一页面上的两个 Promise.all()

  24. 24

    在同一页面上使用两个下拉列表点净MVC剃须刀

  25. 25

    在同一页面上创建同一地图的两个副本

  26. 26

    如何将具有不同模块的两个图表放在同一页面上?

  27. 27

    同一页面上两个不同控制器的Angularjs双向绑定字段

  28. 28

    在同一页面上的两个对象上的Rails will_paginate不起作用

  29. 29

    在同一页面上的两个对象上的Rails will_paginate不起作用

热门标签

归档