zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    win7系统宽带自动断开怎么解决【系统天地】
    Win10系统修复受损文件教程【系统天地】
    win10如何加快开机速度【系统天地】
    Netty核心概念(5)之Channel
    Netty核心概念(4)之Bootstrap
    漫谈NIO(3)之Netty实现
    漫谈NIO(2)之Java的NIO
    漫谈NIO(1)之计算机IO实现
    机器学习实战(二)决策树
    机器学习实战(一)k-近邻算法
  • 原文地址:https://www.cnblogs.com/swack/p/11363658.html
Copyright © 2011-2022 走看看