[英]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.