我的问题是我有一个非常简单的列表框,其中包含一个项目列表。我注意到当我从MainPage_Loaded事件中禁用ScrollViewer时,可以通过沿任意方向对角滑动列表框来重新启用ScrollViewer。
我尝试过设置XAML的属性:
<ListBox ScrollViewer.VerticalScrollBarVisibility="Disabled" ...../>
我也试过从代码中做到这一点:
var myScrollviewer = VisualTreeHelper.GetChild(MyListBox, 0) as ScrollViewer;
myScrollviewer.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;
myScrollviewer.VerticalScrollBarVisibility = ScrollBarVisibility.Disabled;
直线垂直和水平滑动确实表示ScrollViewer已禁用,但是当我在不从屏幕上抬起手的情况下沿对角线滑动时,列表框中的项目开始向上和向下滚动。这种行为似乎是个错误!
有人可以告诉我如何完全禁用滚动查看器,因此对角线滑动不会暂时重新启用滚动查看器吗?
此行为正在影响我在滚动查看器被禁用时拖动项目的下划线任务。
由于
答案 0 :(得分:1)
这很有趣,之前没有注意到。这可能是一个错误,但要绕过它尝试将ScrollViewer的ManipulationMode属性设置为Control
,让操作系统知道您将在控制级别处理ScrollViewer而不是让系统处理它。
<ListBox ScrollViewer.ManipulationMode="Control"
ScrollViewer.VerticalScrollBarVisibility="Disabled"
ScrollViewer.HorizontalScrollBarVisibility="Disabled" .../>
但是,当您重新启用它时,请将ManipulationMode
设置回System
以便更顺畅地滚动。
根据评论进行更新
要重新启用滚动查看器,请执行此操作
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);