如何在silverlight中的xaml和c#之间共享数字常量

时间:2009-05-10 16:05:34

标签: c# silverlight xaml silverlight-2.0

我是.NET编程的新手,并且正在尝试学习Silverlight 2 / C#。

我需要声明数字常量(或者更好的是,只读变量),并在XAML和我的C#代码隐藏文件中访问它们。

这些值在XAML中更适当地定义,但如果定义需要在C#中完成,那么比在几个地方对值进行硬编码更好。

我找到了WPF XAML的解决方案,但Silverlight显然不支持语法(我发现解决方案要求定义在C#文件中)。

TIA!

回复迈克尔

我将此回复添加为对原始问题的评论,因为评论编辑器不允许我添加这么多文字,而我找不到其他方式来回复您的答案。

谢谢你的回答,迈克尔,但我似乎无法让它发挥作用。

我首先来自“c#2008中的Pro Silverlight 2”中的一个例子。 该示例工作正常,但要求我在我的XAML中的两个位置硬编码相同的两个值,并在C#中一个位置。

我实现了你的解决方案,一切都很好,但是当我尝试执行代码时,我在浏览器中出现了页面错误。我删除了所有更改,并验证事情再次运行良好。

然后我将xmlns:sys声明和sys:Int32声明添加到我的App.xaml文件中。一切都运行良好,但当我试图在VS2008中查看Page.xaml文件时,我得到一个奇怪的错误:

未声明的前缀[行:6位置:30] - Page.xmal,第1行,第1列

预览页面为空白。

在Page.xaml的第6行Col 30上没有任何有趣的内容,但是在App.xaml文件中,该位置在整数值8之前包含结束“>”:

  <sys:Int32 x:Key="QAPS">8</sys:Int32>

但是,如果我点击了F5,那么该应用在浏览器中运行正常。

我正在运行VS2008 SP1和Mar 09 Silverlight工具包。

我无法理解为什么App.xaml应用程序资源部分中的QAPS声明可能会导致,特别是考虑到我在应用程序的任何位置都没有引用它。你知道可能会发生什么吗?

对Michael的另一个回复

你是对的,我没有将xmlns:sys声明添加到我的Page.xaml,但添加它没有区别 - 我仍然得到'未声明的前缀[Line:6 Position:30]'错误在Page.xaml中(应用程序仍在运行)。由于一切运行正常,我想这肯定是VS2008中的一个问题。

更大的问题是,当我尝试从C#访问QAPS时,我遇到了运行时异常,并且我已经弄清楚我做错了导致它。问题是我显然在它存在之前访问了资源。

我已经声明/初始化了一个私有变量来保存类级别的资源值;当我将初始化移动到事件处理程序时,问题就消失了。所以我猜测在创建XAML资源之前会评估C#类级变量。

(顺便说一句,对评论的600个字符限制是一个真正的痛苦。事实上,我必须编辑我的原始问题以发布回复。)

1 个答案:

答案 0 :(得分:19)

将它们放入您的应用程序或页面资源中:

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
             xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <Application.Resources>
        <sys:Int32 x:Key="QPS">8</sys:Int32>
    </Application.Resources>
</Application>

然后您可以通过以下代码访问它们:

if (Application.Current.Resources.Contains("QPS"))
{
    int callsPerSecond = (int) Application.Current.Resources["QPS"];
}

并通过像这样的Xaml

<TextBlock Text="{StaticResource QPS}"/>