WPF C# touch scroll 正在拖动整个window
WPF C# touch scroll is dragging the whole window
我正在开发支持触摸屏的 WPF 应用程序,但我遇到了一个问题:使用触摸屏滚动 ScrollViewer
时,当滚动到 [=11] 时,整个应用程序 window 被稍微拖动了=] 顶部或底部。是否可以禁用此行为?
它可能只是在冒泡之前处理事件(有关此信息,请参阅 MSDN https://msdn.microsoft.com/library/ms742806(v=vs.100).aspx)。
订阅
ScrollViewer.PreviewTouchUp
有了这个
private void UIElement_OnPreviewTouchUp(object sender, TouchEventArgs e)
{
e.Handled = true;
}
通读 .NET 源代码后,我发现了这一点:
public class CustomScrollViewer : ScrollViewer
{
protected override void OnManipulationDelta(ManipulationDeltaEventArgs e)
{
base.OnManipulationDelta(e);
e.ReportBoundaryFeedback(new ManipulationDelta(new Vector(0, 0), 0, new Vector(0, 0), new Vector(0, 0)));
}
}
当用户试图滚动太远时,额外的增量会报告给操作系统,这会拦截该行为。确保对基本实现的调用是第一个。此外,如果您在其模板中使用带有 ScrollViewer
的控件,您可以尝试订阅该事件,但我不能保证它会起作用。这完全取决于谁最后报告。
我知道人们不喜欢 link 只有答案,但我遇到了这个问题并使用这个 link 来帮忙:
C# wpf scrollviewer not working like windows store app
默认行为是当您滚动到顶部或底部或左右限制时让您的应用弹跳。使用 ManipulationBoundaryFeedback 事件并将其添加到后面的代码中。
private void OnManipulationBoundaryFeedback(object sender, ManipulationBoundaryFeedbackEventArgs e)
{
e.Handled = true;
}
我正在开发支持触摸屏的 WPF 应用程序,但我遇到了一个问题:使用触摸屏滚动 ScrollViewer
时,当滚动到 [=11] 时,整个应用程序 window 被稍微拖动了=] 顶部或底部。是否可以禁用此行为?
它可能只是在冒泡之前处理事件(有关此信息,请参阅 MSDN https://msdn.microsoft.com/library/ms742806(v=vs.100).aspx)。
订阅
ScrollViewer.PreviewTouchUp
有了这个
private void UIElement_OnPreviewTouchUp(object sender, TouchEventArgs e)
{
e.Handled = true;
}
通读 .NET 源代码后,我发现了这一点:
public class CustomScrollViewer : ScrollViewer
{
protected override void OnManipulationDelta(ManipulationDeltaEventArgs e)
{
base.OnManipulationDelta(e);
e.ReportBoundaryFeedback(new ManipulationDelta(new Vector(0, 0), 0, new Vector(0, 0), new Vector(0, 0)));
}
}
当用户试图滚动太远时,额外的增量会报告给操作系统,这会拦截该行为。确保对基本实现的调用是第一个。此外,如果您在其模板中使用带有 ScrollViewer
的控件,您可以尝试订阅该事件,但我不能保证它会起作用。这完全取决于谁最后报告。
我知道人们不喜欢 link 只有答案,但我遇到了这个问题并使用这个 link 来帮忙:
C# wpf scrollviewer not working like windows store app
默认行为是当您滚动到顶部或底部或左右限制时让您的应用弹跳。使用 ManipulationBoundaryFeedback 事件并将其添加到后面的代码中。
private void OnManipulationBoundaryFeedback(object sender, ManipulationBoundaryFeedbackEventArgs e)
{
e.Handled = true;
}