none
Leer el Style.xaml RRS feed

  • Pregunta

  • hola a todos

    Me pregunto como se puede (por que seguro que se puede xD) leer un ResourceDictionary el valor de por ejemplo unos colores que tengo definidos para mi aplicación.

    <Color x:Key="ColorFondoBoton">#FF24BCEF</Color>
    

    Con el objetivo de poder modificarlos dinamicamente.

    Gracias!!

     

    jueves, 26 de mayo de 2011 8:48

Todas las respuestas

  • Hola ferny6,

    Supongo que lo que quieres es obtener una referencia del recurso para modificarlo en tiempo de ejecucio. Si es asi, primero si el recurso esta en un Window, este tiene una propiedad Resources que lo puedes usar como un diccionario y extraer los recursos a partir de sus nombres. Si tienes los recursos en ResourceDictionary pero estos estan registrados en App.xaml entonces puedes acceder a ellos a traves de App.Current.Resources, el cual tambien es un diccionario y lo utilizas de la misma forma que en la ventana.

     

    <Color x:Key="ColorFondoBoton">#FF24BCEF</Color>
    

     

    En una ventana seria:

     

    Color fondoBoton = (Color)this.Resources["ColorFondoBoton"];
    

     

    En App.xaml seria:


    Color color = (Color)App.Current.Resources["ColorFondoBoton"];

     

    Espero haberte ayudado con esto.

     


    • Marcado como respuesta ferny6 jueves, 26 de mayo de 2011 14:21
    • Desmarcado como respuesta ferny6 jueves, 26 de mayo de 2011 14:25
    jueves, 26 de mayo de 2011 13:01
  • muchas gracias Stalin, ya tengo resuelta una de las partes, xD ahora solo me falta poder cambiar en tiempo de ejecucion ese color. Ya que pretendo hacer un area de administracion donde se seleccione los colores corporativos de una empresa junto con susu imagenes y que la web en SL4 cambie con los colores indicados.

    Lo que he visto es que se elimina el recurso del ResourceDictionary y volver a crearlo con el valor indicado, pero supongo que tendré que implementar el INotifyPropertyChange para que tras el cambio se recargue la web de nuevo, no? aunque no lo tengo muy claro, Alguna sugerencia por favor

     

    Gracias

    jueves, 26 de mayo de 2011 14:25
  • tras obtener el valor del color me he creado un metodo en el APP.xaml para cambiar el valor de una etiqueta

    TryCast(Application.Current, App).ActualizaValor("ColorNuevo", colorBoton)<br/><br/>If App.Current.Resources.Contains(Etiqueta) Then
          App.Current.Resources.Remove(Etiqueta)
          App.Current.Resources.Add(Etiqueta, valor)
    Else
          App.Current.Resources.Add(Etiqueta, valor)
    End If
    

    pero no me cambia el valor, y pienso que es lógico porque se está ejecutando la aplicacion y por lo tanto no se puede modifcar el contenido del App.xaml , no?

    como se podria conseguir?

     

    Un Saludo!!

    jueves, 26 de mayo de 2011 15:12
  • Hola ferny.

    No se muy bien como estas implementando el sistema, pero si es como pienso no es una forma muy adecuada, me explico:

    Aunque se puede hacer lo que dices, los recursos en un principio, son solo eso, recursos que se pueden utilizar en la aplicacion, en este caso estas haciendo uso de recursos usando algun archivo .xaml y quieres modificarlo en tiempo real, pero esto es una tarea un poco engorrosa, ya que si cambia en el futuro vas a tener que modificar el codigo y es posible que incluso reestructurarlo completamente, digamos que es como escribir un literal en el codigo y luego lo quieres en otro idioma.

    Bien, yo lo que haria es crear tantos archivos de recursos como se necesiten, y usar uno u otro dependiendo de la empresa, idioma o cualquier otro parametro, de esta forma solo tienes que modificar el recurso concreto y puedes ampliar tantos como quieras. De modo que para cambiar de recurso, solo tienes que quitar uno con el metodo 'remove()' y cargar el que quieras con el metodo 'Add()'.

    De modo que si cambias de opinion y quieres ayuda para implementar esto ultimo, comentalo.


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/
    jueves, 26 de mayo de 2011 18:36
  • hola David,

    Actualmente tengo un fichero .xaml (Estilo.xaml) con la definicion de estilo para los labels, textbox, barra de navegación de la web, etc, etc y mi idea es sobre ese fichero cambiar el color, ya que solamente se podrá modificar el color. Los colores los tengo definidos

      <!-- ========================================== -->
    	<!-- =     Definicion de colores     = -->
      <!-- ========================================== -->
      <Color x:Key="ColorError">Red</Color>
      <Color x:Key="ColorLabels">#FFD0CB44</Color>
      <Color x:Key="ColorFondoBoton">#FF24BCEF</Color>
      <Color x:Key="ColorBordeBoton">#FF2472EF</Color> 
      <Color x:Key="ColorRellonotb">Black</Color>
      <Color x:Key="ColorBordetb">Black</Color>
      <Color x:Key="ColorMenu">#FFD0CB44</Color>
      <Color x:Key="ColorBordeMenu">#FFFF0000</Color>
      <Color x:Key="ColorEnlaces">#FF2472EF</Color>
      <Color x:Key="ColorRellenoBorderFormulario">Gray</Color>
    

    y mi idea es cambiar el valor de esos colores, a los cuales hago referencia en los estilos de por ejemplo el textbox

    <Style x:Key="TextBoxPrincipal" TargetType="TextBox">
        ...
        <Setter Property="Foreground">
          <Setter.Value>
            <SolidColorBrush Color="{StaticResource ColorRellonotb}"/>
          </Setter.Value>
        </Setter>
        ...
        <Setter Property="BorderBrush">
          <Setter.Value>
            <SolidColorBrush Color="{StaticResource ColorBordetb}"/>
          </Setter.Value>
        </Setter>
        ...
      </Style>
    

     

    Bueno para hacer el cambio me he creado un metodo en el App.xaml que busca la etiqueta del color correspondiente, lo elimina y lo vuelve a crear con el valor nuevo.

    Public Sub ActualizaValor(ByVal Etiqueta As String, ByVal valor As Object)
    
        If App.Current.Resources.Contains(Etiqueta) Then
          App.Current.Resources.Remove(Etiqueta)
          App.Current.Resources.Add(Etiqueta, valor)
        Else
          App.Current.Resources.Add(Etiqueta, valor)
        End If
      End Sub
    

    pero no me hace el cambio del valor ( ni elimina, ni añade ni pasa nada xD).

    Si ni es mucha molestia me gustaria detallaras la implementacion segun la opcion que has indicado antes.

    Muchas gracias!!

     

     

     

     

    lunes, 30 de mayo de 2011 7:32
  • Hola ferny.

    el metodo que te cometnaba yo es el siguiente, te creas tantos archivos de recursos como diferentes colores quieras poner y los pones por ejemplo en la carpeta "Resources/Colors" dentro de tu proyecto, yo siempre tengo clases de ayuda para hacer cosas, en este caso te he modificado una funcion para cambiarte el/los archivos de recursos (la funcion original es para coger los recursos de una cultura especifica).

    de modo que puedes crearte una clase con una funcion estatica, algo como:

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    
    /// <summary>
    /// Nombre de espacio con clases de ayuda en la aplicacion
    /// </summary>
    namespace Zelion.Helpers
    {
     /// <summary>
     /// Clase con funcionalidades de ayuda para usar y mantener los diccionarios de recursos 
     /// </summary>
     class ResourceDictionaryHelper
     {
      /// <summary>
      /// Funcion para establecer los recursos de colores especificos
      /// </summary>
      /// <param name="_name">
      /// Nombre de recurso a establecer
      /// </param>
      public static void SetColorsResource(string _name)
      {
       // obtener la ruta del directorio con los diferentes recursos
       string app = Application.Current.ToString().Replace(".App", "");
       string resourcePath = "/" + app + ";component/Resources/Colors/";
    
       // obtener los recursos antiguos para eliminarlos (todos los que esten dentro del path '/Resources/Colors/'
       IEnumerable<ResourceDictionary> dictionaries = Application.Current.Resources.MergedDictionaries.Where(
        (item) => item.Source.ToString().Contains("/" + app + ";component/Resources/Colors/"));
    
       // eliminar todos los recursos actuales de colores
       foreach (var dictionary in dictionaries)
       {
        Application.Current.Resources.MergedDictionaries.Remove(dictionary);
       }
    
       // AÑADIR RECURSOS ///////////////////////////////////////////////////////////////////////////////////////
       
       #region [Recurso A]
    
       // nombreRecurso.XAML ------------------------------------------------
       // establecer el nuevo diccionario especifico 'nombreRecurso.xaml'   
       try
       {
        Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary()
        {
         Source = new Uri(resourcePath + _name + ".xaml", UriKind.RelativeOrAbsolute)
        });
       }
       // en caso de error, se establecen los recursos por defecto
       catch (Exception ex)
       {
        Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary()
        {
         Source = new Uri(resourcePath + "defaultResource.xaml", UriKind.RelativeOrAbsolute)
        });
       }
    
       #endregion [Recurso A]
    
    
    
       // TODO: mas recursos aqui para otras cosas ...      
      }
     }
    }
    

     

    Esta funcion estatica, la puedes llamar desde el punto de la aplicacion que quieras y te borrara los recursos viejos y te insertara el nuevo que le pases por parametro (la funcion esta modificada sin probar, adaptala a tus necesidades).

    En un principio, esto es todo, solo tienes que llamar a la funcion cuando quieras cambiar de recurso de colores.

    Si tienes algun problema al implementarlo, comentalo.

    NOTA: en el ejemplo que has puesto antes, recomiendo cambiar 'StaticResource' por 'DynamicResource' si vas a trabajar con recursos dinamicos.

     


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/

    martes, 31 de mayo de 2011 17:51