检测滚动条在UWP中何时可见

检测滚动条在UWP中何时可见,uwp,uwp-scrollviewer,Uwp,Uwp Scrollviewer,使用UWP中的ScrollViewer,我需要检测滚动条或平移指示器何时可见,以便我可以向ScrollViewer添加填充,以便滚动条可见时不会与查看器中的内容重叠 这个回复看起来很有希望,但是它是为WPF编写的。它确实将我引向了同样存在于UWPScrollViewer中的ComputedVerticalScrollBarVisibility属性,但是它始终具有Visible的值,即使滚动条隐藏在用户界面中 XAML片段: ComputedVerticalScrollBarVisibilit

使用UWP中的
ScrollViewer
,我需要检测滚动条或平移指示器何时可见,以便我可以向ScrollViewer添加填充,以便滚动条可见时不会与查看器中的内容重叠

这个回复看起来很有希望,但是它是为WPF编写的。它确实将我引向了同样存在于UWP
ScrollViewer
中的
ComputedVerticalScrollBarVisibility
属性,但是它始终具有
Visible
的值,即使滚动条隐藏在用户界面中

XAML片段:


ComputedVerticalScrollBarVisibility
的文档表明,这是确定滚动条是否可见的最合适的属性,而
VerticalScrollBarVisibility
属性则用于指示您是否希望垂直滚动条可用


指示垂直滚动条是否可见的可见性。默认值是可见的

最后一点令人困惑,它看起来好像这个属性总是保持默认状态

最初,我尝试为code behind中的
ComputedVerticalScrollBarVisibilityProperty
注册一个更改处理程序,作为一个概念,它通常可以很好地拦截对未公开特定更改事件的控件上的依赖项属性的更改,但以下实现从未注册更改:

publicshellpage()
{
初始化组件();
//在滚动条上注册属性更改,在页面中添加填充
ForegroundElement.RegisterPropertyChangedCallback(
ScrollViewer.ComputedVerticalScrollBarVisibilityProperty,
ForegroundElement_滚动条可视性已更改);
}
私有void ForegroundElement\u ScrollBarVisibilityChanged(DependencyObject发送方,DependencyProperty dp)
{
if(ForegroundElement.ComputedVerticalScrollBarVisibility==Visibility.Visible)
{
if(ForegroundElement.Padding.Right!=18)
填充=新厚度(0,0,18,0);
}
其他的
{
if(ForegroundElement.Padding.Right!=0)
前置元素。填充=新厚度(0);
}
}
将实现更改为侦听没有多大帮助,因为
ComputedVerticalScrollBarVisibility
的值始终是可见的,即使滚动条在UI中不可见

我仔细检查了
VerticalScrollMode
是否设置为
“自动”
,因为我知道这在其他平台中是一个问题,但是更改或完全忽略该值没有影响


背景 虽然和Edge浏览器有很好的文档记录,并且由于其被视为操作系统的一项功能,因此pro windows社区通常可以容忍,但这种默认的隐藏滚动条直到用户悬停在滚动条上的行为导致我们的UWP应用程序在市场上收到大量负面用户反馈。平移指示器太微妙,我们的用户感到困惑,因为他们根本不知道某个区域可以滚动

在这篇文章中,我特别关注了一个声明的
ScrollViewer
,但是同样的问题也适用于在控件模板中内部实现
ScrollViewer
的其他标准控件


ScrollViewer
上还有一个属性可用于确定滚动条何时可见

ScrollViewer.ScrollableHeight属性
获取一个值,该值表示可滚动区域的垂直大小;范围高度与视口高度之间的差值

因此,当
ScrollableHeight
为零时,滚动条将
折叠
,对于所有其他正值,滚动条将
可见

该实施工作如预期:

publicshellpage()
{
初始化组件();
//在滚动条上注册属性更改,在页面中添加填充
ForegroundElement.RegisterPropertyChangedCallback(
ScrollViewer.ScrollableHeightProperty,
ForegroundElement_ScrollableHeightChanged);
}
私有void ForegroundElement\u ScrollableHeightChanged(DependencyObject发送方,DependencyProperty dp)
{
如果(ForegroundElement.ScrollableHeight>0)
{
if(ForegroundElement.Padding.Right!=18)
填充=新厚度(0,0,18,0);
}
其他的
{
if(ForegroundElement.Padding.Right!=0)
前置元素。填充=新厚度(0);
}
}