Dynamic Resource y StaticResource Diferencias

Otra de las preguntas mas demandadas es la diferencia que hay entre StaticResource y DynamicResource en WPF. La diferencia es clara: StaticResource son evaluados en tiempo de carga del ejecutable, mientras que DynamicResource se evalúa en tiempo de ejecución, cuando se necesita.

Pero lo mejor es verlo con un ejemplo para ver cuando nos puede dar problemas, el ejemplo va a constar de un recurso que va a ser una brocha y vamos a tener dos botones que vamos a asociar esta brocha una con StaticResource y otro con DynamicResource

 

El XAML sería

 

<Window.Resources>
        <SolidColorBrush Color="Red" x:Key="BrochaRoja"></SolidColorBrush>
    </Window.Resources>

    <StackPanel>

        <Button Background="{StaticResource BrochaRoja}">Static Resource</Button>

        <Button Background="{DynamicResource BrochaRoja}">Dynamic Resource</Button>

        <Button x:Name="CambiarBrocha" Click="CambiarBrocha_Click">Cambiar Brocha</Button>

        <Button x:Name="CambiarRecurso" Click="CambiarRecurso_Click">CambiarRecurso</Button>

    </StackPanel>

 

Si nos vamos al código

 

 SolidColorBrush brochaRoja;

        SolidColorBrush otraBrocha;



        public Window1()
        {
            InitializeComponent();
            Loaded += new RoutedEventHandler(Window1_Loaded);
        }

        void Window1_Loaded(object sender, RoutedEventArgs e)
        {
            brochaRoja = Resources["BrochaRoja"] as SolidColorBrush;

            otraBrocha = new SolidColorBrush(Colors.Blue);


        }


        private void CambiarBrocha_Click(object sender, RoutedEventArgs e)
        {
            if (brochaRoja.Color == Colors.Red)
            {

                brochaRoja.Color = Colors.Blue;

            }

            else
            {

                brochaRoja.Color = Colors.Red;

            }


        }

        private void CambiarRecurso_Click(object sender, RoutedEventArgs e)
        {
            if (FindResource("BrochaRoja") as SolidColorBrush == brochaRoja)
            {

                Resources["BrochaRoja"] = otraBrocha;

            }

            else
            {

                Resources["BrochaRoja"] = brochaRoja;

            }


        }

La pantalla inicial sera

 

image

 

En el botón de cambiar brocha cambiamos el color de la brocha que hemos cargado a través del recurso y que creéis que pasara con la definición de arriba, se pondrán los dos botones azules o uno seguirá azul  y otro se quedara rojo o no pasara nada?

Nos quedara…

 

image

 

 

Si pulsamos cambiar recurso nos quedara

 

image

 

El botón con recurso estático no cambiará porque el recurso ya ha sido evaluado en tiempo de carga.

 

Para elegir entre StaticResource o DynamicREsource nos podremos fijar en

 

StaticResource requiere menos tiempo de CPU pero hace que la carga de la aplicación sea mas lenta, de maneras que si tienes muchos recursos y quieres que la aplicación se cargue rápido deberás balancear entre Static y Dynamic.

Si los recursos son desconocidos en tiempo de compilación deberas utilizar Dynamic, hay dos casos tipicos para esto

  1. Cambio de tema de tu aplicación en runtime
  2. Cuando haces binding a recursos del sistema como fuentes o colores, si quieres que tu aplicación responda a los cambios de configuración de windows

 

 

 

2 comentarios sobre “Dynamic Resource y StaticResource Diferencias”

Responder a anonymous Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *