以前我试图将一个对象从LibraryContainer拖放到ScatterView上,反之亦然,这很简单,因为LibraryContainer、LibraryStack和LibraryBar默认都支持拖放事件。再加上Surface2.0SDK提供的ShoppingCart示例中的DragDropScatterView.cs,就非常简单了。
现在,我希望能够将UserControl拖放到ScatterView4上,反之亦然,也就是像这样:http://goo.gl/zZIdg。
根据我的研究,有一种方法可以做到这一点,可以在这里找到:http://msdn.microsoft.com/en-us/library/ff727736.aspx。然而,在这里他们没有使用DragDropScatterView.cs,它是以一种不同的方式完成的。您有两个ObservableCollections (源和目标),即ScatterViewItems和SurfaceListBox。
在这个例子中,我不喜欢的一件事是,可以拖动的ScatterViewItems实际上没有缩放属性,因为当用户单击ScatterViewItem时,它会创建一个视觉样式并隐藏ScatterViewItem,而当您拖放它时,它会更新该ScatterViewItem的坐标和方向并使其可见。我决定不走这条路,因为我想要一个正常的ScatterViewItem行为。
我想要做的基本事情是,例如,有一个Label,在边上有一个ScatterView,并且能够拖动该Label (创建一个可视光标--已经完成)并将其放在ScatterView上,创建一个与原始ScatterViewItem具有相同属性的Label。我试过用DragDropScatterView.cs这样做,但当我使用Label时,我的droppingCursor.Data (在DragDropScatterView.cs上)是null,我认为这是因为draggedElement.DataContext (在LabelView.xaml.cs上)也是null,但是当我有一个<代码>D34时,这不是null。
我在这里提供了一个代码示例:http://sdrv.ms/VDuHq5。在SurfaceWindow1.xaml中有TagVisualization和ScatterView的容器,LabelView.xaml在`TagVisualization中调用。
如果有人能在这方面帮助我,我将不胜感激。
发布于 2012-11-27 19:54:24
我设法解决了我的问题,下面简要解释一下我是如何做到的:
我找到了this。然后,我将此SurfaceListBox与这些拖放事件一起使用,并将其与DragDropScatterView类组合在一起,这样每次创建新的ScatterViewItem时,我的自定义对象就会有一个普通的ScatterView控件。使用此方法,您还必须创建一个可视光标,即当您从SurfaceListBox中拖动项目时将看到的光标。
令我困惑的是,Serge Calderara (来自MSDN Surface Forum)帮助我解决的问题是,我一直试图将这些拖放事件与Label,甚至是UserControl联系起来,但我看错了方向。在大多数情况下,最好的解决方案是拥有一个容器,在该容器中放置所需的UserControls,并且只将拖放事件与该容器相关联,而不是与每个单独的项相关联。考虑到这一点,将它们放在一起相当容易,我创建了我的UserControls并用ItemTemplateSelector填充了SurfaceListBox (这是我的容器),我对ScatterView使用了相同的选择器(即从容器接收项)。在我的object类中,我只是定义了一个变量来保存我将使用的UserControl类型,并相应地返回DataTemplate。
在此基础上,我创建了一个具有两个自定义UserControls的SurfaceListBox,我可以将它们拖放到ScatterView中,然后再拖回。可以在这里找到一个使用MVVM模式的工作示例:http://sdrv.ms/10SjKaH。
我希望它能帮助其他人,它也帮助了我。如果您有任何问题或建议,请随时询问/告知。
https://stackoverflow.com/questions/13492598
复制相似问题