我有一个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>
我想让我的用户通过触摸来做两种不同的事情。
因此,如果用户正在绘制新形状,则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中,我开始获得多个操纵器。但是选择一个容器为时已晚。它已经被选中。如果我检查机械手的数量,那么我的坐标,增量和原点都与我要移动的物体有关。它使缩放范围到处都有。
我不知道该怎么办。我必须让用户随时缩放,因此无法强迫他们选择“缩放工具”。
我确定我缺少一些简单的东西,但是我不知道它是什么,所以我想避免出现小巷。有什么建议么?