如何通过代码隐藏访问控件模板的命名元素

本文关键字:元素 控件 何通过 代码 隐藏 访问 | 更新日期: 2023-09-27 17:55:37

我想在代码隐藏中访问原始控件模板中另一个元素正在使用的命名元素之一。

这是 XAML 代码的一个示例(显然原始代码更复杂,否则我只会在 XAML 中执行此操作):

<Window x:Class="Temp.MainWindow" Title="MainWindow">
    <Window.Resources>
        <ControlTemplate x:Key="MyTemplate" TargetType="{x:Type Expander}">
            <Expander Header="Some header">
                <StackPanel>
                    <Grid Name="MyGrid"/>
                </StackPanel>
            </Expander>
        </ControlTemplate>
    </Window.Resources>
    <Grid>
        <Expander Name="expander" Template="{DynamicResource MyTemplate}"/>
    </Grid>
</Window>

我尝试过:

public MainWindow()
{
    InitializeComponent();
    Grid grid = expander.Template.FindName("MyGrid", expander) as Grid;
}

我也试过

Grid grid = expander.Template.Resources.FindName("MyGrid") as Grid;

g总是null.

我看过:

  • 如何从代码隐藏中访问控件模板的元素?
  • 如何访问位于控件模板中的 WPF 控件
  • 如何以编程方式与模板生成的元素进行交互第一部分

上面的链接是我如何获得我正在使用的代码,但由于某种原因,g总是null。 我在内容模板上做错了什么吗? 任何帮助将不胜感激!

如何通过代码隐藏访问控件模板的命名元素

您需要等到模板应用于控件

protected override OnApplyTemplate()
{
    Grid grid = Template.FindName("YourTemplateName") as Grid;
}

这里真正的问题是你正在混合技术。您正在尝试在主窗口的后面代码中使用用于抓取外观控件模板的内容。如果您没有遇到更多问题,我会感到惊讶。

相反,我建议研究如何创建外观控件并重新设计您的应用程序。这不会花费太多精力,而且它们在一起会很好。