C# 如何获取包含ItemsControl内容的面板实例?

C# 如何获取包含ItemsControl内容的面板实例?,c#,.net,wpf,controls,custom-controls,C#,.net,Wpf,Controls,Custom Controls,每个ItemsControl的内容都存储在右侧面板中?我们可以这样指定要在XAML中使用的面板: <ListView Name="LView"> <ListView.ItemsPanel> <ItemsPanelTemplate > <StackPanel/> </ItemsPanelTemplate> </ListView.ItemsPanel> &

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

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

我的问题是如何获取特定
项控件
ItemsPanel
属性(类型为
ItemsPanelTemplate
)中使用的
面板的实例?例如,从上面的代码示例中调用
ListView
LView

我不能使用
Name
属性或
x:Name
,这必须适用于任何
ItemsControl
控件,即使是使用默认
ItemsPanel
的控件


如果不清楚,请评论,我认为有非常简单的解决方案。如果它看起来很复杂,那只是因为我不能正确地解释它。

我不能为您提供工作代码,但请看一看 .
使用该类,您可以将可视化树向下遍历到模板和面板。

这有点棘手,因为您不知道面板的名称,因此无法使用FindName等。这适用于存在
ItemsPresenter
的大多数情况

private Panel GetItemsPanel(DependencyObject itemsControl)
{
    ItemsPresenter itemsPresenter = GetVisualChild<ItemsPresenter>(itemsControl);
    Panel itemsPanel = VisualTreeHelper.GetChild(itemsPresenter, 0) as Panel;
    return itemsPanel;
}
专用面板GetItemsPanel(DependencyObject itemsControl)
{
ItemsPresenter ItemsPresenter=GetVisualChild(itemsControl);
Panel itemsPanel=VisualTreeHelper.GetChild(itemsPresenter,0)作为面板;
返回项spanel;
}
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;
}
private static T GetVisualChild(DependencyObject父对象),其中T:Visual
{
T child=默认值(T);
int numVisuals=VisualTreeHelper.GetChildrenCount(父级);
对于(int i=0;i
然而,ItemsPanel并不总是被使用。请参见Ian Griffiths的精彩解释

protected Panel ItemsHost {
    get {
        return (Panel) typeof (MultiSelector).InvokeMember("ItemsHost",
            BindingFlags.NonPublic | BindingFlags.GetProperty | BindingFlags.Instance,
            null, this, null);
    }
}
这就像我的
项目控件中的一个符咒!这就是说,它确实在
面板
内部有
IsItemsHost=“True”
,但如果没有它,它甚至可以工作


诀窍来自此线程:

您试图从何处获取该实例?它是来自
ItemsControl
还是来自其中的一个项目模板?确切地说是来自
ItemsPanelTemplate
。我绝对不想从项目模板中获取它。我是否正确理解了你的问题,或者你在寻找其他东西?@Meleak:在pivotnig的回答之后,我能够找到一些解决方案-我所需要的只是一个事实,即有一个VisualTreeHelper类。我的代码看起来与您提供的非常相似,我不确定是否存在差异,也不确定我的代码是否始终有效(可能存在一些我不知道的泄漏…)。过一段时间我会接受其中一个答案。
   private object FindItemControl(ItemsControl itemsControl, string controlName, object item)
    {
        ContentPresenter container = itemsControl.ItemContainerGenerator.ContainerFromItem(item) as ContentPresenter;
        container.ApplyTemplate();
        return container.ContentTemplate.FindName(controlName, container);
    }