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

时间:2011-01-20 07:55:08

标签: c# .net wpf controls custom-controls

每个ItemsControl的内容都存储在Panel中吗?我们可以像这样指定要在XAML中使用的面板:

<ListView Name="LView">
    <ListView.ItemsPanel>
        <ItemsPanelTemplate >
            <StackPanel/>
        </ItemsPanelTemplate>
     </ListView.ItemsPanel>
</ListView>

我的问题是如何获取特定Panel的{​​{1}}属性(类型ItemsPanel)中使用的ItemsPanelTemplate实例?例如,来自代码示例的名为ItemsControl的{​​{1}}?

我无法使用ListView属性或LView,这对任何使用默认Name的{​​{1}}都必须有效。

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

4 个答案:

答案 0 :(得分:17)

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

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

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;
}

但是,并不总是使用ItemsPanel。请参阅Ian Griffiths的this answer作为一个很好的解释。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

protected Panel ItemsHost {
    get {
        return (Panel) typeof (MultiSelector).InvokeMember("ItemsHost",
            BindingFlags.NonPublic | BindingFlags.GetProperty | BindingFlags.Instance,
            null, this, null);
    }
}

这就像我ItemsControl中的魅力一样!也就是说,IsItemsHost="True"内部确实有Panel,但如果没有它,它甚至可以正常工作。

Trick来自这个帖子:Can I access ItemsHost of ItemsControl using reflection?

答案 3 :(得分:0)

export AWS_ACCESS_KEY_ID=aws_access_key_id
export AWS_SECRET_ACCESS_KEY=default_secret_key