【问题标题】:Style TreeView but keep it Virtualized样式化 TreeView 但保持虚拟化
【发布时间】:2011-10-02 23:03:45
【问题描述】:

我的 TreeView 上的 Virtualization 在我只使用以下样式中的 xaml 设置 TreeViewItem 的样式时有效:

<Style.Triggers>
    <Trigger Property="VirtualizingStackPanel.IsVirtualizing" Value="true">
        <Setter Property="ItemsPanel">
            <Setter.Value>
                <ItemsPanelTemplate>
                    <VirtualizingStackPanel/>
                </ItemsPanelTemplate>
            </Setter.Value>
        </Setter>
    </Trigger>
</Style.Triggers>

但是,如果我尝试为 TreeView 本身赋予 Style={Resource} 的样式,虚拟化就会中断,即:

<Style x:Key="FontTreeViewStyle" TargetType="{x:Type TreeView}">
    <Setter Property="OverridesDefaultStyle" Value="True" />
    <Setter Property="SnapsToDevicePixels" Value="True" />
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" />
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" />

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="TreeView">
                <Border Name="Border" CornerRadius="1" BorderThickness="1" BorderBrush="{DynamicResource BorderMediumColor}" Background="{DynamicResource ControlLightColor}">
                    <ScrollViewer Focusable="False"  CanContentScroll="False" Padding="4"><!-- Style="{StaticResource MyScrollViewer}"-->
                        <ItemsPresenter />
                    </ScrollViewer>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

提前致谢!

【问题讨论】:

  • 已修复。我复制了 Expression Blend 中生成的样式,并意识到我没有完全实现 VirtualizingStackPanel.IsVirtualizing

标签: wpf treeview styles virtualization


【解决方案1】:

通过在 ScrollViewer 上指定 CanContentScroll="False" 您将始终停止它的虚拟化

看看why setting ScrollViewer.CanContentScroll to false disable virtualization

如果您仍然有问题,请仔细检查在 Snoop 或 WPF Inspector 等工具中创建的可视化树。要使虚拟化工作,IScrollInfo 对象(即面板)必须是 ScrollViewer 的直接子对象。

http://msdn.microsoft.com/en-us/library/ms750665.aspx

希望对您有所帮助, 标记

【讨论】:

  • 有帮助吗?我有同样的问题:当我为 TreeView 指定样式时,虚拟化会中断。
  • 为我工作,谢谢! (如果未设置 CanContentScroll 属性默认为 false,您必须将其设置为 value/true )
【解决方案2】:

MarkDaniel 已经回答(谢谢!),但这里有一个完整的示例样式:

<Style x:Key="ScrollViewerStyle" TargetType="{x:Type ScrollViewer}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ScrollViewer}">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition/>
                            <ColumnDefinition Width="Auto"/>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition/>
                            <RowDefinition Height="Auto"/>
                        </Grid.RowDefinitions>

                        <ScrollContentPresenter CanContentScroll="True" VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.IsContainerVirtualizable="True" VirtualizingPanel.VirtualizationMode="Recycling"/>

                        <ScrollBar Name="PART_VerticalScrollBar"
                            Grid.Column="1"
                            Value="{TemplateBinding VerticalOffset}"
                            Maximum="{TemplateBinding ScrollableHeight}"
                            ViewportSize="{TemplateBinding ViewportHeight}"
                            Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"
                            Style="{DynamicResource ScrollBarStyle}"/>
                        <ScrollBar Name="PART_HorizontalScrollBar"
                            Orientation="Horizontal"
                            Grid.Row="1"
                            Value="{TemplateBinding HorizontalOffset}"
                            Maximum="{TemplateBinding ScrollableWidth}"
                            ViewportSize="{TemplateBinding ViewportWidth}"
                            Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"
                            Style="{DynamicResource ScrollBarStyle}"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

【讨论】:

    猜你喜欢
    • 2012-12-08
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 2017-06-27
    • 2013-06-15
    相关资源
    最近更新 更多