Ответ 1
К сожалению, похоже, что Silverlight не поддерживает привязку к статическим свойствам: Что эквивалентно {x: Static sdfsdf}?
Я не мог заставить это работать в Silverlight, поэтому я создал два тестовых проекта. Один простой проект WPF и один простой проект Silverlight, который делает только одно: установить публичную статическую переменную readonly в коде и использовать ее в полностью голой кости XAML. В WPF работает без сбоев. В Silverlight я получаю следующее предупреждение о компиляторе и время выполнения:
Предупреждение 2 Тег 'Static' не существует в пространстве имен XML http://schemas.microsoft.com/winfx/2006/xaml '...
и
Недопустимое значение атрибута {x: Static SilverlightApplication3: Page.Test} для свойства Text. [Линия: 7 Позиция: 25]
Я предполагаю, что это не поддерживается в Silverlight 2, или я просто пропустил что-то действительно простое? Здесь полный код для обоих на тот случай, если последний:
public partial class Window1 : Window
{
public static readonly string Test = "test";
public Window1()
{
InitializeComponent();
}
}
<Window x:Class="WpfApplication4.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300"
xmlns:WpfApplication4="clr-namespace:WpfApplication4">
<Grid>
<TextBlock Text="{x:Static WpfApplication4:Window1.Test}" />
</Grid>
</Window>
и здесь версия SL:
public partial class Page : UserControl
{
public static readonly string Test = "test";
public Page()
{
InitializeComponent();
}
}
<UserControl x:Class="SilverlightApplication3.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:SilverlightApplication3="clr-namespace:SilverlightApplication3"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
<TextBlock Text="{x:Static SilverlightApplication3:Page.Test}" />
</Grid>
</UserControl>
К сожалению, похоже, что Silverlight не поддерживает привязку к статическим свойствам: Что эквивалентно {x: Static sdfsdf}?
К сожалению, у Silverlight много ограничений по функциональности, и вы только что нашли один из них. StaticMarkupExpression не поддерживается SL2. Вы также не можете определить его самостоятельно.
например. парень из ms: http://blogs.msdn.com/edmaia/archive/2008/11/23/animating-objects-visibility-in-silverlight.aspx
Трюк может заключаться в использовании объекта типа
class Helper{
public string Value {get{return Page.Test;}}
// implement INotifyPropertyChange if you want updates
}
И затем
<Grid.Resources>
<somexmlns:Helper x:Key="Helper"/>
</Grid.Resources>
<TextBlock Text="{Binding Value, Source={StaticResource Helper}}"/>
Фактически вы можете привязываться к статическим свойствам, если класс не является статическим классом. Поэтому, используя предыдущий пример класса Helper:
public class Helper
{
public static string Value{ get {return Page.Test;} }
}
XAML останется прежним.
Я только заметил, что у вас был вторичный вопрос о привязке к цвету. Я не думаю, что это можно сделать в Silverlight. Я почти уверен, что минимальным требованием для привязывающей цели в Silverlight является FrameworkElement.
Статический объект будет создан только один раз и будет сохраняться до конца программы. Статический объект может сохранять свое состояние, даже если оно не находится в области видимости, но видимо только в пределах их локальной области.