0

内で使用されるパネルを取得するにはどうすればよいTreeViewですか? デフォルトではこれに a をTreeView使用することを読みましVirtualizingStackPanelた。テンプレートを見るTreeViewと、<ItemsPresenter /> しか表示されず、使用されているパネルの詳細が隠されているように見えます。

可能な解決策:

1) ツリービュー インスタンス (「tv」) で、コードから、tv.ItemsPanel を実行します。

問題は、これがパネルではなく、ItemsPanelTemplate (「項目のレイアウトを制御するパネルを定義するテンプレートを取得または設定する」) を返すことです。

2) <ItemsPresenter /> を独自の ItemsControl.ItemsPanel に明示的に置き換える TreeView テンプレートを作成します。とにかく特別なテンプレートを提供しているので、これは私のシナリオでは問題ありません。次に、そのテンプレート内に配置するパネルにパーツ名を付けます。コードからそのパーツ (つまり、パネル) を取得できます。これの問題?下記参照。

(以下に示すように、TreeView から派生した VirtualTreeView という名前のコントロールを使用しています):

<ControlTemplate x:Key="VirtualTreeViewTemplate" TargetType="{x:Type local:VirtualTreeView}">
    <Border>
        <local:VirtualScrollViewer 
             Style="{StaticResource VirtualScrollViewer}"
             x:Name="PART_VirtualScrollViewer"
                    CanContentScroll="True">
                <!-- instead of: <ItemsPresenter />, use following: -->
                <ItemsControl>
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel
                            Name="PART_ItemsStackPanel"
                            IsItemsHost="True" />
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                </ItemsControl>
        </local:VirtualScrollViewer>
    </Border>
</ControlTemplate>

[見やすくするために、ここでは雑然としたものをすべて取り除きました...]

これに関する問題は次のとおりです。これにより、TreeView レイアウト メカニズムが即座にオーバーライドされます。実際には、TreeViewItems がツリーを埋めている場合でも、空白の画面が表示されます。さて、私がパネルを手に入れたい理由は、MeaureOverride に参加するためですが、そのすべてに立ち入ることなく、ツリービューのレイアウト方法の本を書き直したくはありません。つまり、これをステップ 2 の方法で行うと、最初に TreeView を使用することさえ無効になるようです。

ここに混乱がある場合は申し訳ありませんが、提供できるヘルプに感謝します。

4

2 に答える 2

0

以下は、上記の David による回答の補足です。UIElementこれにより、拡張メソッドを介して sであるすべてのビジュアル チルドレンを取得する方法が提供されます。

public static class WPFXtensions
{
    static public IEnumerable<UIElement> GetDescendantUIElements(this UIElement uiElement)
    {
        int childrenCnt = VisualTreeHelper.GetChildrenCount(uiElement);
        for (int i = 0; i < childrenCnt; i++)
        {
            Visual childVisual = VisualTreeHelper.GetChild(uiElement, i) as Visual;

            if(childVisual == null)
                continue;   

            if (childVisual is UIElement)
            {
                yield return childVisual as UIElement;

                // note: by recursively calling within the loop, we walk the tree all the way down for each
                // UIElement encountered before moving to the next UIElement sibling. 
                foreach (UIElement e in GetDescendantUIElements(childVisual as UIElement))
                    yield return e;
            }
        }
    }
}

 // Use this then like this to retrieve an expected child StackPanel 

StackPanel sp1 = (StackPanel)this.GetDescendantUIElements()
            .First(uiElem => uiElem is StackPanel);

// Get all of this UIElement's descendants (for a diagnostic look); 
// In a run where this was a TreeView, 78 UIElements returned

List<UIElement> uiElements = this.GetDescendantUIElements().ToList();
于 2010-05-21T13:15:27.947 に答える
0

VisualTreeHelper公開されていない子コントロール/コントロールの要素を取得できるようにするクラスがあります。

GetChildこれは、すべての子などを列挙できるそのクラスのメソッドへのリンクです。

http://msdn.microsoft.com/en-us/library/system.windows.media.visualtreehelper.getchild.aspx

于 2010-05-20T19:54:38.473 に答える