我正在努力使触摸事件和操作在 WPF 项目中正常工作。我有一个包含图片的ScrollViewer,我想使用滑动手势水平和垂直滚动。此外,我想在捏合手势的中心放大/缩小。下面的代码实现了我的愿望,但是存在以下问题:
有时滚动会很滞后;
滚动在第一次尝试时不起作用,只有在第二次尝试相同的手势时才会起作用;
第一次尝试时放大/缩小不起作用,仅当第二次尝试相同手势时才起作用。
我启用了IsManipulationEnabled并实现了放大/缩小功能的代码。但是,我无法将其与滚动功能结合起来(仅通过在ScrollViewer中设置PanningMode)。因此,我创建了一个继承自Image控件的自定义控件,并覆盖了OnTouchDown和OnTouchUp事件处理程序。基本上,我在这些覆盖的处理程序中所做的就是计算屏幕上的触摸次数并启用/禁用操作。我还尝试设置ScrollViewer的PanningMode,但它没有成功。
下面是 XAML:
<Grid>
<ScrollViewer
x:Name="ScrollViewerParent"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto"
PanningMode="Both">
<local:CustomImage
x:Name="MainImage"
Source="{Binding Source={x:Static local:Constants.ImagePath}}"
IsManipulationEnabled="True"
ManipulationStarting="MainImage_ManipulationStarting"
ManipulationDelta="MainImage_ManipulationDelta">
</local:CustomImage>
</ScrollViewer>
</Grid>
这是背后的代码:
public partial class MainWindow : Window
{
private void MainImage_ManipulationStarting(object sender, ManipulationStartingEventArgs e)
{
e.ManipulationContainer = ScrollViewerParent;
e.Handled = true;
}
private void MainImage_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{
var matrix = MainImage.LayoutTransform.Value;
Point? centerOfPinch = (e.ManipulationContainer as FrameworkElement)?.TranslatePoint(e.ManipulationOrigin, ScrollViewerParent);
if (centerOfPinch == null)
{
return;
}
}
ibeautiful
相关分类