【问题标题】:Windows Phone: How do I keep ScrollViewer totally disabled until explicitly re-enabling itWindows Phone:如何让 ScrollViewer 完全禁用,直到明确重新启用它
【发布时间】:2013-07-29 23:05:45
【问题描述】:

我的问题是我有一个非常简单的列表框,其中包含项目列表。我注意到,当我从 MainPage_Loaded 事件中禁用 ScrollViewer 时,可以通过沿任意方向对角滑动 Listbox 来重新启用 ScrollViewer。

我已尝试从 XAML 设置属性:

<ListBox ScrollViewer.VerticalScrollBarVisibility="Disabled" ...../>

我也尝试从代码中做到这一点:

var myScrollviewer = VisualTreeHelper.GetChild(MyListBox, 0) as ScrollViewer;
myScrollviewer.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;
myScrollviewer.VerticalScrollBarVisibility = ScrollBarVisibility.Disabled;

垂直和水平滑动确实表明 ScrollViewer 已禁用,但是当我在不将手从屏幕上抬起的情况下沿对角线滑动时,列表框中的项目开始上下滚动。这种行为似乎是一个错误!

谁能告诉我如何完全禁用滚动查看器,以便对角滑动不会暂时重新启用滚动查看器?

此行为影响了我在禁用滚动查看器时拖动项目的下划线任务。

谢谢

【问题讨论】:

  • 如果您不想滚动,为什么要使用 ListBox?您应该使用 ItemsControl

标签: c# windows-phone-7 windows-phone-8 windows-phone-7.1


【解决方案1】:

这很有趣,以前没有注意到。这可能是一个错误,但要解决它,请尝试将 ScrollViewer 的 ManipulationMode 属性设置为 Control 以让操作系统知道您将在控制级别处理 ScrollViewer,而不是让系统处理它。

<ListBox ScrollViewer.ManipulationMode="Control" 
         ScrollViewer.VerticalScrollBarVisibility="Disabled"
         ScrollViewer.HorizontalScrollBarVisibility="Disabled" .../>

但是,当您重新启用它时,请将 ManipulationMode 设置回 System 以获得更流畅的滚动。

基于 cmets 的更新

要重新启用滚动查看器,请执行此操作

var myScrollviewer = VisualTreeHelper.GetChild(MyListBox, 0) as ScrollViewer;
myScrollviewer.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
myScrollviewer.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
//key part - use SetValue to set ManipluationMode.System/Control
myScrollviewer.SetValue(ScrollViewer.ManipulationModeProperty, ManipulationMode.System);

如果你需要再次禁用它,你可以做同样的事情,但使用禁用的属性和ManipulationMode.Control

var myScrollviewer = VisualTreeHelper.GetChild(MyListBox, 0) as ScrollViewer;
myScrollviewer.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;
myScrollviewer.VerticalScrollBarVisibility = ScrollBarVisibility.Disabled;
//key part - use SetValue to set ManipluationMode.System/Control
myScrollviewer.SetValue(ScrollViewer.ManipulationModeProperty, ManipulationMode.Control);

【讨论】:

  • 哇!感谢KeyboardP的及时回复。我已经尝试过了,但没有帮助。我仍然可以通过对角滑动暂时重新启用它。这是一种非常奇怪的行为。
  • 我可以重现错误(我在带有 WP7 项目的 WP8 模拟器上运行)。但是,设置Control 可以修复它(同时还保留VerticalScrollBarVisibility="Disabled"HorizontalScrollBarVisibility="Disabled" 属性)。这很奇怪。
  • 看来我们无法真正在运行时更改 ManipulationMode,因为在切换回“系统”时出现错误。
  • @user1058145 - 错误信息是什么?我看看能不能复制。
  • {System.InvalidOperationException: ManipulationMode 已设置,在 OnApplyTemplate 之后无法更改。在 System.Windows.Controls.ScrollViewer.set_ManipulationMode(ManipulationMode 值) 在 PhoneApp4.MainPage.myImage_ManipulationStarted(Object sender, ManipulationStartedEventArgs e) 在 MS.Internal.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex, Delegate handlerDelegate, Object sender, Object args) 在 MS .Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)}
猜你喜欢
  • 1970-01-01
  • 2011-07-12
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多