2012-11-21 18 views
2

以前,我試圖將一個對象從LibraryContainer拖放到ScatterView上,反之亦然,這很簡單,因爲LibraryContainerLibraryStackLibraryBar默認支持拖放事件。這與Surface 2.0 SDK提供的ShoppingCart示例中的DragDropScatterView.cs相結合非常簡單。PixelSense Surface 2.0 - 將用戶控件拖放到ScatterView上,反之亦然

現在我希望能夠將UserControl拖放到ScatterView 4上,反之亦然,即如下所示:http://goo.gl/zZIdg

從我研究的有一種方法可以做到這一點,可以在這裏找到:http://msdn.microsoft.com/en-us/library/ff727736.aspx。但是,在這裏他們不使用DragDropScatterView.cs,它採用了不同的方式。您有兩個ObservableCollections(源和目標),ScatterViewItemsSurfaceListBox

有一件事我沒有在這個例子一樣的是,可拖不真的有一個規模屬性,因爲當用戶點擊ScatterViewItemScatterViewItems,它創建了一個視覺風格和隱藏ScatterViewItem當你放下它,它會更新該座標和方向ScatterViewItem並使其可見。我決定不這樣做,因爲我想要一個正常的ScatterViewItem行爲。

我想要做的基本的東西是有,例如Label,並在側ScatterView並能夠拖動Label(製造出一種視覺光標 - 已完成),並將其放到了ScatterView,創建一個ScatterViewItem,它具有與原始Label相同的屬性。我試圖與DragDropScatterView.cs這樣做,但是當我使用一個LabeldroppingCursor.Data(在DragDropScatterView.cs)是null,我認爲這是因爲在draggedElement.DataContext(上LabelView.xaml.cs)也null,但這並不是null當我有一個SurfaceListBox

我在這裏提供了一個代碼示例:http://sdrv.ms/VDuHq5。在SurfaceWindow1.xamlTagVisualizationScatterView的容器,LabelView.xaml`TagVisualization內部被調用。

如果有人可以幫助我,我會很感激。

回答

1

我設法解決我的問題,這裏是我是如何做的簡要說明:

我搜查,發現this。然後,我將這個拖放事件與此SurfaceListBox一起使用,並將它與DragDropScatterView類組合在一起,因此每次創建新的ScatterViewItem時,我都會對我的自定義對象進行正常的ScatterView控制。使用這種方法,您還必須創建一個可視光標,即當您從SurfaceListBox拖動項目時會看到的內容。

令我困惑的是,Serge Calderara(來自MSDN Surface論壇)幫助我,是我一直試圖將這些拖放事件關聯到例如Label或甚至UserControl,但我看着事情是錯誤的。在大多數情況下,對你來說最好的解決方案是擁有一個容器,並在該容器中放置你想要的UserControls,並且只將拖放事件關聯到該容器,而不是每個單獨的項目。考慮到這一點,把事情放在一起很容易,我創建了我的UserControls並填充了SurfaceListBox(這是我的容器),並且使用了ItemTemplateSelector,我爲ScatterView(即從容器接收項目)使用了相同的選擇器。在我的對象類中,我只定義了一個變量來保存我將要使用的UserControl的哪種類型,並相應地返回DataTemplate

有了這個,我創建了一個帶有兩個自定義UserControl的SurfaceListBox,我可以拖放到ScatterView並返回。有MVVM模式的工作示例可以在這裏找到:http://sdrv.ms/10SjKaH

我希望它可以幫助別人,它幫助了我。如果您有任何問題或建議,請隨時詢問/告知。