繁体   English   中英

为什么按钮的内容模板没有对象?

[英]why content template of button does not have object?

我只是在探索Windows Phone运行时应用程序模板 但是我看到一个奇怪的事情。

我在Xaml中定义了Button,并在其中设置了ContentTemplate 我想提取此按钮的ContentTemplate中定义的Image控件。 但这是空的。

XAML代码 :-

<Button x:Name="PlayButton" Click="PlayButton_OnClick">
        <Button.ContentTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal" Name="Panel">
                    <Image x:Name="ControlImg" 
                     Width="100"
                    />
                    <TextBlock Text="text block" />
                </StackPanel>
            </DataTemplate>
        </Button.ContentTemplate>

这是按钮单击事件 :-

private async void PlayButton_OnClick(object sender, RoutedEventArgs e)
{
        var btn = sender as Button;

        var ct = btn.ContentTemplate; // this part is also not showing controls in it when expending ct at runtime.

        var img = btn.FindName("ControlImg") as Image; // coming null 

        var stckpnl = btn.FindName("Panel") as StackPanel;// coming null
}

有人可以检查出这是为什么吗?

编辑 :-我已经解决了我的问题,并达到了这个非常简单的底层,看到这个之后,我只是不明白为什么会这样?

那是奇怪的行为。 它应该在控制模板中具有堆栈面板和图像。 作为解决方法,您可以使用ContentTemplateRoot获取图像和堆栈面板。 我已经测试过了,它正在工作。

((StackPanel)btn.ContentTemplateRoot).Children[0] // image

希望这可以帮助

编辑:

有关FindName为什么不起作用的详细信息,请参见MSDN上的“备注”部分。 这是一些相关的报价

重要说明为了有效地使用FindName方法,您应该了解XAML名称范围的概念,以及如何在XAML加载时创建XAML名称范围,然后在运行时对其进行引用和可能的修改。 有关更多信息,请参见XAML名称范围。 Windows运行时代码中最常见的FindName用法是从XAML页面的InitializeComponent调用中产生。 在这种情况下,仅在加载XAML页面之后才调用FindName。 InitializeComponent提供了基础结构,以便您的代码隐藏代码可以方便地访问XAML加载实例化的任何对象。 然后,您可以将对象引用为变量,该变量与标记声明的x:Name具有相同的名称。 像FindName这样的运行时API正在内存中存在的应用程序的运行时对象树上工作。 当从模板或运行时加载的XAML创建该对象树的一部分时,XAML名称范围通常在该对象树中不连续。 结果是在对象树中可能存在一个给定的FindName范围找不到的命名对象。 在典型的应用程序场景中,您可能会遇到XAML名称范围之间的不连续性,这是通过应用模板来创建对象时,或者是通过调用XamlReader.Load创建对象并随后将其添加到对象树中时。

当您使用DataTemplate时,xaml对象树不是连续的,这就是为什么FindName无法从xaml树中找到控件的原因。

希望这能解释...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM