使用MVVM将Windows从列表拖放到Windows Phone上的canvas
我有一个应用程序,用户可以使用从列表中选择的元素来操作,这是通过单击列表元素并将元素添加到canvas来完成的。
在用户测试应用程序期间。 人们发现它不是直观的,因为他们想要拖放。 我找到了几个链接,描述了如何为WPF实现这一点,即不适用于Windows Phone。
试图从msdn项目复制代码我最终遇到了一些问题,我无法从DragEventArgs获得有关元素的相同信息。
所以我想要完成的是用户可以将列表框中的元素拖到canvas上。 我已尝试过Viewmodel但在DragEventArgs中缺少信息,如e.Data和e.Source。 我也尝试过在xaml.cs文件中没有成功。
任何帮助表示赞赏。
理念
- 在选中元素时创建元素的副本,
- 将副本添加为canvas的子项,
- 设置副本的x,y坐标以匹配所选元素的位置,
- CaptureMouse()在副本上。
当然在Windows Phone上操作delta应该用来移动它而不是捕获鼠标。 在Click事件添加元素后,我可以在Canvas中拖动一个元素。 但我似乎无法从列表中拖出工作。 上面的要点是我已经尝试但现在没有任何成功的方法。
没有样本或任何东西来实现这一点。 我已经联系过msdn和微软的人,没有任何成功。 我正在尝试建立一个样本,但到目前为止还没有成功。
编辑
那么我做了什么来解决这个问题:首先是图形问题
用于将元素从列表框拖动到Canvas的单词。 所以我做了我在这个列表框中添加了处理程序,在视图中:
MyLB.AddHandler(UIElement.ManipulationStartedEvent, new EventHandler(MyLB_ManiStarted), true); MyLB.AddHandler(UIElement.ManipulationDeltaEvent, new EventHandler(MyLB_ManiDelta), true); MyLB.AddHandler(UIElement.ManipulationCompletedEvent, new EventHandler(MyLB_ManiCompleted), true);
此外,我添加了一个额外的canvas,此后称为Canvas2,它在ListBox和Canvas后面延伸。 两个canvas’之间的唯一区别是大小,否则它们具有相同的itemscontrol但具有绑定到canvas的不同observablecollections’。
- 在ManipulationStarted中,我找到了元素并在Canvas2的observablecollection中添加了一个新元素。 此外,我将Canvas2的zindex设置为正面。
- 然后我点击delta事件在Canvas2上移动元素
- 在ManipulationCompleted中我检查元素是否在第一个Canvas的边界内。
- 然后我从Canvas2中删除它,并使用
Canvas.SetIndex(UIElement, zIndex)
将Canvas2移动到后面 - 根据边界检入(3.)然后我将它添加到第一个canvas。 一切正常。
但我不使用dropfunction或相关事件,因为它似乎没有帮助,因为缺少可拖动元素。 但这工作:)
WP7上的Silverlight不支持拖放 – 至少不完全支持。 它支持拖动而不是拖放。
无论如何你可以尝试以下例子,
WP7拖放示例