C# wpf Treeview中有三个级别
我是一名初学者,正在尝试创建第一个包含三个级别的treeView的应用程序C# wpf Treeview中有三个级别,c#,wpf,C#,Wpf,我是一名初学者,正在尝试创建第一个包含三个级别的treeView的应用程序 第一级显示进程的名称 第二级显示其修复的模块和线程 第三级包含子模块和子线程 proc1 Module subMod1 Thread thread1 proc2
第一级显示进程的名称
第二级显示其修复的模块和线程
第三级包含子模块和子线程
proc1
Module
subMod1
Thread
thread1
proc2
Module
submod1
Thread
subThread
这是xmal.cs文件
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
for (int i = 0; i <= 3; i++)
{
Module mod = new Module
{
modulelist = new List<moduleList>() { new moduleList { Name = "mod1" } ,
new moduleList { Name = "mod1" } }
};
Thread th = new Thread
{
threadlist = new List<threadList>() { new threadList { Name = "thread1" } ,
new threadList { Name = "thread1" } }
};
ProcName proc1 = new ProcName { Name = "proc" + i, mod = new Module(), th = new Thread() };
tv.DataContext = proc1;
}
}
public class ProcName
{
public string Name
{ get; set; }
public Module mod = new Module();
public Thread th = new Thread();
}
public class Module
{
public string Name = "Module";
public List<moduleList> modulelist
{ get; set; }
}
public class moduleList
{
public string Name
{ get; set; }
}
public class Thread {
public string Name = "Thread";
public List<threadList> threadlist
{ get; set; }
}
public class threadList
{
public string Name
{ get; set; }
}
}
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
对于(int i=0;i
您可以使用界面
使其正常工作
xaml.cs
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var subNodes = new List<ITreeNode>
{
new SubNode { Name = "Sub Node 1" },
new SubNode { Name = "Sub Node 2" },
new SubNode { Name = "Sub Node 3" },
new SubNode { Name = "Sub Node 4" }
};
var nodes = new List<ITreeNode>
{
new Thread { Name = "Thread 1", ChildNodes = subNodes },
new Thread { Name = "Thread 2", ChildNodes = subNodes },
new Module { Name = "Module 1", ChildNodes = subNodes },
new Module { Name = "Module 2", ChildNodes = subNodes }
};
var processes = new List<Process>
{
new Process{ Name = "Process1", ChildNodes = nodes },
new Process{ Name = "Process2", ChildNodes = nodes }
};
TreeView.ItemsSource = processes;
}
}
public interface ITreeNode
{
string Name { get; set; }
List<ITreeNode> ChildNodes { get; set; }
}
public class Process : ITreeNode
{
public string Name { get; set; }
public int ID { get; set; }
public List<ITreeNode> ChildNodes { get; set; }
}
public class Module : ITreeNode
{
public string Name { get; set; }
public List<ITreeNode> ChildNodes { get; set; }
}
public class Thread : ITreeNode
{
public string Name { get; set; }
public int ID { get; set; }
public List<ITreeNode> ChildNodes { get; set; }
}
public class SubNode : ITreeNode
{
public string Name { get; set; }
public List<ITreeNode> ChildNodes { get => null; set => throw new System.NotImplementedException(); }
}
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
var子节点=新列表
{
新的子节点{Name=“Sub Node 1”},
新的子节点{Name=“Sub Node 2”},
新的子节点{Name=“Sub Node 3”},
新子节点{Name=“Sub Node 4”}
};
var节点=新列表
{
新线程{Name=“Thread 1”,子节点=子节点},
新线程{Name=“Thread 2”,子节点=子节点},
新模块{Name=“模块1”,子节点=子节点},
新模块{Name=“模块2”,子节点=子节点}
};
var进程=新列表
{
新进程{Name=“Process1”,ChildNodes=nodes},
新进程{Name=“Process2”,ChildNodes=nodes}
};
TreeView.ItemsSource=进程;
}
}
公共接口ITreeNode
{
字符串名称{get;set;}
列出子节点{get;set;}
}
公共类进程:ITreeNode
{
公共字符串名称{get;set;}
公共int ID{get;set;}
公共列表子节点{get;set;}
}
公共类模块:ITreeNode
{
公共字符串名称{get;set;}
公共列表子节点{get;set;}
}
公共类线程:ITreeNode
{
公共字符串名称{get;set;}
公共int ID{get;set;}
公共列表子节点{get;set;}
}
公共类子节点:ITreeNode
{
公共字符串名称{get;set;}
公共列表子节点{get=>null;set=>throw new System.NotImplementedException();}
}
xaml
如果级别不需要不同的模板,可以使用
<TreeView x:Name="TreeView">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding ChildNodes}">
<TextBlock Margin="3" Text="{Binding Name}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
如果你需要不同的级别模板,你可以使用这样的东西
<TreeView x:Name="TreeView">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:Process}" ItemsSource="{Binding ChildNodes}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Name, StringFormat='{}{0} '}" />
<TextBlock Text="{Binding Path=ID, StringFormat=(ID: {0})}" />
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Module}" ItemsSource="{Binding ChildNodes}">
<TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Thread}" ItemsSource="{Binding ChildNodes}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Name, StringFormat='{}{0} '}" />
<TextBlock Text="{Binding Path=ID, StringFormat=(ID: {0})}" />
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:SubNode}" ItemsSource="{Binding ChildNodes}">
<TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
您的数据类与您的树不匹配,这是第一个问题。一个进程可以有多个线程吗?多个模块吗?是的,一个进程有多个模块和线程。它运行得非常完美,但我有点困惑,因为在我的例子中,模块和线程不共享相同的子节点,原因是eac进程有不同的线程和不同的模块。您可以创建另一个子节点
,并像模块
和线程
类一样使用它。它将是var subNodes=new List{new SubNode1{Name=“Sub Node 1”},new SubNode1{Name=“SubNode 2”},new SubNode2{Name=“Sub Node 3”},new subnode 2{Name=“Sub Node 4”};
我做了类似的事情,为模块公共类添加了一个子类subnode 1:ITreeNode{public string Name{get;set;}公共列表子节点{get=>null;set=>throw new System.NotImplementedException();}然后创建变量var SubNode1=new List{new SubNode1{Name=“Sub node11”},},然后将其用作新模块{Name=“Module 2”,ChildNodes=SubNode1}
但它工作不正常,子节点1的输出为wpfexample。子节点1
我发现了错误。现在它已解决,工作正常,感谢您的帮助和努力
<TreeView x:Name="TreeView">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:Process}" ItemsSource="{Binding ChildNodes}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Name, StringFormat='{}{0} '}" />
<TextBlock Text="{Binding Path=ID, StringFormat=(ID: {0})}" />
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Module}" ItemsSource="{Binding ChildNodes}">
<TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Thread}" ItemsSource="{Binding ChildNodes}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Name, StringFormat='{}{0} '}" />
<TextBlock Text="{Binding Path=ID, StringFormat=(ID: {0})}" />
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:SubNode}" ItemsSource="{Binding ChildNodes}">
<TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>