如何以编程方式访问ContentTemplate中定义的元素?

假设我已经创建了一个UserControl,其中包含在XAML中定义的以下ContentTemplate:

      

如何在代码中访问“myEllipse”元素,以便例如我可以通过“myEllipse.Height”找到它的高度? 我无法直接通过名称访问它。 我尝试使用以下方法创建对它的引用:

 Ellipse ellipse = ContentTemplate.FindName("myEllipse",this) as Ellipse; 

它在我运行程序时崩溃,说它无法创建我的类的实例。 也许我没有正确使用FindName。 如果有人可以帮助我,我将不胜感激。

谢谢,

达拉尔

要在DataTemplate上使用FindName,您需要引用ContentPresenter。 请参阅Josh Smith的文章如何将FindName与ContentControl一起使用 。

您实际想要做的是使用ControlTemplate而不是DataTemplate。 这应该更容易使用,并允许您的控件的用户应用他们自己的内容模板或使用隐式模板。 如果您这样做:

         

然后在代码中(可能在OnApplyTemplate覆盖中),您将能够执行此操作:

 var ellipse = Template.FindName("myEllipse", this) as Ellipse; 

您还应该使用TemplatePartAttribute来装饰您的类,如下所示:

 [TemplatePart(Name="myEllipse", Type = typeof(Ellipse))] 

因此,如果有人重新模板化控件,他们就知道提供具有该名称的Ellipse元素。 (如果该类仅在内部使用,则不太重要。)

最后,如果你想要做的只是改变Ellipse的颜色,那么你可能只想使用数据绑定。 您可以在控件上创建一个EllipseColor依赖项属性,只需设置Stroke="{TemplateBinding EllipseColor}"

尝试

  

而不是以编程方式更改它。

这里有一个类似的例子,蓝色填充椭圆。 http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter.aspx