c# - 访问 ControlTemplate 中的控件

标签 c# wpf c#-4.0 controltemplate

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

我在这里错过了什么?

最佳答案

如果您已覆盖 OnApplyTemplate,则不要使用 FindResource() 或 Template.FindName() 或对 VisualTreeHelper 的任何修改。只需使用 this.GetTemplateChild("textBlock2");

WPF 中的模板有一个独立的名称范围。这是因为模板被重复使用,并且当控件的多个实例各自实例化其模板时,模板中定义的任何名称都不能保持唯一。调用 GetTemplateChild 方法以返回对模板实例化后来自模板的对象的引用。您不能使用 FrameworkElement.FindName 方法从模板中查找项目,因为 FrameworkElement.FindName 在更一般的范围内起作用,并且一旦应用 ControlTemplate 类本身和实例化模板之间就没有连接。

查看此链接:

http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.gettemplatechild.aspx

如果你的例子是微软的例子,那么我建议你再读一遍。您可能跳过了某些内容。

http://msdn.microsoft.com/en-us/library/bb613586.aspx

总结 - 在创作自定义控件时使用 GetTemplateChild(),例如OnApplyTemplate,其他情况使用Template.FindName。

关于c# - 访问 ControlTemplate 中的控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19116327/

相关文章:

c# - 删除按钮 wpf 上的蓝色突出显示

wpf - 一键使用两个 MultiDataTrigger

wpf - 将 WPF 与 WinForm 应用程序混合使用?

c# - UserControl 键盘焦点

c# - 在 Autofac 中,RegisterAssemblyOpenGenericTypes 和 RegisterAssemblyTypes 与 AsClosedTypesOf 之间有什么区别?

entity-framework - 如何为 MS Access 数据库使用 Entity Framework

c# - 字符串数组到字符串转换所需的 Linq 语法

c# - 使用 Type 变量声明变量

c# - 委托(delegate)/事件 winform c# 不工作 - 订阅者/监听器始终为空

c# - 我需要在 C# 中使用 For 循环比较 2 个字符串