代码之家  ›  专栏  ›  技术社区  ›  xanadont

在Silverlight拖放中获取放置索引

  •  4
  • xanadont  · 技术社区  · 14 年前

    这个 article 显示如何在放置事件上实现复制操作。我也想这样做,但我希望我的已删除项根据其在UI上的位置显示在集合中。因此,我需要StartIndex,就像当一个可观察的集合更改时,在NotifyCollectionChangedEventArgs上一样。在本文中,您将看到最终获得一个SelectionCollection对象,该对象的项具有Index属性。但不幸的是,这是源集合的索引(在其中选择了它),而不是目标集合的索引(在其中删除了它)。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Mike Fuchs Asif    13 年前

    好吧,这很难看,但我没有找到另一个办法,不是我自己,也不是通过搜索网络寻找答案。一定是微软的另一个最后期限,阻止了相当明显的功能被包括在内。。。

    基本上,下面的方法都是手动完成的,获取放置位置并检查它是否有listbox项用作索引引用。

    private void ListBoxDragDropTarget_Drop(object sender, Microsoft.Windows.DragEventArgs e)
    {
        // only valid for copying
        if (e.Effects.HasFlag(DragDropEffects.Copy))
        {
            SelectionCollection selections = ((ItemDragEventArgs)e.Data.GetData("System.Windows.Controls.ItemDragEventArgs")).Data as SelectionCollection;
            int? index = null;
    
            if (selections != null)
            {
                Point p1 = e.GetPosition(this.LayoutRoot); // get drop position relative to layout root
                var elements = VisualTreeHelper.FindElementsInHostCoordinates(p1, this.LayoutRoot); // get ui elements at drop location
    
                foreach (var dataItem in this.lbxConfiguration.Items) // iteration over data items
                {
                    // get listbox item from data item
                    ListBoxItem lbxItem = this.lbxConfiguration.ItemContainerGenerator.ContainerFromItem(dataItem) as ListBoxItem;
    
                    // find listbox item that contains drop location
                    if (elements.Contains(lbxItem))
                    {
                        Point p2 = e.GetPosition(lbxItem); // get drop position relative to listbox item
                        index = this.lbxConfiguration.Items.IndexOf(dataItem); // new item will be inserted immediately before listbox item
                        if (p2.Y > lbxItem.ActualHeight / 2)
                            index += 1; // new item will be inserted after listbox item (drop location was in bottom half of listbox item)
    
                        break;
                    }
                }
    
                if (index != null)
                {
                    foreach (var selection in selections)
                    {
                        // adding a new item to the listbox - adjust this to your model
                        (lbxConfiguration.ItemsSource as IList<ViewItem>).Insert((int)index, (selection.Item as ViewItem).Clone());
                    }
                }
            }
        }
    }