Использование статических объектов в XAML, созданных в коде в Silverlight

Я не мог заставить это работать в 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>

Ответы

Ответ 2

К сожалению, у 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}}"/>

Ответ 3

Фактически вы можете привязываться к статическим свойствам, если класс не является статическим классом. Поэтому, используя предыдущий пример класса Helper:

public class Helper
{
    public static string Value{ get {return Page.Test;} }
}

XAML останется прежним.

Ответ 4

Я только заметил, что у вас был вторичный вопрос о привязке к цвету. Я не думаю, что это можно сделать в Silverlight. Я почти уверен, что минимальным требованием для привязывающей цели в Silverlight является FrameworkElement.

Ответ 5

Статический объект будет создан только один раз и будет сохраняться до конца программы. Статический объект может сохранять свое состояние, даже если оно не находится в области видимости, но видимо только в пределах их локальной области.