WPF:根据ScrollBar是否可见更改ListBox ItemTemplate

时间:2011-07-29 13:32:15

标签: .net wpf xaml styles

对不起我的英语。


我需要为ListBox中的项更改DataTemplate,具体取决于Vertical ScrollBar是否可见(或启用或禁用)。 我使用ListBox和ScrollBar的样式。 当其属性“IsEnabled”的值为“False”时,我可以更改scrollBar模板。但我无法理解如何在ListBox Style中捕获ScrollBar.VisibilityChanging。我试着用

<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 个答案:

答案 0 :(得分:2)

ScrollViewer有两个属性:ComputedHorizo​​ntalScrollBarVisibility和ComputedVerticalScrollBarVisibility是只读依赖属性,我们可以在ListBox的ControlTemplate中的触发器中使用它们(这里我只考虑垂直属性)

<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上定义的所有属性。