gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:58:12 26 4
gpt4 key购买 nike

假设我使用以下在 XAML 中定义的 ContentTemplate 创建了一个 UserControl:

<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。如果有人能帮助我,我将不胜感激。

谢谢,

达拉尔

最佳答案

为了在 DataTemplate 上使用 FindName,您需要引用 ContentPresenter。请参阅 Josh Smith 的文章 How to use FindName with a ContentControl .

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

<UserControl.Template>
<ControlTemplate TargetType="UserControl">
<Grid>
<ContentPresenter/>
<Ellipse Name="myEllipse" Stroke="White"/>
</Grid>
</ControlTemplate>
</UserControl.Template>

然后在代码中(可能在 OnApplyTemplate 覆盖中)你将能够这样做:

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

你还应该用这样的 TemplatePartAttribute 装饰你的类:

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

这样,如果任何人重新模板化您的控件,他们就会知道提供具有该名称的 Ellipse 元素。 (如果该类仅在内部使用,这就不那么重要了。)

最后,如果您只想更改椭圆的颜色,那么您可能只想使用数据绑定(bind)。您可以在控件上创建一个 EllipseColor 依赖属性并设置 Stroke="{TemplateBinding EllipseColor}"

关于c# - 如何以编程方式访问 ContentTemplate 中定义的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3366549/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com