Вопрос

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

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

1) На экземпляре TreeView («TV»), из кода, сделайте это: TV.ItemsPanel.

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

2) сделать шаблон TreeView, который явно заменяетu003CItemsPresenter /> С вашими собственными элементамиcontrol.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, заполняя дерево. Ну, причина, по которой я хочу получить удержание группы, - это взять немного Часть в премереверериде, но не собираясь во все это, я, конечно, не хочу переписать книгу о том, как макет TreeView. Т.е. делает этот шаг № 2 способ, по-видимому, недействителен точкой даже с использованием TreeView в первую очередь.

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

Это было полезно?

Решение

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

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

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

Другие советы

Ниже приложено дополнение к ответу, данному Давиду выше. Это предлагает способ получить все визуальные дети, которые UIElementS через метод расширения.

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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top