泥庭

2010年11月7日

ListViewのVisualTree

Filed under: WPF — タグ: , , — yone64 @ 3:20 PM

ListViewの動作が気になった(※)ので、ListViewのVisualTreeを確認。
ついでなので、VisualTreeをTreeViewで表示できるようにチャレンジ。

※水平方向にはスクロール同期するが、垂直方向には動かない。

結果、ScrollViewerが入れ子になってた。

XAML

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="267" />
            <ColumnDefinition Width="236*" />
        </Grid.ColumnDefinitions>
        <ContentControl Name="contentControl1">
            <ListView Name="listView1" ItemsSource="{Binding}">
                <ListView.View>
                    <GridView>
                        <GridViewColumn Header="列1" DisplayMemberBinding="{Binding Path=Name}"/>
                        <GridViewColumn Header="列2" DisplayMemberBinding="{Binding Path=Value}" />
                    </GridView>
                </ListView.View>
            </ListView>
        </ContentControl>
        <TreeView Grid.Column="1" Name="treeView1" ItemsSource="{Binding}">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Path=Children}">
                    <TextBlock Text="{Binding Path=DisplayString}" />
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
    </Grid>
</Window>

C#

using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using System.Windows.Media;

namespace WpfApplication1
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            listView1.DataContext = new[]
            {
                new {Name = "なまえ1", Value = "あたい1"},
                new {Name = "なまえ2", Value = "あたい2"},
                new {Name = "なまえ3", Value = "あたい3"},
                new {Name = "なまえ4", Value = "あたい4"},
            };
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            treeView1.DataContext = Enumerable.Repeat(new VisualTreeItem((DependencyObject)contentControl1.Content), 1);
        }
    }

    public class VisualTreeItem
    {
        private DependencyObject _d;

        public VisualTreeItem(DependencyObject d)
        {
            _d = d;
            int count = VisualTreeHelper.GetChildrenCount(d);
            Children = new ObservableCollection<VisualTreeItem>(
                Enumerable.Range(0, count)
                        .Select(i => new VisualTreeItem(VisualTreeHelper.GetChild(d, i))));
        }

        public ObservableCollection<VisualTreeItem> Children { get; private set; }

        public string DisplayString
        {
            get
            {
                return _d.ToString();
            }
        }
    }
}

image

コメントする »

まだコメントはありません。

RSS feed for comments on this post. TrackBack URI

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

WordPress.com Blog.

%d人のブロガーが「いいね」をつけました。