Pregunta

Me gustaría actualizar el estilo de ventanas por defecto de forma dinámica en tiempo de ejecución para que pueda cambiar el Tamaño de Letra y FontFamily dinámicamente en tiempo de ejecución. He encontrado que los estilos en su diccionario de recursos se sellan en tiempo de ejecución y no se pueden cambiar, por lo que utiliza el siguiente método para actualizar el estilo:

<Style TargetType="{x:Type Window}">
    <Setter Property="FontFamily" Value="Arial"/>
    <Setter Property="FontSize" Value="12pt"/>
</Style>

Con el siguiente código:

Style newStyle = (Make a copy of the old style but with the FontSize and FontFamily changed)

// Remove and re-add the style to the ResourceDictionary.
this.Resources.Remove(typeof(Window));
this.Resources.Add(typeof(Window), newStyle);

// The style does not update unless you set it on each window.
foreach (Window window in Application.Current.Windows)
{
    window.Style = newStyle;
}

Hay varios problemas con este enfoque y tengo un par de preguntas de por qué las cosas son como son.

  1. ¿Por qué se selló estilos en tiempo de ejecución, y hay una manera de hacerlos sin sellar?
  2. Cuando vuelva a agregar el nuevo estilo, ¿por qué esto no recogido por todos mis ventanas? ¿Por qué tengo que ir y manualmente aplicarlo a todas las ventanas?
  3. ¿Hay una mejor manera?
¿Fue útil?

Solución

Probablemente sería hacer frente a esto con un "Servicio de ajustes", que expone las propiedades de los distintos ajustes, y despide INPC como lo haría para la unión normal. El siguiente paso que cambiaría ese estilo a ser algo como:

<Style x:Key="MyWindowStyle">
    <Setter Property="FontFamily" Value="{Binding Path=FontFamily, Source={StaticResource SettingsService}, FallbackValue=Arial}"/>
    <Setter Property="FontSize" Value="{Binding Path=FontSize, Source={StaticResource SettingsService}, FallbackValue=12}"/>
</Style>

Con su "Servicio de ajustes" se define como un recurso estático:

<services:SettingsService x:Key="SettingsService"/>

A continuación, en cada ventana de maquillaje de que el estilo se define como un DynamicResource:

<Window Style="{DynamicResource MyWindowStyle}" .... >

A menudo hay mucha confusión en torno a las diferencias entre los recursos estáticos y dinámicos, pero la diferencia básica es estática es un "una vez" el establecimiento mientras dinámica se actualizará la configuración si el recurso cambia.

Ahora bien, si establece las propiedades en su "Servicio de ajustes" se dispararán INPC, que van a actualizar el estilo, que la DynamicResource se darán cuenta y alterar las propiedades de ventana en consecuencia.

Parece que una gran cantidad de trabajo, sino que le da cierta flexibilidad agradable, y todo el "trabajo pesado" se realiza exclusivamente mediante enlaces. Utilizamos una técnica similar en un proyecto que estoy trabajando en este momento por lo que cuando un usuario elige un color de relleno / carrera de las diversas herramientas en la actualización de la barra de herramientas para reflejar los nuevos valores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top