以编程方式重新创建ManipulationStarting事件

时间:2015-02-03 03:51:34

标签: c# wpf drag-and-drop touch draggable

我有画布。在这个画布中(让我们说向右)我有一个StackPanel,包含在ScrollViewer中,包含图像。我希望用户能够从StackPanel中抓取图像并将其拖动到Canvas中的任何位置。

我可以从StackPanel中删除所选图像,并在视觉上将其添加到Canvas中完全相同的位置,但这会结束操作事件,导致用户必须再次抓取图像才能继续移动它。我试图通过尝试创建一个新的ManipulationStarting事件来解决这个问题,但我无法正确完成它。我的代码如下......

var element = e.Source as System.Windows.Controls.Image;
var sp = element.Parent as StackPanel;

if (sp != null)
{
    GeneralTransform transform = element.TransformToAncestor(this);
    System.Windows.Point TouchEndPoint = transform.Transform(new System.Windows.Point(0, 0));

    Canvas.SetTop(element, TouchEndPoint.Y);
    Canvas.SetLeft(element, TouchEndPoint.X);
    Grid.SetZIndex(element, 20);
    //element.Tag = "Image on Canvas";
    element.Opacity = 1;

    sp.Children.Remove(element);
    _anvas.Children.Add(element);

    var args = new RoutedEventArgs(System.Windows.Controls.Image.ManipulationStartingEvent, element);

    element.RaiseEvent(args);
}
else
{
    e.ManipulationContainer = _canvas;
}

1 个答案:

答案 0 :(得分:0)

如果我理解正确,那么您正在尝试在堆栈面板和画布之间实现拖放。

首先,我推荐Bea Stollnitz的great article关于Drag& Drop。

此外,我建议您将ItemsControl而不是StackPanel作为拖动源,并使Canvas成为ListBox的ItemsPanel。这样你就可以在视觉上在StackPanel和Canvas之间进行渐变,而在逻辑上它将在ItemsControl和ListBox之间。

ListBox有example,Canvas为ItemsPanel。