首页 文章

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

提问于
浏览
1

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

这是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做错了什么?任何帮助,将不胜感激!

1 回答

  • 1

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

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

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

    相反,我建议调查How to Create Lookless Controls并重新设计您的应用程序 . 这不会花费太多精力,而且一起玩得很好 .

相关问题