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