这是xaml:
<Page.Resources>
<ControlTemplate x:Key="WeddingButtonBigTemplate" TargetType="Button">
<Grid>
<Image x:Name="imgNormal" Source="../Images/Married_button2.png"/>
<TextBlock x:Name="textBlock2" Style="{StaticResource RegularBlueSpecialBoldText}" LineHeight="28" LineStackingStrategy="BlockLineHeight" HorizontalAlignment="Center" Margin="10,30,10,70" TextWrapping="Wrap" TextAlignment="Center" VerticalAlignment="Stretch" >
<Run FontSize="20" Text="The event of"></Run>
<Run FontSize="28" Text="{DynamicResource strBride}"></Run>
</TextBlock>
</Grid>
</ControlTemplate>
</Page.Resources>
<Grid HorizontalAlignment="Center" VerticalAlignment="Top" Width="1000">
<Button x:Name="btnWedding" HorizontalAlignment="Left" Margin="10,20,0,-49" VerticalAlignment="Top" Template="{StaticResource WeddingButtonBigTemplate}" Foreground="#FF2B4072" Width="380" Click="btnClick" />
</Grid>
我正在尝试访问名为textBlock2
的TextBlock。
我曾尝试覆盖OnApplyTemplate
,但得到的结果为空。
我试过了:
Grid gridInTemplate = (Grid)btnWedding.Template.FindName("grid", btnWedding);
var ct0 = btnWedding.Template.FindName("textBlock2", btnWedding);
var ct1 = btnWedding.FindName("textBlock2");
var ct2 = btnWedding.FindResource("textBlock2");
gridInTemplate为空(取自MSDN的样本)。
当然,ct#都是空的。
这里我漏掉了什么?
发布于 2013-10-19 19:53:28
如果你已经覆盖了OnApplyTemplate,那么不要对VisualTreeHelper使用FindResource()或Template.FindName()或任何hack。只需使用this.GetTemplateChild("textBlock2");
即可
WPF中的模板有一个自包含的命名镜。这是因为模板被重复使用,并且当控件的多个实例都实例化其模板时,模板中定义的任何名称都不能保持唯一。实例化模板后,调用GetTemplateChild方法返回对来自模板的对象的引用。不能使用FrameworkElement.FindName方法从模板中查找项,因为FrameworkElement.FindName的作用范围更广,而且一旦应用ControlTemplate类本身和实例化的模板之间就没有任何连接。
请查看此链接:
http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.gettemplatechild.aspx
如果你的例子是microsoft example,那么我建议你再读一遍。你可能跳过了一些东西。
http://msdn.microsoft.com/en-us/library/bb613586.aspx
总而言之-在创作自定义控件时使用GetTemplateChild(),例如OnApplyTemplate,在其他情况下使用Template.FindName。
发布于 2013-10-24 21:53:21
尝试以下代码。这将返回模板化的元素。
this.GetTemplateChild("ControlName");
发布于 2013-10-19 08:44:15
您的代码是正确的,但可能不是在正确的位置...只有在应用了模板之后,FindName
才会起作用。通常,当您在自定义控件中重写OnApplyTemplate
时使用它。由于您不是在创建自定义控件,因此可以在按钮的已加载事件中创建自定义控件。
https://stackoverflow.com/questions/19116327
复制相似问题