代码之家  ›  专栏  ›  技术社区  ›  Nicholas Petersen

如何在树视图(WPF)中获取面板

  •  0
  • Nicholas Petersen  · 技术社区  · 16 年前

    如何获取在 TreeView ?我默认读过 树视图 使用A VirtualizingStackPanel 为此。当我看到 树视图 模板,我看到的只是<itemspresenter/>,它似乎隐藏了使用哪个面板的详细信息。

    可能的解决方案:

    1)在TreeView实例(“TV”)上,从代码执行以下操作:tv.itemspanel。

    问题是,这不会返回面板,而是返回itemspanelTemplate(“获取或设置定义控制项布局的面板的模板”)。

    2)创建一个TreeView模板,用您自己的itemsControl.itemspanel显式替换<itemsPresenter/>。无论如何,我提供了一个特殊的模板,所以在我的场景中这是可以的。然后给你放置在模板中的面板提供一个部件名称,从代码中你可以获得该部件(即面板)。有问题吗?见下文。

    (我正在使用名为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布局机制。实际上,即使有树视图项填充树,也会得到一个空白屏幕。好吧,我想找小组的原因是 一些 作为MeaureOverride的一部分,但在不讨论所有这些内容的情况下,我当然不想重写关于如何布局树视图的书。也就是说,这样做的步骤2的方式似乎使一开始就使用TreeView的观点失效。

    很抱歉,如果这里有一些混乱,谢谢您提供的任何帮助。

    2 回复  |  直到 16 年前
        1
  •  0
  •   Dave Clemmer manu    12 年前

    有一个叫做 VisualTreeHelper 它允许您获取未公开的子控件/控件元素。

    这里有一个链接指向 GetChild 类上的方法,该方法允许您枚举所有子类等:

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

        2
  •  0
  •   Dave Clemmer manu    12 年前

    以下是对上述大卫回答的补充。这提供了一种方法来获得所有的视觉儿童 UIElement 通过扩展方法。

    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();