Использование статических объектов в XAML, созданных в коде в Silverlight - PullRequest
13 голосов
/ 12 марта 2009

Я не мог заставить это работать в Silverlight, поэтому я создал два тестовых проекта. Один простой проект WPF и один простой проект Silverlight, которые оба выполняют только одно: задайте в коде открытую статическую переменную только для чтения и используйте ее в совершенно голом XAML. В WPF работает безотказно. В Silverlight я получаю следующее предупреждение компилятора и ошибку времени выполнения:

Предупреждение 2 Тег 'Статический' не существует в пространстве имен XML 'http://schemas.microsoft.com/winfx/2006/xaml'...

и

Недопустимое значение атрибута {x: статическое 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>

Ответы [ 5 ]

6 голосов
/ 12 марта 2009

К сожалению, 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}}"/>
5 голосов
/ 12 марта 2009

К сожалению, похоже, что Silverlight не поддерживает привязку к статическим свойствам: Что такое {x: Static sdfsdf} эквивалент?

3 голосов
/ 12 мая 2009

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

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

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

1 голос
/ 13 мая 2009

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

0 голосов
/ 23 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...