1

たとえば、私のTreeViewItemのヘッダーはTextBlockとImageで構成されています。それらへの参照を取得するにはどうすればよいですか?

4

2 に答える 2

1

私があなたを正しく理解したかどうかはわかりませんが、要素の視覚的な子を取得したい場合は、とを使用してみてVisualTreeHelper.GetChildくださいVisualTreeHelper.GetChildrenCount

PS:通常、TreeViewItem自体への参照を取得する方が問題があります...

UPDATE(将来の世代のコード例):

private IEnumerable<DependencyObject> GetChildren(DependencyObject parent)
{
    var count = VisualTreeHelper.GetChildrenCount(parent);
    if (count > 0)
    {
        for (int i = 0; i < count; i++)
            yield return VisualTreeHelper.GetChild(parent, i);
    }
    else
        yield break;
}

private DependencyObject FindInTheVT(DependencyObject parent,Predicate<DependencyObject> predicate)
{
    IEnumerable<DependencyObject> layer = GetChildren(parent);

    while (layer.Any())
    {
        foreach (var d in layer)
            if (predicate(d)) return d;

        layer = layer.SelectMany(x => GetChildren(x));
    }

    return null;
}
于 2012-04-12T15:06:09.757 に答える
0

このようなもの(Xamlまたはコードで作成)がある場合:

TreeViewItem Item = new TreeViewItem();

StackPanel HeaderLayout = new StackPanel() { Orientation = Orientation.Horizontal };

HeaderLayout.Children.Add(new Image());
HeaderLayout.Children.Add(new TextBlock() { Text = "tv item" });

Item.Header = HeaderLayout;

次のようなものを使用できます:

foreach (object Control in ((StackPanel)Item.Header).Children)
{
    if (Control is Image)
    {
        //get the image control: Image img = (Image)Control;
    }
    else if (Control is TextBlock)
    {
        //get the textblock: TextBlock tb = (TextBlock)Control;
    }
}

これを行うことはお勧めしません。代わりにカスタムヘッダー(ImageプロパティとTextBlockプロパティを含むクラス)を作成し、それをヘッダーまたはカスタムテンプレートに割り当てるとよいでしょう。

于 2012-04-12T15:13:57.650 に答える