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

问题

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

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

这个缩进会影响整个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>

最后我们来看下效果

查看例子

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

WPF TreeView Indent 减少节点的缩进的更多相关文章

  1. wpf treeview 数据绑定 递归绑定节点

    1.先上效果 将所有节点加入ComboBox数据源,在ComboBox中选择时下方Treeview显示该节点下的子节点. 1.xaml文件,将以下代码加入界面合适位置 <StackPanel&g ...

  2. WPF TreeView 选择事件执行两次,获取TreeView的父节点的解决方法

    1.TreeView选择事件执行两次 Very often, we need to execute some code in SelectedItemChanged depending on the ...

  3. WPF TreeView HierarchicalDataTemplate

    原文 WPF TreeView HierarchicalDataTemplate HierarchicalDataTemplate 的DataType是本层的绑定,而ItemsSource是绑定下层的 ...

  4. WinForm控件TreeView 只部分节点显示 CheckBox

    WinForm控件TreeView 只部分节点显示  CheckBox 用过asp.net的应该知道,要在treeview中实现上述功能可以使用ShowCheckBox 属性指定那些节点显示check ...

  5. WPF TreeView SelectedItemChanged called twice

    How to avoid WPF TreeView SelectedItemChanged being called twice Very often, we need to execute some ...

  6. C# TreeView 拖拽节点到另一个容器Panel中简单实现

    C# TreeView 拖拽节点到另一个容器Panel中简单实现 用了这么久C#拖拽功能一直没有用到也就没用过,今天因为项目需要,领导特地给我简单讲解了下拖拽功能,真是的大师讲解一点通啊.特地写一篇博 ...

  7. SUSE Ceph 增加节点、减少节点、 删除OSD磁盘等操作 - Storage6

    一.测试环境描述 之前我们已快速部署好一套Ceph集群(3节点),现要测试在现有集群中在线方式增加节点 如下表中可以看到增加节点node004具体配置 主机名 Public网络 管理网络 集群网络 说 ...

  8. WPF 之 TreeView右键选中节点及节点重命名

    下面的TreeView节点是通过数据双向绑定的方式,绑定到TextBlock控件和TextBox控件的Text属性上,并且让两者绑定相同的属性,同时使TextBox控件刚好完全覆盖TextBlock控 ...

  9. WPF TreeView 展开到指定节点

    最近在做一个交换机管理的项目,有一个交换机的树,做树的搜索的时候 展开节点居然有点难,自己记录下来 ,以后用的到的时候可以看一下. 展开代码如下,其中 SwitchTree是treeview空间的名称 ...

随机推荐

  1. python——pandas技巧(处理dataframe每个元素,不用for,而用apply)

    用apply处理pandas比用for循环,快了无数倍,测试如下: 我们有一个pandas加载的dataframe如下,features是0和1特征的组合,可惜都是str形式(字符串形式),我们要将其 ...

  2. JS "&&"操作符妙用

    首先来了解一下 "&&"操作符的工作原理: "&&"连接两个表达式,当两侧表达式都为真时,返回TRUE.有一个为假则返回FALS ...

  3. Day1 Scrum 冲刺博客

    团队作业4--项目冲刺 第一篇博客 一. 各个成员在 Alpha 阶段认领的任务 蔡越,冷沐样:视觉元素设计与方块类Cell开发 周梓波,纪昂学:游戏功能逻辑开发,即抽象出主要元素对应的数据类型 廖业 ...

  4. 获取radio的值及重置radio

    获取:$('input[name=age]:checked').val(); 重置:$('input:radio[name=age]').prop('checked',false);

  5. Maven项目中配置jdk版本

    <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> ...

  6. git远程仓库Github

    一.克隆项目 git clone 网址 1.配置信息 git config user.name '用户名' git config user.email '邮箱号' 2.推送项目到远程仓库 # 工作区代 ...

  7. oracle 常用语句3

    - oracle 函数 select sign(-3),sign(3), sign(0) from dual; select ceil(3.7) from dual; select floor(3.7 ...

  8. js第二次作业——2019.10.16

    第一题:完成省城市的三级联动(包括湖南省),附代码和效果图. 1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 </head> ...

  9. 用php简单区别泛解析

    <?php header('content-type:text/html; charset=utf-8'); $host = '58.com'; $hosts = gethostbyname(' ...

  10. bugku 之 crypto:进制转换的python脚本

    题目如下: text.txt的内容: 知识点:python怎么做进制转换 除了自己按照计算方法写一遍进制转换,可以用python自带的强制转换: int(a,num) 其中,int是转换成十进制整数类 ...