10

私はC#にかなり慣れていません。最初に作成しようとしているのは、ListViewデータバインディングを使用したもので、うまくいきました。

基礎となるモデルに子( など)がある場合、アイテムにツイストボタンを持たせようとしていますTreeView。各子には、すべての最上位アイテムと同じ列があります。

どうすればこれを行うことができますか?このような既存のコントロールはありますか?そうでない場合は、 を のようにドレスアップするか、 のようにドレスアップする方がよいでしょうTreeViewか?ListViewListViewTreeView

私はこのソリューションで概説されている道をたどりましTreeViewた.ルートに入ると、ListView実際にはもっと手間がかかるように見えます。

新しいタスク マネージャーには、作成しようとしているものとまったく同じコントロールがあることに気付きました。これがどのように作成されたのかわかりません。おそらくCですが。

TreeView アイテムを含む ListView

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 分でモックアップを作成することができました。

ここに画像の説明を入力

明らかに、さらに追加したいと思うでしょうがTreeView、列内にをホストするのはかなり簡単に思えListViewます。

ビルドに使用する場合のモックアップ コードを次に示します。

Xaml:

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

コード: Treeible モックアップ データの読み込みについて申し訳ありません :)

   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のものを使用しましたが、ニーズがどれほど複雑かによってはやり過ぎかもしれません。

添付した画像のような 1 つのサブレベルのみが必要な場合は、展開ボタンと子項目にバインドされた単純な ListBox を表示する最初の列に複雑な DataTemplate を持つ ListView を使用して、独自のサブレベルを展開することをお勧めします。

ここでの回答と同様ですが、セルには矢印のようにスタイル設定されたチェックボックス、項目のテキスト、および子 ListBox があります。次に、子 ListBox の可視性をチェックボックスの状態にバインドします。

于 2013-01-23T23:09:35.507 に答える