gpt4 book ai didi

silverlight-3.0 - 如何从 ItemsControl 派生的自定义控件访问 ItemsHost

转载 作者:行者123 更新时间:2023-12-04 07:08:29 24 4
gpt4 key购买 nike

我正在创建一个从 ItemsControl 派生的名为 FooControl 的自定义控件,在 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 的实例吗?

最佳答案

不幸的是 ItemsControl 控件没有公开对这个元素的引用(事实上,我觉得 ItemsControl 甚至无法访问它本身)。

使用上一篇文章中建议的 VisualTreeHelper.GetChild() 可能会起作用,但如果项目控件以导致项目面板进一步嵌套的方式重新设置样式,它将中断。

获得引用的一种稍微不那么脆弱(但仍然远非完美)的方法是获取第一个 child 的容器的父级(假设您的项目控件包含至少一个项目)

Panel itemsPanel;

if (Items.Count == 0)
{
itemsPanel = null;
}
else
{
var firstContainer = ItemContainerGenerator.ContainerFromIndex(0);

itemsPanel = VisualTreeHelper.GetParent(firstContainer) as Panel;
}

注意:这仅适用于 SL3 及更高版本,因为它使用 ItemContainerGenerator 属性(我相信 SL2 可能存在变通方法)

关于silverlight-3.0 - 如何从 ItemsControl 派生的自定义控件访问 ItemsHost,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1092054/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com