Как разделить числовую константу между xaml и c # в silverlight - PullRequest
11 голосов
/ 10 мая 2009

Я новичок в программировании на .NET и пытаюсь изучить Silverlight 2 / C #.

Мне нужно объявить числовые константы (или, что еще лучше, переменные только для чтения) и получить к ним доступ как в XAML, так и в моем файле кода C #.

Эти значения более точно определены в XAML, но если определение должно быть сделано в C #, это лучше, чем жесткое кодирование значения в нескольких местах.

Я нашел решение для WPF XAML, но Silverlight, очевидно, не поддерживает синтаксис (и решение, которое я нашел, требовало, чтобы определения были в файле C #).

ТИА!

Ответ Михаилу

Я добавляю этот ответ в качестве комментария к своему первоначальному вопросу, потому что редактор комментариев не позволяет мне добавить столько текста, и я не смог найти другой способ ответить на ваш ответ.

Спасибо за ответ, Майкл, но я не могу заставить его работать.

Я начинаю с примера из «Pro Silverlight 2 в c # 2008». Пример работает нормально, но требует от меня жесткого кодирования тех же двух значений в двух местах в моем XAML и в одном месте в моем C #.

Я реализовал ваше решение, и все было нормально, но когда я попытался выполнить код, я получил ошибку страницы в браузере. Я удалил все изменения и убедился, что все снова прошло нормально.

Затем я добавил объявление xmlns: sys и объявление sys: Int32 в мой файл App.xaml. Все снова работало нормально, но когда я попытался просмотреть файл Page.xaml в VS2008, я получил странную ошибку:

необъявленный префикс [Строка: 6 Позиция: 30] - Page.xmal, Строка 1, Столбец 1

Страница предварительного просмотра была пустой.

В строке 6, полке 30 файла Page.xaml не было ничего интересного, но в файле App.xaml это местоположение содержит закрывающий «>» непосредственно перед целочисленным значением 8:

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

Однако, если я нажму F5, приложение отлично работает в браузере.

Я использую VS2008 SP1 и набор инструментов Silverlight от 09 марта.

Я не могу понять, почему может вызываться объявление QAPS в разделе ресурсов приложения App.xaml, особенно учитывая, что я нигде не ссылаюсь на него в приложении. У вас есть идеи, что может происходить?

Еще один ответ Майклу

Вы правы, я не добавил объявление xmlns: sys в свой Page.xaml, но добавление его не имело значения - я все еще получаю ошибку 'undeclared prefix [Line: 6 Position: 30]' в Page.xaml (и приложение все еще работает). Так как все работает хорошо, я думаю, что это должно быть проблемой в VS2008.

Большая проблема заключалась в том, что я получал исключение во время выполнения, когда пытался получить доступ к QAPS из C #, и я выяснил, что я делал неправильно, чтобы вызвать его. Проблема заключалась в том, что я, по-видимому, получал доступ к ресурсу до его появления.

Я объявил / инициализировал приватную переменную для хранения значения ресурса на уровне класса; когда я переместил инициализацию в обработчик событий, проблема ушла. Поэтому я предполагаю, что переменные уровня класса C # оцениваются до создания ресурсов XAML.

(Кроме того, ограничение в 600 символов для комментариев - это настоящая боль. Как бы то ни было, я должен отредактировать свой исходный вопрос, чтобы опубликовать ответ).

1 Ответ

19 голосов
/ 11 мая 2009

Поместите их в ресурсы своего приложения или страницы:

<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}"/>
...