2010-01-28 13 views
5

Estoy intentando extender un estilo base para un TextBlock. Simple pensar en el mundo de WPF, debería ser el mismo en Silverlight. Pero obtengo un error en x: Tipo.¿Cuál es el equivalente de Silverlight 3.0 para BasedOn = "{StaticResource {x: Type TextBlock}}"

¿Cómo puedo traducir BasedOn = "{StaticResource {x: Type TextBlock}}" en Silverlight. ¿Alguien por ahí que logró esto?

Gracias.

+0

Ahora puede hacer esto ahora en Silverlight 5. Consulte mi respuesta a continuación –

Respuesta

5

No hay un equivalente a la uso particular en Silverlight. Silverlight solo admite claves de cadena para acceder a Recursos. Por lo tanto, el uso de {x:Type SomeType} como clave no funciona.

En Silverlight necesita hacer una copia completa del estilo de controles. Puede hacer esto utilizando Blend, que tiene herramientas para hacer esto o copiándolo de la documentación de Silverlight. Control Styles and Templates

Por supuesto, una vez que tiene una copia del estilo inicial, puede modificar su copia o crear otros estilos asignando esta copia a BasedOn para crear un conjunto de variaciones.

+0

Hola Anthony, Temía que alguien diga esto, bueno, no hay nada que hacer luego para ir a trabajar, entonces :( – Calin

0

debería debería ser (y according to Jesse Liberty)
BasedOn="{StaticResource TextBlock}"

+0

Hola Muad'Dib, Aparece "No puedo encontrar un recurso con el Name/Key TextBlock" que en realidad no es cierto porque estoy usando claramente el TwilightBlueTheme de el juego de herramientas Silverlight. – Calin

3

Creo que va a trabajar para ir un poco hacia atrás, puede hacer que su estilo de base

<Style TargetType="Button" x:Key="MyButtonStyle"> 
    <Setter Property="PropertyName" Value="PropertyValue" /> 
</Style> 

entonces se puede basar todos los botones en ese estilo

<Style TargetType="Button" BasedOn="{StaticResource MyButtonStyle}" /> 

Entonces, si es necesario agregar a ese estilo sólo se puede basar en el estilo llamado

<Style TargetType="Button" BasedOn="{StaticResource MyButtonStyle}"> 
    <Setter Property="PropertyName" Value="PropertyValue" /> 
</Style> 

o

<Style TargetType="Button" BasedOn="{StaticResource MyButtonStyle}" x:Key="MyOtherButtonStyle"> 
    <Setter Property="PropertyName" Value="PropertyValue" /> 
</Style> 
0

En realidad se puede hacer esto ahora en Silverlight 5.

En primer lugar, declarar su estilo

<Style x:Key="TextBoxStyle" TargetType="TextBox" BasedOn="{local:Type TypeName=TextBox}"> 

</Style> 

A continuación, es necesario crear un MarkupExtension que funciona tanto en WPF y Silverlight 5 para reemplazar x: Tipo

/// A MarkupExtension which introduces x:Type like syntax to both WPF and Silverlight (Cross-platform). This is used internally 
/// for the themes, but is also useful e.g. when creating custom Control Templates for SciChart 
/// </summary> 
/// <remarks> 
/// Licensed under the CodeProject Open License 
/// http://www.codeproject.com/Articles/305932/Static-and-Type-markup-extensions-for-Silverlight 
/// </remarks> 
/// 
public class TypeExtension : MarkupExtension 
{ 
    /// <summary> 
    /// Initializes a new instance of the <see cref="TypeExtension" /> class. 
    /// </summary> 
    public TypeExtension() 
    { 
    } 

    /// <summary> 
    /// Initializes a new instance of the <see cref="TypeExtension" /> class. 
    /// </summary> 
    /// <param name="type">The type to wrap</param> 
    public TypeExtension(Type type) 
    { 
     Type = type; 
    } 

    /// <summary> 
    /// Gets or sets the type information for this extension. 
    /// </summary> 
    public System.Type Type { get; set; } 

    /// <summary> 
    /// Gets or sets the type name represented by this markup extension. 
    /// </summary> 
    public String TypeName { get; set; } 

    public override Object ProvideValue(IServiceProvider serviceProvider) 
    { 
     if (Type == null) 
     { 
      if (String.IsNullOrWhiteSpace(TypeName)) throw new InvalidOperationException("No TypeName or Type specified."); 
      if (serviceProvider == null) return DependencyProperty.UnsetValue; 

      IXamlTypeResolver resolver = serviceProvider.GetService(typeof(IXamlTypeResolver)) as IXamlTypeResolver; 
      if (resolver == null) return DependencyProperty.UnsetValue; 

      Type = resolver.Resolve(TypeName); 
     } 
     return Type; 
    } 
} 

Probado como trabajar en WPF y Silverlight

Cuestiones relacionadas