如何使独立滚动条自动可见,取决于它控制的滚动查看器?

时间:2014-05-04 09:15:30

标签: .net wpf xaml scrollbar scrollviewer

我有一个scrollviewer,我的Horizo​​ntalScrollbarVisibility被隐藏,因为我希望我的实际滚动条放在我的UI的其他地方。

不要担心最佳或不好的做法,只要相信我这是显示滚动条的最佳方式(其中一个原因是我实际上滚动了2个同步视图,哪个工作正常并且不是问题的一部分)。

我的代码目前看起来像这样:

<ScrollViewer Name="scrollView" HorizontalScrollBarVisibility="Hidden">
...
</ScrollViewer>
...
<ControlsWPF:BindableScrollBar Orientation="Horizontal" BoundScrollViewer="{Binding ElementName=scrollView}"/>

BindableScrollBar只是从普通的wpf ScrollBar控件继承而来,所以请考虑它。 (它来自这里找到的一段很棒的代码:How to link scrollbar and scrollviewer

现在,我的问题是独立滚动条始终可见。我希望它在滚动查看器上将 Horizo​​ntalScrollBarVisibility 设置为 auto 时的行为。只有在需要滚动条时才能看到它,否则它应该被折叠。

如果有人知道如何解决这个问题,仅限于XAML,我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

在ScrollViewer上使用Computed [Vertical | Horizo​​ntal] ScrollBarVisibility属性:

<ControlsWPF:BindableScrollBar Orientation="Horizontal" BoundScrollViewer="{Binding ElementName=scrollView}" Visibility="{Binding ComputedHorizontalScrollBarVisibility, ElementName=scrollView}"/>

要从ScrollViewer中删除滚动条,您可以从其样式中删除滚动条:

<ControlTemplate x:Key="NoBarsScrollViewerControlTemplate" TargetType="{x:Type ScrollViewer}">
    <Grid x:Name="Grid" Background="{TemplateBinding Background}">
        <ScrollContentPresenter x:Name="PART_ScrollContentPresenter" CanContentScroll="{TemplateBinding CanContentScroll}" CanHorizontallyScroll="False" CanVerticallyScroll="False" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Grid.Column="0" Margin="{TemplateBinding Padding}" Grid.Row="0"/>
    </Grid>
</ControlTemplate>

另一个解决方案是自己计算它,但你需要收听大量的ScrollViewer事件。

bool ScrollBarVisibility = ScrollViewer.ExtentWidth > ScrollViewer.ViewportWidth;