WPF: изменить ListBox ItemTemplate в зависимости от того, видна ли полоса прокрутки или нет - PullRequest
2 голосов
/ 29 июля 2011

Прошу прощения за мой английский.


Мне нужно изменить шаблон данных для элементов в ListBox в зависимости от того, видна вертикальная полоса прокрутки или нет (или включена, или отключена).Я использую стили для ListBox и ScrollBar.Я могу изменить шаблон scrollBar, когда его свойство «IsEnabled» имеет значение «False».Но я не могу понять, как отловить ScrollBar.VisibilityChanging внутри ListBox Style.Я пытался использовать

<Style TargetType="{x:Type ListBox}" >
.....
<Style.Triggers>
    <Trigger Property="ScrollViewer.ComputedVerticalScrollBarVisibility"
             Value="Hidden">
        <Setter Property="ItemTemplate">
            ......

... с ...

<Style x:Key="{x:Type ScrollBar}" TargetType="{x:Type ScrollBar}">
     ..........
     <Trigger Property="IsEnabled" Value="False">
          <Setter Property="Visibility" Value="Hidden" />
     </Trigger>
 ......

Это не работает.

Надеюсь, вы поможете мне

1 Ответ

2 голосов
/ 30 июля 2011

ScrollViewer имеет два свойства: ComputedHor horizontalScrollBarVisibility и ComputedVerticalScrollBarVisibility, которые являются свойствами зависимостей только для чтения, и мы можем использовать их в триггерах в ControlTemplate нашего ListBox (здесь я рассматриваю только вертикальное свойство)

<Style x:Key="StyleListBoxChangingItemTemplate" TargetType="{x:Type ListBox}">
    <Setter Property="ItemTemplate" Value="{StaticResource SomeItemTemplate}"/>
    <Setter Property="Template">
        <ControlTemplate TargetType="{x:Type ListBox}">
            <ScrollViewer x:Name="ListScroller">
                <ItemsPresenter />
            </ScrollViewer>
            <ControlTemplate.Triggers>
                <Trigger SourceName="ListScroller" Property="ComputedVerticalScrollBarVisibility" Value="Visible">
                    <Setter Property="ItemTemplate" Value="{StaticResource SomeOtherItemTemplate}"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Setter>
</Style>

ПРИМЕЧАНИЕ: для ясности ответа это урезанный, простой шаблон для ListBox.Я удалил границу, которая должна обтекать ScrollViewer и все свойства, определенные в ScrollViewer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...