如何通过代码隐藏访问 ControlTemplate 的命名元素?

How can I access a named element of a ControlTemplate through code-behind?

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

这是 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

我看过:

上面的链接是我如何获得我正在使用的代码的,但出于某种原因,g 总是 null。我对 ContentTemplate 做错了吗?如有任何帮助,我们将不胜感激!

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

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

这里真正的问题是你在混合技术。您正试图在主 window 的后面代码中使用一些用于获取无形控件模板的东西。如果您没有 运行 更多问题,我会感到惊讶。

相反,我建议研究 How to Create Lookless Controls 并重新设计您的应用程序。这不需要太多努力,而且一切都会很好地结合在一起。