• WPF TreeView Indent 减少节点的缩进


    www.swack.cn - 原文链接:WPF TreeView Indent 减少节点的缩进

     

    问题

    最近一个需求,需要在界面中实现Windows资源管理器TreeView的界面。
    但是我发现,我做出的界面和实际系统的界面不太一致,最大的差别是TreeView节点的缩进值。

    • windows 资源管理器
      csharp_20190815_1
    • wpf 默认实现
      csharp_20190815_2

    这个缩进会影响整个TreeView在当前的Width下能够打开的层级。

    解决方案

    首先通过修改Style的方式可以更改第一级节点的Indent,但是下一级节点不受影响
    主要影响的Style如下:

    <ItemsPresenter x:Name="ItemsHost" Grid.ColumnSpan="2" Grid.Column="1" Grid.Row="1" Margin="-12,0,0,0"/>
    

    由此为突破口我们定制DateConverter类

    using System;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    
    namespace window_explorer.View
    {
        public class TreeViewItemLeftMarginConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                var item = (TreeViewItem)value;
                if (item != null)
                {
                    var itemshost = (ItemsPresenter)item.Template.FindName("ItemsHost", item);
                    if (itemshost != null)
                    {
                        Grid.SetColumn(itemshost, 1);
                        Grid.SetRow(itemshost, 1);
                        Grid.SetColumnSpan(itemshost, 2);
                        itemshost.Margin = new Thickness(-12, 0, 0, 0);
                    }
                }
                return new Thickness(5, 0, 0, 0);
            }
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new System.NotImplementedException();
            }
        }
    }
    

    同时在TreeView的TreeViewItem部分绑定
    Window标签添加 xmlns:local="clr-namespace:window_explorer.View"

    <Window.Resources>
        <local:TreeViewItemLeftMarginConverter x:Key="LeftMarginConverter"/>
    </Window.Resources>
    <TreeView x:Name="tree2" SelectedItemChanged="Tree2_SelectedItemChanged" Grid.Column="0" Width="250">
        <TreeView.Resources>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="HeaderTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal" Margin="0,2,0,2">
                                <Image Name="img"  Width="16" Height="16" Stretch="Fill"
                                    Source="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
                                    AncestorType={x:Type TreeViewItem}},
                                    Path=Header,
                                    Converter={x:Static local:HeaderToImageConverter.Instance}}"/>
                                <TextBlock Text="{Binding}" Margin="{Binding Converter={StaticResource LeftMarginConverter},
                                    RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TreeViewItem}}}"/>
                            </StackPanel>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </TreeView.Resources>
    </TreeView>
    

    最后我们来看下效果

    csharp_20190816_1

    查看例子

    GitHub:https://github.com/SwackSun/samples-csharp-treeview_indent

  • 相关阅读:
    Struts2+Spring2+Hibernate3 web应用示例(一)
    第二版序言
    Struts2+Spring2+Hibernate3 web应用示例(四)
    Struts2+Spring2+Hibernate3 web应用示例(六)
    终于轻松了
    Struts2+Spring2+Hibernate3 web应用示例(三)
    Dojo实用API
    AJAX实例入门
    JeffChen » C语言常用宏定义技巧
    FUZZ测试方法介绍
  • 原文地址:https://www.cnblogs.com/swack/p/11363658.html
Copyright © 2020-2023  润新知