好的... 这个问题让我困惑了。在我的UserControl
子类中,我重写了OnContentTemplateChanged
方法。我检查传入的newContentTemplate
的值是否确实等于this.ContentTemplate
(是的),但是当我调用这个...
var textBox = this.ContentTemplate.FindName("EditTextBox", this);
...它抛出了以下异常...
"此操作仅适用于已应用此模板的元素。"
根据另一个相关问题中的评论者所说,您应该传递控件的内容呈现器而不是控件本身,因此我尝试了下面的代码...
var cp = FindVisualChild<ContentPresenter>(this);
var textBox = this.ContentTemplate.FindName("EditTextBox", cp);
...其中FindVisualChild
只是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;
}