GetTemplateChild始终返回null

5
我正在使用以下GetTemplateChild方法,但它总是返回NULL。如何修复这个问题?
[TemplatePart(Name = "textPoints", Type = typeof(TextBlock))]
textPoints = (TextBlock)GetTemplateChild("TextBlock");

你是否找到了解决方案?_Reed Copsey_的答案对于你提供的信息是正确的,但如果仍然无法正常工作,那么也许你可以发布你的控件模板,因为其中可能包含错误。 - Benjamin Gale
1
根据我的经验,在调用FrameworkElement.OnApplyTemplate()之前调用FrameworkElement.GetTemplateChild()是不安全的。尝试子类化控件并重写OnApplyTemplate()方法。 - kevinarpe
2个回答

4

GetTemplateChild 方法的参数是 名称,而不是类型。因为您的 XAML 定义如下:

<TextBlock Text="{Binding}" Foreground="Cyan" 
    x:Name="textPoints"

尝试使用"textPoints"代替"TextBlock"作为检索名称:
[TemplatePart(Name = "textPoints", Type = typeof(TextBlock))]
textPoints = (TextBlock)GetTemplateChild("textPoints");

谢谢,我尝试了下面的代码,但仍然得到相同的结果(即NULL)。textPoints = (TextBlock)GetTemplateChild("textPoints"); 我是不是漏掉了什么? - codematrix
不会,在下面的方法中,public override void OnApplyTemplate()。其他 GetTemplateChild 正常工作。我只有这个 TextBlock 的问题。它是 <ItemsControl.ItemTemplate> 的一部分。在这种情况下,GetTemplateChild() 能起作用吗? - codematrix

2

看起来你试图获取另一个控件的模板子元素,你是从哪里调用GetTemplateChild方法的?

如果你的ItemsControl位于某个UserControl内部,则GetTemplateChild将不起作用,因为你的UserControl的子元素并不是模板子元素的一部分,而且它也不会递归搜索每个子元素的模板子元素。

通常,GetTemplateChild在自定义控件中使用。


看一下上面的代码,它适用于 x:Name="PointsList" 但不适用于 x:Name="textPoints"。你能解释一下吗? 在这种情况下,GetTemplateChild()会起作用吗? - codematrix
不,它不会起作用,因为GetTemplateChild只会在当前模板中查找命名的子项,你的文本框不在当前模板中,而是在模板的模板子项中。你将需要创建另一个从ItemsControl派生的自定义控件,但是如果你的控件在项模板中,则还需要创建项容器作为单独的自定义控件。 - Akash Kava
模板子元素是当前控件的私有元素,只有拥有模板的父级才能访问模板子元素,但是您可以导航 VisualTree 并在任何地方访问子控件。此外,ItemsControl 将具有每个项目的相同名称的多个控件,那么 GetTemplateChild 将返回哪个项目? - Akash Kava
谢谢,Akash。有没有快速/简单的方法来解决这个问题? - codematrix
我不觉得你能够访问,但大多数情况下,我会创建依赖属性并相应地进行绑定。否则,你可以递归地导航VisualTree.GetChild,从你的ItemsControl开始。 - Akash Kava

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