首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >访问ControlTemplate中的控件

访问ControlTemplate中的控件
EN

Stack Overflow用户
提问于 2013-10-01 20:35:26
回答 7查看 25.7K关注 0票数 26

这是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#都是空的。

这里我漏掉了什么?

EN

回答 7

Stack Overflow用户

发布于 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。

票数 22
EN

Stack Overflow用户

发布于 2013-10-24 21:53:21

尝试以下代码。这将返回模板化的元素。

this.GetTemplateChild("ControlName");
票数 8
EN

Stack Overflow用户

发布于 2013-10-19 08:44:15

您的代码是正确的,但可能不是在正确的位置...只有在应用了模板之后,FindName才会起作用。通常,当您在自定义控件中重写OnApplyTemplate时使用它。由于您不是在创建自定义控件,因此可以在按钮的已加载事件中创建自定义控件。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19116327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档