C# 在xaml中具有TreeViewItems的ListView
我对c#还不太熟悉,我要做的第一件事就是创建一个带有数据绑定的C# 在xaml中具有TreeViewItems的ListView,c#,wpf,xaml,c#-4.0,C#,Wpf,Xaml,C# 4.0,我对c#还不太熟悉,我要做的第一件事就是创建一个带有数据绑定的ListView,结果还不错 如果基础模型有任何子项(如TreeView),我现在尝试使项具有一个扭曲按钮。每个子项的列与所有顶级项相同 我该怎么做呢?是否已有这样的控件?如果不是,我最好把TreeView打扮成ListView,或者把ListView打扮成TreeView 我沿着这条路走下去,这条路把一个树视图装扮成了一个,但是最终的结果看起来很糟糕,标题实际上只是一个项目,因此,在ListView中,您失去了所有可以连接到列排序的
ListView
,结果还不错
如果基础模型有任何子项(如TreeView
),我现在尝试使项具有一个扭曲按钮。每个子项的列与所有顶级项相同
我该怎么做呢?是否已有这样的控件?如果不是,我最好把TreeView
打扮成ListView
,或者把ListView
打扮成TreeView
我沿着这条路走下去,这条路把一个树视图装扮成了一个,但是最终的结果看起来很糟糕,标题实际上只是一个项目,因此,在ListView
中,您失去了所有可以连接到列排序的列大小调整和列按钮,因此该路由实际上似乎需要更多的工作
我注意到新的任务管理器有一个与我试图创建的完全相同的控件,我不知道这是如何实现的?可能是C语言
您描述的内容听起来有点像TreeListView,如果您在google上搜索“WPF TreeListView”,您将看到一些可能对您有好处的解决方案。我用过一个,但根据你的需求有多复杂,可能有点过头了
如果您只需要一个子级别,比如您附加的图像,那么您可能只需要使用ListView,在第一列中使用一个复杂的DataTemplate,它将显示一个扩展按钮和一个绑定到子项的简单ListBox
与类似,只是单元格的复选框样式类似于箭头、项目文本和子列表框。然后将子列表框的可见性绑定到复选框的状态。Microsoft提供的示例似乎就是您要查找的。可在此处找到该示例的总结:
当您构建并运行该示例时,您将得到类似的结果:
在这个例子中,有大量的模板制作,所以你可以让事情看起来像你想要的那样。制作样式可能会更容易。
在列表视图中,我做了一个快速的游戏,并设法在大约10分钟内创建了一个模型
显然,您希望添加更多内容,但在ListView
列中托管TreeView
似乎非常容易
如果您想在其上构建,请使用以下模型代码
Xaml:
代码:很抱歉加载树模型数据:)
公共部分类主窗口:窗口
{
私有ObservableCollection_进程=新ObservableCollection();
公共主窗口()
{
初始化组件();
processs.Add(新的ProcessInfo
{
CpuUsage=10.3,
MemUsage=48.9,
进程=新的ObservableCollection()
});
var pro=newprocess{Name=“Process1”,processs=newobserveCollection()};
添加(新进程{Name=“SubProcess1”,进程=newobserveCollection()});
进程[0]。进程。添加(pro);
processs.Add(新的ProcessInfo
{
CpuUsage=0,
MemUsage=100,
进程=新的ObservableCollection()
});
var pro2=newprocess{Name=“Process2”,processs=newobserveCollection()};
pro2.processs.Add(新进程{Name=“SubProcess1”,processs=newobserveCollection()});
pro2.processs.Add(新进程{Name=“SubProcess2”,processs=newobserveCollection()});
pro2.processs.Add(新进程{Name=“SubProcess3”,processs=newobserveCollection()});
进程[1].processs.Add(pro2);
}
公开收集过程
{
获取{return\u进程;}
设置{u进程=值;}
}
}
公共类ProcessInfo
{
公共ObservableCollection进程{get;set;}
公共双CpuUsage{get;set;}
公共双MemUsage{get;set;}
}
公共类过程
{
公共字符串名称{get;set;}
公共ObservableCollection进程{get;set;}
}
祝你好运:)你知道,我并不总是邪恶的。该网站上的示例下载链接似乎已关闭。该代码的副本似乎以某种形式在
<Window x:Class="WpfApplication8.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="233" Width="405" Name="UI">
<Grid DataContext="{Binding ElementName=UI}">
<ListView ItemsSource="{Binding Processes}" >
<ListView.View>
<GridView>
<GridViewColumn Header="Process" Width="200" >
<GridViewColumn.CellTemplate>
<DataTemplate>
<StackPanel>
<TreeView BorderThickness="0" ItemsSource="{Binding Processes}" >
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Processes}">
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</StackPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="CPU" >
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding CpuUsage, StringFormat={}{0} %}" TextAlignment="Right" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Memory" >
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding MemUsage, StringFormat={}{0} MB}" TextAlignment="Right" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="VerticalContentAlignment" Value="Top" />
</Style>
</ListView.ItemContainerStyle>
</ListView>
</Grid>
</Window>
public partial class MainWindow : Window
{
private ObservableCollection<ProcessInfo> _processes = new ObservableCollection<ProcessInfo>();
public MainWindow()
{
InitializeComponent();
Processes.Add(new ProcessInfo
{
CpuUsage = 10.3,
MemUsage = 48.9,
Processes = new ObservableCollection<Process>()
});
var pro = new Process{ Name = "Process1", Processes = new ObservableCollection<Process>()};
pro.Processes.Add(new Process { Name = "SubProcess1", Processes = new ObservableCollection<Process>() });
Processes[0].Processes.Add(pro);
Processes.Add(new ProcessInfo
{
CpuUsage = 0,
MemUsage = 100,
Processes = new ObservableCollection<Process>()
});
var pro2 = new Process { Name = "Process2", Processes = new ObservableCollection<Process>() };
pro2.Processes.Add(new Process { Name = "SubProcess1", Processes = new ObservableCollection<Process>() });
pro2.Processes.Add(new Process { Name = "SubProcess2", Processes = new ObservableCollection<Process>() });
pro2.Processes.Add(new Process { Name = "SubProcess3", Processes = new ObservableCollection<Process>() });
Processes[1].Processes.Add(pro2);
}
public ObservableCollection<ProcessInfo> Processes
{
get { return _processes; }
set { _processes = value; }
}
}
public class ProcessInfo
{
public ObservableCollection<Process> Processes { get; set; }
public double CpuUsage { get; set; }
public double MemUsage { get; set; }
}
public class Process
{
public string Name { get; set; }
public ObservableCollection<Process> Processes { get; set; }
}