在UWP中显示滚动条时检测

问题描述 投票:0回答:1

[使用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中不可见,ComputedVerticalScrollBarVisibility的值始终为Visible

[我仔细检查了VerticalScrollMode设置为"Auto",因为我知道这在其他平台上是个问题,但是更改此值或完全忽略它没有任何影响。


背景

虽然MS implementation of the scrollbar in modern Windows 10 store apps和Edge浏览器已被很好地记录,并且

pro-windows

社区通常可以容忍,因为它被视为OS的功能,但是这种默认行为是隐藏滚动条,直到用户将鼠标悬停在上面导致我们的UWP应用在市场上收到很多负面的用户反馈。平移指示器太微妙,我们的用户感到困惑,因为他们根本不知道可以滚动区域。
对于这篇文章,我特别关注声明的ScrollViewer,但是相同的问题也适用于在其控件模板内部内部实现ScrollViewer的其他标准控件。
uwp uwp-scrollviewer
1个回答
0
投票

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); } }
© www.soinside.com 2019 - 2024. All rights reserved.