わかりました...これは私を困惑させました。サブクラスでオーバーライドOnContentTemplateChanged
しました。UserControl
これを呼び出すと、 for に渡された値が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;
}