2009-03-12 14 views
13

No pude conseguir que esto funcione en Silverlight, así que creé dos proyectos de prueba. Un proyecto sencillo de WPF y un proyecto simple de Silverlight que solo hacen una cosa: establecer una variable de solo lectura estática pública en el código, y usarla en un XAML totalmente desnudo. En WPF, funciona sin problemas. En Silverlight, me sale el siguiente advertencia del compilador y el tiempo de ejecución de error:Uso de objetos estáticos en XAML que se crearon en código en Silverlight

Advertencia 2 La etiqueta 'estático' no existe en el espacio de nombres XML 'http://schemas.microsoft.com/winfx/2006/xaml' ...

y

de atributo no válido valor {x: Static SilverlightApplication3: Page.Test} para el texto de la propiedad. [Línea: 7 Posición: 25]

Supongo que esto no es compatible con Silverlight 2, ¿o simplemente me falta algo realmente simple? Aquí está el código completo para ambos por si acaso es esto último:

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> 

y aquí está la versión 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> 

Respuesta

5

Por desgracia, parece que Silverlight no admite la unión de las propiedades estáticas: What is the {x:Static sdfsdf} equivalent?

+2

Eso apesta. Gracias por el enlace. No encontré nada definitivo cuando busqué, pero el tipo que respondió en la publicación que vinculó es una autoridad en SL – Rich

+2

WhyTF no los admite? –

6

Desafortunadamente, Silverlight tiene muchos límites con respecto a la funcionalidad y usted acaba de encontrar uno de ellos. StaticMarkupExpression no es compatible con SL2. Usted tampoco puede definirlo usted mismo.

p. Ej. chico de MS: http://blogs.msdn.com/edmaia/archive/2008/11/23/animating-objects-visibility-in-silverlight.aspx

El truco puede ser utilizar un objeto como

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

// implement INotifyPropertyChange if you want updates 
} 

Y luego

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

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

Eso funcionó muy bien como en su ejemplo con una cadena simple, pero cuando trato de usar un objeto Color o una representación de cadena de un color donde puedo codificar uno en el XAML (GradientStop Color = "# FAF6 ...), Aparece el siguiente error: AG_E_PARSER_BAD_PROPERTY_VALUE. ¿Cuáles son las limitaciones? – Rich

+0

Use la sintaxis completa. Una cadena no es un objeto Color, por lo que no puede asignarla a uno.Pero si usa la sintaxis del corchete angular completo, puede especificar un color * object * y funcionará bien. O bien, use un generador como Blend y eche un vistazo a la forma en que marca las propiedades que contienen objetos Color en la sintaxis abreviada. –

+0

'cadena estática pública Valor {get {return Page.Test;}}' también funciona –

3

En realidad se puede unir a las propiedades estáticas, siempre y cuando la clase no es un estático clase. Así, utilizando el ejemplo anterior de la Clase auxiliar:

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

El XAML se mantendrá igual.

+0

Hola Sam, ¿notificará el enlace si se ha actualizado el valor de 'Page.Test'? –

+0

Hmmm, no puedo hacer que funcione. Qué es la sintaxis xaml, puede agregarla aquí –

1

Me acabo de dar cuenta de que tenía una pregunta secundaria sobre el enlace a un color. No creo que se pueda hacer en Silverlight. Estoy bastante seguro de que el requisito mínimo para un objetivo vinculante en Silverlight es FrameworkElement.

+0

Sí ... y si la quiero vincular ahora a lo que creo que es un Color porque puedo declararlo como una cadena hexadecimal, en realidad es un objeto de pincel Cuando todo está dicho y hecho. Ni siquiera recuerdo para qué proyecto estaba haciendo esta pregunta, pero si necesito hacerlo ahora, me imagino que esto funcionaría si expongo un objeto Brush estático en lugar de un color o una cadena de un color. – Rich

-2

Un objeto estático se creará una sola instancia y persistirá hasta el final del programa. Un objeto estático puede conservar su estado incluso cuando no está en el alcance, pero solo es visible dentro de su ámbito local.

+2

Para que comprenda por qué su respuesta objetivamente correcta ha sido votada negativa, no estamos hablando de la palabra clave estática en los lenguajes derivados C, estamos hablando del uso en XAML de la clase StaticExtension que admite referencias de marcado a propiedades de clase que son estáticas en el sentido que tu respuesta describe. –

Cuestiones relacionadas