引用在xaml中声明为静态res的自定义obj为null。为什么?

时间:2010-01-11 21:53:10

标签: silverlight xaml silverlight-3.0 code-behind nullreferenceexception

我有一个小的Silverlight 3测试应用程序。这是一个学习Silverlight,XAML,绑定等的练习。我有一个小测试类(Test),它有三个属性; Val1,Val2和Sum。我在XAML中声明了一个资源如下:

<UserControl.Resources>
    <app:Test x:Name="xamlTestObj"></app:Test>
</UserControl.Resources>

我在用户控件上有一个按钮。此按钮背后的代码如下所示:

        xamlTestObj.Val1 += 100;
        xamlTestObj.Val2 += 300;

解决方案构建成功,但是当我运行它时,我在引用xamlTestObj时在按钮处理程序中得到NullReferenceException。如果我将对象拉出用户控件的资源列表,我就能成功执行按钮单击。像:

        Test xamlTestObj = (Test)Resources["xamlTestObj"];
        xamlTestObj.Val1 += 100;
        xamlTestObj.Val2 += 300;

令我困惑的是为什么我需要将对象拉出资源列表。在我看来,如果编译器可以看到xamlTestObj引用它应该在它声明的作用域的生命周期中“活动”(在这种情况下,用户控件)。 WPF控件以这种方式运行。也就是说,我可以访问我在用户控件上放置的任何文本框和按钮。

任何人都可以为我解决这个问题吗?

谢谢: - )

1 个答案:

答案 0 :(得分:1)

据我所知,只有可视树中的元素被加载到InitializeComponents方法的相应字段中。资源不是可视化树的一部分,它们仅在需要时加载,因此它们的相应字段保持为空。

顺便说一下,您应该使用x:Key而不是x:Name来获取资源