用户控件子控件和FindName

3

我有一个使用ContentPropertyAttribute的Silverlight UserControl,用于公开其子面板中Children属性。这使我能够向页面上的面板添加子控件:

<local:MyUserControl>
    <TextBox Name="tbTest" />
</local:MyUserControl>

除了页面上的'tbTest'字段存在但未初始化之外,此方法有效。经过仔细检查,InitializeComponent方法确实尝试使用FindName查找TextBox,但无法找到(返回null)。
经过一些调查,我发现命名范围是问题所在 - UserControl有自己的命名范围,因此它的子项无法使用页面的FindName进行定位,但可以使用UserControl的FindName方法进行定位。
如何更改UserControl,以便InitializeComponent方法可以定位子控件?标准面板(StackPanel、Grid等)似乎没有任何问题,因此必须有解决方案?
谢谢
1个回答

1

这个时候可能有点困难,但最好的做法可能是从ItemsControl派生您的控件,而不是UserControl。然后您就不会遇到名称范围的问题了。

我想作为一种解决方法,您可以使用VisualTreeHelper深入控件来手动设置tbTest字段。


我很惊讶这是必要的,但我会尝试一下。标准面板有什么特别之处,使它们可以避免这个问题?也许我可以从其中一个派生出来? - Barguast
这些面板并没有什么特别之处,而是UserControl很特别。它不是设计成容器控件使用的,但你通过使用ContentPropertyAttribute找到了一种使其工作的方法。如果您的类是面板,则可以从Panel派生,但根据您所描述的情况,ItemsControl似乎更合适,这就是我建议它的原因。 - Josh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接