views:

1837

answers:

2

I'm new to .NET programming, and trying to learn Silverlight 2 / C#.

I need to declare numeric constants (or better yet, readonly variables), and access them in both XAML and my C# code-behind file.

These values are more appropriately defined in XAML, but if the definition needs to be done in C#, that's better than hard-coding the value in several places.

I found a solution for WPF XAML, but Silverlight apparently doesn't support the syntax (and the solution I found required that the definitions be in the C# file).

TIA!

Reply to Michael

I'm adding this reply as a comment to my original question because the comment editor doesn't allow me to add this much text and I couldn't find another way to respond to your answer.

Thanks for the answer, Michael, but I don’t’ seem to be able to get it to work.

I’m starting with an example from “Pro Silverlight 2 in c# 2008”. The example works fine, but requires me to hard-code the same two values in two places in my XAML, and one place in my C#.

I implemented your solution, and everything built fine, but when I tried to execute the code I got a page error in the browser. I removed all the changes, and verified that things once again ran fine.

I then added the xmlns:sys declaration and sys:Int32 declaration to my App.xaml file. Everything again ran fine, but when I tried to view the Page.xaml file in VS2008, I got a strange error:

undeclared prefix [Line: 6 Position: 30] – Page.xmal, Line 1, Column 1

The preview page was blank.

There was nothing interesting on Line 6, Col 30 of Page.xaml, but in the App.xaml file, that location contains the closing “>” immediately before the integer value 8:

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

If I hit F5, however, the app runs fine in the browser.

I’m running VS2008 SP1 and the Mar 09 Silverlight toolkit.

I can’t understand why the QAPS declaration in the App.xaml application resources section could cause, especially given that I make no reference to it anywhere in the app. Do you have any idea what might be going on?

Another Reply to Michael

You’re correct, I hadn’t added the xmlns:sys declaration to my Page.xaml, but adding it made no difference – I’m still getting the ‘undeclared prefix [Line: 6 Position: 30]’ error in Page.xaml (and the app still runs). Since everything runs OK, I guess this must be an issue in VS2008.

The larger issue was that I was getting a run-time exception when I tried to access QAPS from C#, and I’ve figured out what I was doing wrong to cause it. The problem was that I was apparently accessing the resource before it existed.

I had declared/initialized a private variable to hold the resource value at the class level; when I moved the initialization to the event handler, the problem went away. So I’m guessing that C# class level variables are evaluated before the XAML resources are created.

(As an aside, the 600 character limit on comments is a real pain. As it is, I have to edit my original question to post a reply).

+10  A: 

Put them in your application or page resources:

<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>

Then you can access them via code like this:

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

and via Xaml like this

<TextBlock Text="{StaticResource QPS}"/>
Michael S. Scherotter
+1  A: 

I'm facing the same problem. I'm trying to make an application with some design-time data for the data-binding but when I declare any new xmlns on App.xaml this error bellow starts to appear in the Errors panel on VS2008 (the erro line and position vary from project to project and it is related to App.xaml and not Page.xaml, as Michael already pointed-out). Blend doesn't have this problem and everything work fine there.

undeclared prefix [Line: 6 Position: 30]

The primary goal for me with this is to be able to see some data from the data-binding in design time (and, since it works in Blend, I'm good) but it would be nice if this worked in VS2008 as well. Does anyone know if this is a known issue? If not, where can we report it?