Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在xaml中具有TreeViewItems的ListView_C#_Wpf_Xaml_C# 4.0 - Fatal编程技术网

C# 在xaml中具有TreeViewItems的ListView

C# 在xaml中具有TreeViewItems的ListView,c#,wpf,xaml,c#-4.0,C#,Wpf,Xaml,C# 4.0,我对c#还不太熟悉,我要做的第一件事就是创建一个带有数据绑定的ListView,结果还不错 如果基础模型有任何子项(如TreeView),我现在尝试使项具有一个扭曲按钮。每个子项的列与所有顶级项相同 我该怎么做呢?是否已有这样的控件?如果不是,我最好把TreeView打扮成ListView,或者把ListView打扮成TreeView 我沿着这条路走下去,这条路把一个树视图装扮成了一个,但是最终的结果看起来很糟糕,标题实际上只是一个项目,因此,在ListView中,您失去了所有可以连接到列排序的

我对c#还不太熟悉,我要做的第一件事就是创建一个带有数据绑定的
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; }
    }