我正在创建一个名为FooControl的自定义控件,派生自ItemsControl,在themes \ generic.xaml中为其定义了默认样式。
FooControl的默认样式将ItemsPanel属性设置为另一个名为FooPanel的自定义面板,如下所示(我不认为自定义面板的使用对此问题很重要)。
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<local:FooPanel IsItemsHost="True"/>
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
在我的FooControl背后的代码中,我希望能够访问自动创建的FooPanel实例。通过查看反射器,我发现ItemsControl确实有一个名为ItemsHost的属性,但我无法从FooControl访问它,因为ItemsHost是内部的
有人可以告诉我一个可靠的方法来引用FooPanel的实例吗?
答案 0 :(得分:1)
不幸的是ItemsControl控件没有公开对这个元素的引用(事实上,我觉得ItemsControl本身甚至都没有访问它。)
如前一篇文章中所建议的那样使用VisualTreeHelper.GetChild()可能会有效,但如果items控件的重新设置会导致items面板进一步嵌套,那么它将会中断。
获得引用的稍微不那么脆弱(但仍然远非完美)的方法是获取第一个子容器的父容器(假设您的items控件包含至少一个项目)
Panel itemsPanel;
if (Items.Count == 0)
{
itemsPanel = null;
}
else
{
var firstContainer = ItemContainerGenerator.ContainerFromIndex(0);
itemsPanel = VisualTreeHelper.GetParent(firstContainer) as Panel;
}
注意:这仅适用于SL3及更高版本,因为它使用ItemContainerGenerator属性(我相信SL2可能存在解决方法)
答案 1 :(得分:0)
您可以使用VisualTreeHelper.GetChild(...)。我相信它应该是ItemsControl子类的第一个或第二个孩子。