Как получить панель в виде дерева (WPF) - PullRequest
0 голосов
/ 20 мая 2010

Как можно получить панель, которая используется в TreeView? Я читал, что по умолчанию TreeView использует VirtualizingStackPanel для этого. Когда я смотрю на шаблон TreeView, все, что я вижу, это , который, кажется, скрывает детали того, какая панель используется.

Возможные решения:

1) На экземпляре дерева ("tv") из кода сделайте следующее: tv.ItemsPanel.

Проблема в том, что это возвращает не панель, а ItemsPanelTemplate («получает или задает шаблон, который определяет панель, управляющую макетом элементов»).

2) Создайте шаблон TreeView, который явно заменяет на ваш собственный ItemsControl.ItemsPanel. В любом случае, я предоставляю специальный шаблон, так что в моем сценарии это нормально. Затем присвойте имя детали панели, которую вы помещаете в этот шаблон, и из кода вы можете получить эту деталь (то есть панель). Проблема с этим? см. ниже.

(я использую элемент управления с именем VirtualTreeView, который получен из TreeView, как показано ниже):

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

Извините, если возникла путаница, спасибо за любую помощь, которую вы можете предложить.

Ответы [ 2 ]

0 голосов
/ 21 мая 2010

Следующее является дополнением к ответу, данному Давидом выше. Это дает возможность получить все визуальные дочерние элементы, которые 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();
0 голосов
/ 20 мая 2010

Существует класс с именем VisualTreeHelper, который позволяет вам получить неэкспонированные дочерние элементы управления / элементы элемента управления.

Вот ссылка на метод GetChild в этом классе, который позволяет вам перечислить все дочерние элементы и т. Д .:

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

...