WPF Touch-根据操纵器数量选择操纵容器

时间:2018-07-17 15:14:07

标签: c# wpf touch

我有一个WPF Touch应用程序(MS Surface,VS 2017,.NET 4.7),在画布上显示了图像上方的许多简单形状(线,矩形,圆)。我在选择要触摸的ManipulationContainer时遇到麻烦。

我大致是这样的:

<ScrollViewer x:Name="MyViewer"  
              ManipulationStarting="Viewer_ManipulationStarting">
    <Canvas x:Name="MyCanvas">
        <Image x:Name="MyImage" Source={Binding MyImageSource}"/>
        <ItemsControl x:Name="MyShapes" ItemsSource="{Binding MyShapes}"/>
    </Canvas>
</ScrollViewer>

我想让我的用户通过触摸来做两种不同的事情。

  1. 用一根手指可以绘制新形状(相对于画布)
  2. 用两根手指可以缩放整个画布(相对于scrollviewer)

因此,如果用户正在绘制新形状,则ManipulationContainer必须为“ MyCanvas”。但是,如果用户要缩放整个场景,则ManipulationContainer必须为“ MyViewer”(因为在这种情况下,我要更改整个画布的LayoutTransform)。

因此,我需要(似乎)要从两个不同的操作容器之一中进行选择,具体取决于正在发生的操作。但是我似乎不知道如何。下面是我在其中选择容器的地方(不起作用)。在ManipulationStarting处理程序中。

private void Scene_ManipulationStarting(object sender, ManipulationStartingEventArgs e)
{
    // If zooming, container is the parent viewer.  Otherwise it's
    // drawing a shape relative to the canvas.  

    if (e.Manipulators.Count() >= 2)
        e.ManipulationContainer = MyViewer;  // Zooming whole canvas
    else
        e.ManipulationContainer = MyCanvas;  // Drawing on canvas


    e.Handled               = true;
}

您可能已经猜到了,当我第一次得到这个东西时,我总是只有一个操纵器。用户极不可能完全同时用两个手指进行第一次触摸。因此,我的代码始终认为我正在绘制形状。

直到后来,在ManipulationDelta中,我开始获得多个操纵器。但是选择一个容器为时已晚。它已经被选中。如果我检查机械手的数量,那么我的坐标,增量和原点都与我要移动的物体有关。它使缩放范围到处都有。

我不知道该怎么办。我必须让用户随时缩放,因此无法强迫他们选择“缩放工具”。

我确定我缺少一些简单的东西,但是我不知道它是什么,所以我想避免出现小巷。有什么建议么?

0 个答案:

没有答案