【问题标题】:why content template of button does not have object?为什么按钮的内容模板没有对象?
【发布时间】:2014-07-06 13:36:45
【问题描述】:

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

我在 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
}

谁能看看为什么会这样?

编辑 :- 我已经解决了我的问题并达到了这个最简单的水平,看到这个之后我就是不明白为什么会这样?

【问题讨论】:

  • 您不会在基于 XAML 的技术中“提取” UI。您使用正确的 XAML 和 DataBinding 而不是过程代码。我不知道你想要实现什么,但你应该使用正确的 DataBinding 而不是过程代码。见MSDN
  • @HighCore 这是最简单的示例项目,应该可以工作,实际上数据绑定也存在问题。这是问题的次要部分,不工作这让我发疯。
  • 为什么需要控件?你不能从绑定的对象中得到什么?
  • @KenTucker 是我使用 c# 以编程方式做的事情是错误的。它应该工作与否。对我来说,它不起作用很奇怪。
  • 不,您将无法在数据模板中找到控件。你想做什么

标签: c# xaml windows-phone-8 windows-runtime windows-phone-8.1


【解决方案1】:

这是一种奇怪的行为。它应该在控制模板中有堆栈面板和图像。作为一种解决方法,您可以使用 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 树中找到控件的原因。

希望这能解释...

【讨论】:

  • 我刚刚找到了你在这里写的内容。但我认为它应该可以正常工作?
  • 是的,上面的例子是有效的,我已经测试过了,我会检查为什么 ContentTemplate 没有检索 UI 元素
  • 我不能接受它作为答案,因为我的问题是为什么会出现这种行为。我不想要替代解决方案,因为那不是正确的方法。我知道我应该使用绑定来检查它,但这也显示出意外的行为。但由于这是一种可行的解决方法,+1 应该是正确的。
  • 非常感谢兄弟:)
猜你喜欢
  • 2015-04-11
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多