/// <summary>
/// 获取当前节点下符合条件的子元素
/// </summary>
/// <param name="container">当前节点</param>
/// <param name="item">要查询的元素</param>
/// <returns></returns>
private TreeViewItem GetTreeViewItem(ItemsControl container, object item)
{
if (container != null)
{
//此处是筛选条件 可根据实际情况修改
if (container.DataContext == item)
{
container.Focus();
((TreeViewItem)container).IsSelected = true;
return container as TreeViewItem;
}
//Console.WriteLine(((VideoDeviceModel)container.DataContext).Name);
// 展开当前树节点
if (container is TreeViewItem && !((TreeViewItem)container).IsExpanded)
{
container.SetValue(TreeViewItem.IsExpandedProperty, true);
}
//尝试生成ItemsPresenter和ItemsPanel。
// 通过调用ApplyTemplate。 请注意,在虚拟化情况下,即使项目已标记
// 扩展后我们仍然需要这样做去
// 重新生成视觉效果,因为它们可能已被虚拟化。
container.ApplyTemplate();
ItemsPresenter itemsPresenter =
(ItemsPresenter)container.Template.FindName("ItemsHost", container);
if (itemsPresenter != null)
{
itemsPresenter.ApplyTemplate();
}
else
{
// Tree模板尚未命名ItemsPresenter,
// 执行descendents找到子元素.
itemsPresenter = FindVisualChild<ItemsPresenter>(container);
if (itemsPresenter == null)
{
container.UpdateLayout();
itemsPresenter = FindVisualChild<ItemsPresenter>(container);
}
}
Panel itemsHostPanel = (Panel)VisualTreeHelper.GetChild(itemsPresenter, 0);
// 确保已创建此面板的生成器。
UIElementCollection children = itemsHostPanel.Children;
MyVirtualizingStackPanel virtualizingPanel =
itemsHostPanel as MyVirtualizingStackPanel;
for (int i = 0, count = container.Items.Count; i < count; i++)
{
TreeViewItem subContainer;
if (virtualizingPanel != null)
{
// 将项目置于视图中
// 将生成容器。
virtualizingPanel.BringIntoView(i);
subContainer =
(TreeViewItem)container.ItemContainerGenerator.
ContainerFromIndex(i);
}
else
{
subContainer =
(TreeViewItem)container.ItemContainerGenerator.
ContainerFromIndex(i);
// Bring the item into view to maintain the
// same behavior as with a virtualizing panel.
subContainer.BringIntoView();
}
if (subContainer != null)
{
// Search the next level for the object.
TreeViewItem resultContainer = GetTreeViewItem(subContainer, item);
if (resultContainer != null)
{
return resultContainer;
}
else
{
// 元素不在TreeViewItem中
// 折叠它
subContainer.IsExpanded = false;
}
}
}
}
return null;
}
/// <summary>
/// 在可视化树中搜索特定类型的元素。
/// </summary>
/// <typeparam name="T">元素类型</typeparam>
/// <param name="visual">父元素.</param>
/// <returns></returns>
private T FindVisualChild<T>(Visual visual) where T : Visual
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)
{
Visual child = (Visual)VisualTreeHelper.GetChild(visual, i);
if (child != null)
{
T correctlyTyped = child as T;
if (correctlyTyped != null)
{
return correctlyTyped;
}
T descendent = FindVisualChild<T>(child);
if (descendent != null)
{
return descendent;
}
}
}
return null;
}
/// <summary>
/// 自定义VirtualizingStackPanelBr 用于获取树节点的所有子元素信息(此类随便放到程序能调用的地
///方就行)
/// </summary>
public class MyVirtualizingStackPanel : VirtualizingStackPanel
{
/// <summary>
/// Publically expose BringIndexIntoView.
/// </summary>
public void BringIntoView(int index)
{
this.BringIndexIntoView(index);
}
}