Как сделать автономную полосу прокрутки видимой автоматически, в зависимости от средства просмотра прокрутки, которым она управляет?

У меня есть средство просмотра прокрутки, в котором моя HorizontalScrollbarVisibility скрыта, потому что я хочу, чтобы моя фактическая полоса прокрутки была размещена в другом месте моего пользовательского интерфейса.

Не беспокойтесь о лучшей или плохой практике, просто поверьте мне, что это лучший способ показать полосу прокрутки (одна из причин заключается в том, что я на самом деле прокручиваю 2 синхронизированных представления, что отлично работает и не является частью проблемы).

Мой код выглядит так на данный момент:

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

BindableScrollBar просто унаследован от обычного элемента управления wpf ScrollBar, поэтому считайте его таковым. (это взято из отличного фрагмента кода, найденного здесь: Как связать полосу прокрутки и средство просмотра прокрутки)

Теперь моя проблема в том, что автономная полоса прокрутки всегда видна. Я хотел бы, чтобы он вел себя так же, как при установке HorizontalScrollBarVisibility на auto в средстве просмотра прокрутки. Он должен быть виден только в том случае, если есть необходимость в полосе прокрутки, в противном случае его следует свернуть.

Если есть кто-нибудь, у кого есть идея, как решить эту проблему, предпочтительно только в XAML, это будет очень признательно.


person Kenneth_hj    schedule 04.05.2014    source источник
comment
посмотрите здесь: stackoverflow.com/questions/4330497 /   -  person Dennis Kassel    schedule 04.05.2014
comment
@GinoBambino, я думаю, ты неправильно понял мой вопрос. Это именно та ссылка, на которую я указал в своем посте. Я уже был там и сделал это, теперь мне нужно также привязать видимость.   -  person Kenneth_hj    schedule 04.05.2014
comment
Как насчет простой привязки видимости вашей полосы прокрутки к свойству ScrollBarVisibility соответствующего средства просмотра прокрутки? Вам этого будет достаточно? Вы можете написать простой преобразователь значений для преобразования значения ScrollBarVisibility в соответствующее значение видимости.   -  person Dennis Kassel    schedule 04.05.2014
comment
К сожалению, нет, поскольку средства просмотра прокрутки ScrollbarVisibility всегда будут скрыты.   -  person Kenneth_hj    schedule 04.05.2014


Ответы (1)


Используйте свойство Computed[Vertical|Horizontal]ScrollBarVisibility в ScrollViewer:

<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;
person Dmitry    schedule 04.05.2014
comment
Извините, я забыл упомянуть, что уже смотрел ComputedHorizontalScrollBarVisibility. Это не работает, потому что полоса прокрутки scrollviewers всегда скрыта, поэтому вместо этого я использую отдельную полосу прокрутки. - person Kenneth_hj; 04.05.2014
comment
Вы можете удалить ScrollBar из стиля ScrollViewer и оставить для HorizontalScrollBarVisibility значение Auto. Другим решением было бы вычислить его самостоятельно, но вам нужно будет прослушивать множество событий ScrollViewer. - person Dmitry; 04.05.2014
comment
На самом деле это звучит как хорошая идея - удалить его из стиля и связать, как вы изначально предложили. Я никогда не пытался изменить часть элемента управления ControlTemplate, есть ли у вас какое-либо представление о том, как к этому подступиться? - person Kenneth_hj; 04.05.2014
comment
Я добавил пример шаблона ScrollViewer без полос прокрутки. На самом деле их можно просто удалить, и ScrollViewer по-прежнему будет работать нормально. - person Dmitry; 04.05.2014