【问题标题】:Recreating a ManipulationStarting event programmatically以编程方式重新创建 ManipulationStarting 事件
【发布时间】:2015-02-03 03:51:34
【问题描述】:

我有一个画布。在这个画布中(假设在右边)我有一个 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;
}

【问题讨论】:

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


    【解决方案1】:

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

    首先,我推荐 Bea Stollnitz 在 Drag&Drop 上的 great article

    另外我建议你把一个ItemsControl而不是StackPanel作为拖拽源,让Canvas成为ListBox的ItemsPanel。这样一来,您就可以直观地在 StackPanel 和 Canvas 之间进行分级和拖放,而从逻辑上讲,它将位于 ItemsControl 和 ListBox 之间。

    有一个example 的 ListBox 以 Canvas 作为 ItemsPanel。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多