10

我对 c# 很陌生,我要做的第一件事是ListView使用数据绑定,结果证明没问题。

如果底层模型有任何孩子(如 ),我现在正试图让项目有一个扭曲按钮TreeView。每个子项将具有与所有顶级项目相同的列。

我该怎么做呢?是否有这样的现有控件?如果不是,我是把a打扮成TreeViewa ListView,还是把a打扮成ListViewa TreeView

我沿着这个解决方案中概述的方式进行了打扮 a TreeView,但最终结果看起来很糟糕,标题实际上只是一个项目,所以你失去了所有可以连接到列排序的漂亮列大小和列按钮进入ListView这样那条路线实际上看起来会更有效。

我注意到新的任务管理器有一个与我正在尝试创建的控件完全相同的控件,我不知道这是怎么做到的?可能在 C 中。

ListView 与 TreeView 项目

4

3 回答 3

13

Microsoft 提供了一个看起来是您正在寻找的样本。可以在此处找到该示例的记录:

http://msdn.microsoft.com/en-us/library/vstudio/ms771523(v=vs.90).aspx

当您构建并运行该示例时,您最终会得到类似于以下内容的内容:

在此处输入图像描述

该示例中完成了大量模板,因此您将能够使事情看起来像您想要的那样。

于 2013-01-23T23:25:39.400 回答
10

这可能会更容易StyleListView我玩得很快,并设法在大约 10 分钟内创建了一个模型。

在此处输入图像描述

显然,您会想要添加更多内容,但TreeViewListView列内托管似乎很容易。

如果您想用于构建,这里是模型代码。

xml:

<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; }
    }

祝你好运 :)

于 2013-01-30T21:51:17.140 回答
2

你所描述的听起来有点像 TreeListView,如果你用谷歌搜索“WPF TreeListView”,你会看到一些可能对你有好处的解决方案。我使用了Telerik的一个,但根据您的需求有多复杂,它可能会有点过分。

如果您只想要一个像您附加的图像一样的子级别,您可能只想使用具有复杂 DataTemplate 的 ListView 滚动您自己的第一列,该列将显示一个展开器按钮和一个绑定到子项的简单 ListBox。

与此处的答案类似,除了您的单元格将具有一个样式为箭头的复选框、项目的文本和一个子列表框。然后将子 ListBox 的可见性绑定到复选框的状态。

于 2013-01-23T23:09:35.507 回答