2

以前我尝试将对象从 a 拖放LibraryContainer到 a 上ScatterView,反之亦然,这很简单,默认情况下LibraryContainer,LibraryStackLibraryBar支持拖放事件。结合DragDropScatterView.csSurface 2.0 SDK 提供的 ShoppingCart 示例非常简单。

现在我希望能够将 a 拖放UserControlScatterView4 上,反之亦然,即像这样:http: //goo.gl/zZIdg

根据我的研究,有一种方法可以做到这一点,可以在这里找到:http: //msdn.microsoft.com/en-us/library/ff727736.aspx。但是,这里他们不使用DragDropScatterView.cs,它以不同的方式完成。您有两个ObservableCollections(一个源和一个目标), theScatterViewItemsSurfaceListBox.

在这个示例中我不喜欢的一件事是,ScatterViewItems可以拖动的 并没有真正的缩放属性,因为当用户单击 时ScatterViewItem,它会创建视觉样式并隐藏ScatterViewItem并且当您放下它时,它会更新坐标和方向,ScatterViewItem并使其可见。我决定不走这条路,因为我想要一个正常的ScatterViewItem行为。

我想要做的基本事情是拥有,例如 a Label,并且在 a 侧,ScatterView并且能够拖动它Label(创建一个视觉光标 - 已经完成)并将其放在 上ScatterView,创建ScatterViewItem具有相同属性的a原创Label。我尝试使用 the 来执行此操作,DragDropScatterView.cs但是当我使用Labelmy droppingCursor.Data(on the DragDropScatterView.cs) isnull时,我认为发生这种情况是因为draggedElement.DataContext(on the LabelView.xaml.cs) is also null,但是null当我使用SurfaceListBox.

我在这里提供了一个代码示例:http: //sdrv.ms/VDuHq5。在SurfaceWindow1.xaml里面有TagVisualization和 的容器,在ScatterView里面LabelView.xaml调用了`TagVisualization

如果有人可以帮助我,我将不胜感激。

4

1 回答 1

1

我设法解决了我的问题,这里简要解释一下我是如何做到的:

我搜索并找到了这个。然后我将它SurfaceListBox与这些拖放事件一起使用,并将其与DragDropScatterView类结合起来,因此每次ScatterViewItem创建新对象时,我都会对我的自定义对象进行正常ScatterView控制。使用这种方法,您还必须创建一个视觉光标,即当您从SurfaceListBox.

令我困惑的是 Serge Calderara(来自 MSDN Surface 论坛)帮助我解决的问题是,我一直试图将这些拖放事件与一个Label例子或一个UserControl偶数相关联,但我看错了方式。在大多数情况下,对您来说最好的解决方案是拥有一个容器,在该容器中放置UserControls您想要的,并且您只将拖放事件与该容器相关联,而不是与每个单独的项目相关联。考虑到这一点,把东西放在一起很容易,我创建了我的UserControls并用 an 填充了SurfaceListBox(这是我的容器),ItemTemplateSelector我使用了相同的 Selector ScatterView(即从容器中接收项目)。在我的对象类中,我刚刚定义了一个变量来保存哪种类型UserControl我将拥有并DataTemplate相应地返回。

有了这个,我用两个自定义的用户控件创建了一个SurfaceListBox,我可以将它们拖放到 aScatterView和返回。可以在此处找到具有 MVVM 模式的工作示例:http: //sdrv.ms/10SjKaH

我希望它可以帮助别人,它帮助了我。如果您有任何问题或建议,请随时询问/告知。

于 2012-11-27T11:54:23.633 回答