2009-03-12 11 views
13

in Code in Silverlight erstellt wurden ich das nicht in Silverlight arbeiten konnte, so habe ich zwei Testprojekte. Ein einfaches WPF-Projekt und ein einfaches Silverlight-Projekt, die beide nur eines tun: eine öffentliche statische readonly-Variable im Code festlegen und sie in einem XAML-Framework verwenden, das völlig blank ist. In WPF funktioniert es ohne Probleme. In Silverlight, erhalte ich die folgende Compiler-Warnung und Laufzeitfehler:Die Verwendung von statischen Objekten in XAML, die

Warnung 2 Der Tag 'Static' in XML-Namespace nicht 'http://schemas.microsoft.com/winfx/2006/xaml' existiert ...

und

Invalid attribute Wert {x: Static SilverlightApplication3: Page.Test} für die Eigenschaft Text. [Zeile: 7 Position: 25]

Ich gehe davon aus, dass dies in Silverlight 2 nicht unterstützt wird, oder fehlt mir einfach etwas wirklich einfaches? Hier ist der vollständige Code für beide nur für den Fall ist es dieser:

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> 

und hier ist die SL-Version:

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> 

Antwort

5

Leider sieht es aus wie Silverlight unterstützt keine Bindung an statischen Eigenschaften: What is the {x:Static sdfsdf} equivalent?

+2

Das saugt. Danke für den Link. Ich habe bei meiner Suche nichts Definitives gefunden, aber der Typ, der in der von Ihnen verlinkten Post geantwortet hat, ist eine Autorität auf SL – Rich

+2

WhyTF unterstützt sie das nicht ?! –

6

Leider hat Silverlight viele Grenzen in Bezug auf Funktionalität und Sie finden nur einer von ihnen. StaticMarkupExpression wird von SL2 nicht unterstützt. Sie können es auch nicht selbst definieren.

z.B. Mann aus ms: http://blogs.msdn.com/edmaia/archive/2008/11/23/animating-objects-visibility-in-silverlight.aspx

Der Trick, um statische Eigenschaften wie lange ein Objekt zu verwenden, wie

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

// implement INotifyPropertyChange if you want updates 
} 

Und dann

<Grid.Resources> 
    <somexmlns:Helper x:Key="Helper"/> 
</Grid.Resources> 

<TextBlock Text="{Binding Value, Source={StaticResource Helper}}"/> 
+0

dass, wie in Ihrem Beispiel mit einem einfachen String groß gearbeitet, aber wenn ich versuche, ein Color-Objekt oder eine String-Darstellung einer Farbe zu verwenden, wo ich FAF6 hart Code einen in der XAML (GradientStop color = "# Lage bin ...), erhalte ich folgende Fehlermeldung:.? AG_E_PARSER_BAD_PROPERTY_VALUE Was die Einschränkungen sind – Rich

+0

die vollständige Syntax verwenden eine Zeichenfolge ist keine Farbe Objekt, so dass Sie es zu einem nicht zuordnen können..Aber wenn Sie die volle Klammer-Syntax verwenden, können Sie eine Farbe * Objekt * angeben und es wird gut funktionieren. Oder verwenden Sie einen Generator wie Blend und sehen Sie sich an, wie Eigenschaften mit Color-Objekten in der abgekürzten Syntax markiert werden. –

+0

'öffentliche statische Zeichenfolge Wert {get {return Page.Test;}}' funktioniert auch –

3

Sie können tatsächlich binden kann als die Klasse nicht statisch ist Klasse. Verwenden Sie also das vorherige Beispiel der Helper-Klasse:

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

Der XAML bleibt gleich.

+0

Hallo Sam, wird es die Bindung benachrichtigen, wenn der Wert von 'Page.Test' aktualisiert wurde? –

+0

Hmmm, ich kann es nicht funktionieren. Was die XAML-Syntax, können Sie es hier hinzufügen –

1

Ich habe gerade bemerkt, dass Sie über die Bindung an eine Farbe, um eine sekundäre Frage hatte. Ich denke nicht, dass es in Silverlight gemacht werden kann. Ich bin mir ziemlich sicher, dass die Mindestanforderung für ein verbindliches Ziel in Silverlight FrameworkElement ist.

+0

Ja ... und sah es jetzt Monate später, wenn ich an, was ich denke, eine Farbe zu binden, weil ich es als eine Hex-Zeichenfolge deklarieren kann, ist es wirklich ein Pinsel-Objekt wenn alles gesagt und getan ist. Ich erinnere mich nicht einmal an welches Projekt ich diese Frage gestellt habe, aber wenn ich das jetzt tun müsste, würde ich mir vorstellen, dass dies funktionieren würde, wenn ich ein statisches Brush-Objekt anstelle einer Farb- oder Zeichenketten-Darstellung einer Farbe offen legen würde. – Rich

-2

Ein statisches Objekt wird nur einmal instanziiert und bleibt bis zum Ende des Programms bestehen.Ein statisches Objekt kann seinen Status beibehalten, auch wenn es nicht im Bereich, sondern nur innerhalb seines lokalen Bereichs sichtbar ist.

+2

Nur damit Sie verstehen, warum Ihre sachlich richtige Antwort negativ gewählt wurde, sprechen wir nicht über das statische Schlüsselwort in C-abgeleiteten Sprachen, sondern über die Verwendung der StaticExtension-Klasse in XAML, die Markup-Verweise auf statische Klasseneigenschaften unterstützt in dem Sinne, wie deine Antwort beschreibt. –

Verwandte Themen