【问题标题】:WPF Tree view, how to change indentionWPF Treeview,如何更改缩进
【发布时间】:2012-11-18 21:47:21
【问题描述】:

我的 Treeview 基本上有“文件夹”节点,并且在不包含其他项目的项目下一级。

因此不需要展开/折叠图标的空间(在第 2 层)。我可以放弃这个图标空间,从而减少缩进吗?项目(在示例中为“机场”)应向左移动一些像素。

重要提示:基本上是寻找代码解决方案(C#),而不是 XAML 版本。

【问题讨论】:

    标签: c# wpf treeview .net-4.5


    【解决方案1】:

    您真正想要做的是编辑 HierarchicalDataTemplate 并更改其行为方式。下面的页面,有一个很好的编辑Hierarchical Data Template的高级视图。

    我还发现 this one 非常适合开始使用。虽然这两个页面都没有具体说明要做什么,但您实际上是在更改项目演示器中的布局属性。

    编辑

    哎呀,我错了。不是 HierarchicalDataTemplate,而是 TreeViewItem 模板。

    请参阅下面的示例。如果您知道不会有任何第三级节点,这只是最简单的方法。

    特别注意名为 ItemsHost 的 ItemsPresenter 元素。它的边距为 -12,0,0,0。这意味着它的左边距是负数,因此会在左侧溢出包含它的网格列。因此,所有的子节点都会向左拉一点。如果将来有第三级节点,它们也会被拉到左边。如果您不希望这样,那么您将不得不为不同级别的节点提供不同的模板。但这超出了这个答案的范围。

    <Style x:Key="TreeViewItemStyle1" TargetType="{x:Type TreeViewItem}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TreeViewItem}">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition MinWidth="19" Width="Auto"/>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition/>
                        </Grid.RowDefinitions>
                        <ToggleButton x:Name="Expander" ClickMode="Press" IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource ExpandCollapseToggleStyle}"/>
                        <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.Column="1" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                            <ContentPresenter x:Name="PART_Header" ContentSource="Header" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                        </Border>
                        <ItemsPresenter x:Name="ItemsHost" Grid.ColumnSpan="2" Grid.Column="1" Grid.Row="1" Margin="-12,0,0,0"/>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsExpanded" Value="false">
                            <Setter Property="Visibility" TargetName="ItemsHost" Value="Collapsed"/>
                        </Trigger>
                        <Trigger Property="HasItems" Value="false">
                            <Setter Property="Visibility" TargetName="Expander" Value="Hidden"/>
                        </Trigger>
                        <Trigger Property="IsSelected" Value="true">
                            <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
                        </Trigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsSelected" Value="true"/>
                                <Condition Property="IsSelectionActive" Value="false"/>
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
                        </MultiTrigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="VirtualizingStackPanel.IsVirtualizing" Value="true">
                <Setter Property="ItemsPanel">
                    <Setter.Value>
                        <ItemsPanelTemplate>
                            <VirtualizingStackPanel/>
                        </ItemsPanelTemplate>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Style>
    

    【讨论】:

    • 小提醒一下,答案中提供的两个链接都不再有效了。
    猜你喜欢
    • 1970-01-01
    • 2014-09-05
    • 2018-04-09
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    相关资源
    最近更新 更多