[使用UWP中的ScrollViewer
,我需要检测滚动条或平移指示器何时可见,以便可以向ScrollViewer添加填充,以使可见时的滚动条不会与查看器中的内容重叠。
[SO对Detect, if ScrollBar of ScrollViewer is visible or not的此响应看起来很有希望,但是它是为WPF编写的。它确实将我引向UWP ComputedVerticalScrollBarVisibility
中也存在的ScrollViewer
属性,但是,即使滚动条隐藏在用户界面中,该属性始终具有Visible
的值。
XAML片段:
<ScrollViewer
Name="ForegroundElement"
VerticalScrollMode="Auto">
<Grid>
<Frame x:Name="shellFrame" />
</Grid>
</ScrollViewer>
ComputedVerticalScrollBarVisibility
的文档建议,这是确定滚动条是否可见的最合适的属性,另一方面,VerticalScrollBarVisibility
属性用于指示您是否希望垂直滚动条完全可用。
ComputedVerticalScrollBarVisibility指示垂直滚动条是否可见的可见性。默认值为可见。
最后一点令人困惑,看起来该属性始终保持默认状态。
最初,我尝试在后面的代码中为ComputedVerticalScrollBarVisibilityProperty
注册一个更改处理程序,作为一种概念,该处理程序通常可以很好地拦截未公开特定更改事件的控件上对[[dependency properties的更改,但是以下内容实施从未注册过更改:
public ShellPage()
{
InitializeComponent();
// register for property change on the scrollbar, add padding to the page
ForegroundElement.RegisterPropertyChangedCallback(
ScrollViewer.ComputedVerticalScrollBarVisibilityProperty,
ForegroundElement_ScrollBarVisibilityChanged);
}
private void ForegroundElement_ScrollBarVisibilityChanged(DependencyObject sender, DependencyProperty dp)
{
if (ForegroundElement.ComputedVerticalScrollBarVisibility == Visibility.Visible)
{
if (ForegroundElement.Padding.Right != 18)
ForegroundElement.Padding = new Thickness(0, 0, 18, 0);
}
else
{
if (ForegroundElement.Padding.Right != 0)
ForegroundElement.Padding = new Thickness(0);
}
}
更改实现以侦听LayoutUpdated Event并没有太大帮助,因为即使滚动条在UI中不可见,社区通常可以容忍,因为它被视为OS的功能,但是这种默认行为是隐藏滚动条,直到用户将鼠标悬停在上面导致我们的UWP应用在市场上收到很多负面的用户反馈。平移指示器太微妙,我们的用户感到困惑,因为他们根本不知道可以滚动区域。ComputedVerticalScrollBarVisibility
的值始终为Visible
。[我仔细检查了
VerticalScrollMode
设置为"Auto"
,因为我知道这在其他平台上是个问题,但是更改此值或完全忽略它没有任何影响。
背景虽然MS implementation of the scrollbar in modern Windows 10 store apps和Edge浏览器已被很好地记录,并且
pro-windows
对于这篇文章,我特别关注声明的ScrollViewer
,但是相同的问题也适用于在其控件模板内部内部实现ScrollViewer
的其他标准控件。
ScrollViewer.ScrollableHeight属性获取一个值,该值表示可以滚动的区域的垂直大小;范围的高度和视口的高度之间的差。
因此,当ScrollableHeight
为零时,滚动条将为Collapsed
,对于所有其他正值,滚动条将为Visible
。
此实现按预期工作:
public ShellPage()
{
InitializeComponent();
// register for property change on the scrollbar, add padding to the page
ForegroundElement.RegisterPropertyChangedCallback(
ScrollViewer.ScrollableHeightProperty,
ForegroundElement_ScrollableHeightChanged);
}
private void ForegroundElement_ScrollableHeightChanged(DependencyObject sender, DependencyProperty dp)
{
if (ForegroundElement.ScrollableHeight > 0)
{
if (ForegroundElement.Padding.Right != 18)
ForegroundElement.Padding = new Thickness(0, 0, 18, 0);
}
else
{
if (ForegroundElement.Padding.Right != 0)
ForegroundElement.Padding = new Thickness(0);
}
}