假设我已经创建了一个UserControl,并在XAML中定义了以下ContentTemplate:
<UserControl.ContentTemplate>
<DataTemplate>
<Ellipse Name="myEllipse" Stroke="White"/>
<ContentPresenter Content="{TemplateBinding Content}"/>
</DataTemplate>
</UserControl.ContentTemplate>
我该如何在代码中访问“myEllipse”元素,以便例如通过“myEllipse.Height”查找其高度?我无法直接通过名称访问它。我尝试创建一个引用来访问它:
Ellipse ellipse = ContentTemplate.FindName("myEllipse",this) as Ellipse;
当我运行程序时,它会崩溃,并说它无法创建我的类的实例。也许我没有正确使用FindName函数。如果有人能帮我解决这个问题,我将非常感激。
谢谢,
Dalal
VisualTreeHelper.GetChild(this, 0)
将返回一个Border。您需要执行类似于VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(this, 0), 0)
的操作。 - QuartermeisterVisualTreeHelper.GetChild(VisualTreeHelper.GetChild(this, 0), 0) as ContentPresenter;
。现在我需要引用我的一个名为'headerLabel'的对象,所以我放置了headerLabel = ContentTemplate.FindName("headerLabel", contentPresenter) as Label;
。但是我收到了InvalidOperationException: This operation is valid only on elements that have this template applied.的错误提示。好吧,教程说要传入ContentPresenter。我已经这样做了。我还尝试将此代码放置在MouseDown事件中,但无济于事。 - DalalcontentPresenter.ContentTemplate == ContentTemplate
,即ContentPresenter是否正在使用您提供的ContentTemplate?在调用FindName
之前尝试调用contentPresenter.ApplyTemplate()
以强制ContentPresenter实例化其模板。 - QuartermeistercontentPresenter.ContentTemplate
并且加上了contentPresenter.ApplyTemplate()
,然后它就可以工作了!太好了!非常感谢你。我当时非常沮丧。如果没有 ApplyTemplate(),它是无法工作的,所以感谢你提到这一点,否则我可能会放弃并使用一个变通方法,即通过它们的加载事件处理程序获取我的对象引用。 - Dalal