如何获取包含ItemsControl内容的Panel实例?

Ras*_*sto 23 .net c# wpf controls custom-controls

每个ItemsControl人的内容都存储在Panel中吗?我们可以指定要在XAML中使用的面板,如下所示:

<ListView Name="LView">
    <ListView.ItemsPanel>
        <ItemsPanelTemplate >
            <StackPanel/>
        </ItemsPanelTemplate>
     </ListView.ItemsPanel>
</ListView>
Run Code Online (Sandbox Code Playgroud)

我的问题是如何在特定PanelItemsPanel属性(类型ItemsPanelTemplate)中使用它的实例ItemsControl?例如从上面的代码示例ListView调用LView

我不能使用Name属性,或者x:Name这必须适用于任何ItemsControl使用默认值的人ItemsPanel.

如果不清楚请评论,我认为有非常简单的解决方案.如果它似乎很复杂,那只是因为我无法正确解释它.

Fre*_*lad 17

这有点棘手,因为您不知道Panel的名称,所以您不能使用FindName等.这适用于大多数情况下ItemsPresenter存在

private Panel GetItemsPanel(DependencyObject itemsControl)
{
    ItemsPresenter itemsPresenter = GetVisualChild<ItemsPresenter>(itemsControl);
    Panel itemsPanel = VisualTreeHelper.GetChild(itemsPresenter, 0) as Panel;
    return itemsPanel;
}
Run Code Online (Sandbox Code Playgroud)

GetVisualChild的实现

private static T GetVisualChild<T>(DependencyObject parent) where T : Visual
{
    T child = default(T);

    int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
    for (int i = 0; i < numVisuals; i++)
    {
        Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
        child = v as T;
        if (child == null)
        {
            child = GetVisualChild<T>(v);
        }
        if (child != null)
        {
            break;
        }
    }
    return child;
}
Run Code Online (Sandbox Code Playgroud)

但是,并不总是使用ItemsPanel.见这个答案由伊恩·格里菲思为一个伟大的解释.


thu*_*eys 3

我无法为您提供工作代码,但请查看 VisualTreeHelper class。使用VisualTreeHelper类,您可以遍历可视化树直至模板和面板。