csharp-TreeView

TreeViewItem

绑定 TreeView 到数据结构,使用适当的模板渲染内容。

xaml

<TreeView Name="treeView" Padding="0" Margin="5 5 0 5"  Loaded="treeView_Loaded">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:TreeNodeItem}" ItemsSource="{Binding Path=Children}">
<StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" Text="{Binding name}"></TextBlock>
<StackPanel.ToolTip>
<TextBlock VerticalAlignment="Center" Text="{Binding tips}" TextWrapping="Wrap" MaxWidth="200" ></TextBlock>
</StackPanel.ToolTip>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>

展开、收缩

需要在控件的 Loaded 事件里面处理

private void ExpandTree()
{
if (this.treeView.Items != null && this.treeView.Items.Count > 0)
{
foreach (var item in this.treeView.Items)
{
DependencyObject dependencyObject = this.treeView.ItemContainerGenerator.ContainerFromItem(item);
if (dependencyObject != null)//第一次打开程序,dependencyObject为null,会出错
{
((TreeViewItem)dependencyObject).ExpandSubtree();
}
}
}
}

private void treeView_Loaded(object sender, RoutedEventArgs e)
{
ExpandTree();
}

事件

在 xaml 里面添加事件,对应的 cs 文件里面会添加映射函数

<TreeView Name="treeView" Padding="0" Margin="5 5 0 5"  Loaded="treeView_Loaded" SelectedItemChanged="treeView_SelectedItemChanged">
...
</TreeView>

选择某一项

设置需要选择的项目的 IsSelected 为 true 就可以了

// xaml
<TreeView Name="treeView" Padding="0" Margin="5 5 0 5" Loaded="treeView_Loaded" SelectedItemChanged="treeView_SelectedItemChanged">
<TreeView.Resources>
<Style TargetType="TreeViewItem">
<Setter Property="IsSelected"
Value="{Binding Path=IsSelected, Mode=TwoWay}" />
</Style>
</TreeView.Resources>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:TreeNodeItem}" ItemsSource="{Binding Path=Children}">
<StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" Text="{Binding name}"></TextBlock>
<StackPanel.ToolTip>
<TextBlock VerticalAlignment="Center" Text="{Binding tips}" TextWrapping="Wrap" MaxWidth="200" ></TextBlock>
</StackPanel.ToolTip>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>

// code
internal class TreeNodeItem
{
public string name { get; set; }
public string tips { get; set; }
public int data { get; set; }
public bool IsSelected { get; set; }

public List<TreeNodeItem> Children { get; set; }
public TreeNodeItem()
{
Children = new List<TreeNodeItem>();
}
public TreeNodeItem(string inName, string inTips,int inData,bool inIsSelected=false)
{
name = inName;
tips = inTips;
data = inData;
IsSelected = inIsSelected;
Children = new List<TreeNodeItem>();
}
}

失去焦点时设置背景色

<TreeView Name="treeView" Padding="0" Margin="5 5 0 5"  Loaded="treeView_Loaded" 
SelectedItemChanged="treeView_SelectedItemChanged">
<TreeView.Resources>
<Style TargetType="TreeViewItem">
<Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" />
</Style>
<!-- Style the inactive selection the same as active -->
<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}"
Color="{DynamicResource {x:Static SystemColors.HighlightColorKey}}" />
<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}"
Color="{DynamicResource {x:Static SystemColors.HighlightTextColorKey}}"/>
</TreeView.Resources>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:TreeNodeItem}" ItemsSource="{Binding Path=Children}">
<StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" Text="{Binding name}"></TextBlock>
<StackPanel.ToolTip>
<TextBlock VerticalAlignment="Center" Text="{Binding tips}" TextWrapping="Wrap" MaxWidth="200" ></TextBlock>
</StackPanel.ToolTip>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>