Windows Phone:在明确重新启用ScrollViewer之前,如何完全禁用ScrollViewer

时间:2013-07-30 00:01:13

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

我的问题是我有一个非常简单的列表框,其中包含一个项目列表。我注意到当我从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已禁用,但是当我在不从屏幕上抬起手的情况下沿对角线滑动时,列表框中的项目开始向上和向下滚动。这种行为似乎是个错误!

有人可以告诉我如何完全禁用滚动查看器,因此对角线滑动不会暂时重新启用滚动查看器吗?

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

由于

1 个答案:

答案 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);