Как получить панель в пределах TreeView (WPF)
-
03-10-2019 - |
Вопрос
Как можно получить панель, которая используется в пределах 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.
Другие советы
Ниже приложено дополнение к ответу, данному Давиду выше. Это предлагает способ получить все визуальные дети, которые 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();