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

cas*_*rle 11 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行,第30行没有任何有趣的内容,但是在App.xaml文件中,该位置包含紧接在整数值8之前的结束">":

  <sys:Int32 x:Key="QAPS">8</sys:Int32>
Run Code Online (Sandbox Code Playgroud)

但是,如果我点击F5,应用程序在浏览器中运行正常.

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

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

迈克尔的另一个回复

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

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

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

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

Mic*_*ter 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>
Run Code Online (Sandbox Code Playgroud)

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

if (Application.Current.Resources.Contains("QPS"))
{
    int callsPerSecond = (int) Application.Current.Resources["QPS"];
}
Run Code Online (Sandbox Code Playgroud)

并通过这样的Xaml

<TextBlock Text="{StaticResource QPS}"/>
Run Code Online (Sandbox Code Playgroud)