好吧......这让我难住了。我已经覆盖OnContentTemplateChanged
了我的UserControl
子类。我正在检查传入的值newContentTemplate
是否实际上等于this.ContentTemplate
(确实如此)但是当我调用它时......
var textBox = this.ContentTemplate.FindName("EditTextBox", this);
...它引发以下异常...
“此操作仅对应用了此模板的元素有效。”
根据另一个相关问题的评论者,他说你应该传递控件的内容演示者,而不是控件本身,所以我然后尝试了这个......
var cp = FindVisualChild<ContentPresenter>(this);
var textBox = this.ContentTemplate.FindName("EditTextBox", cp);
... whereFindVisualChild
只是 MSDN 示例(见下文)中用于查找关联内容演示者的辅助函数。找到时cp
,它也会引发相同的错误。我难住了!!
这是供参考的辅助函数...
private TChildItem FindVisualChild<TChildItem>(DependencyObject obj)
where TChildItem : DependencyObject {
for(int i = 0 ; i < VisualTreeHelper.GetChildrenCount(obj) ; i++) {
var child = VisualTreeHelper.GetChild(obj, i);
if(child is TChildItem typedChild) {
return typedChild;
}
else {
var childOfChild = FindVisualChild<TChildItem>(child);
if(childOfChild != null)
return childOfChild;
}
}
return null;
}