2009-11-23 7 views
7

Estoy utilizando el tema estándar de WPF Aero.NormalColor.xaml. Y trabaja muy bien. Sin embargo, para la aplicación completa , me gustaría reemplazar el color de primer plano de los cuadros de texto a rojo.Anular el tema estándar en App.xaml

Mi primer intento es que

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary 
       Source="/PresentationFramework.Aero, Version=3.0.0.0, 
       Culture=neutral, PublicKeyToken=31bf3856ad364e35, 
       ProcessorArchitecture=MSIL;component/themes/Aero.NormalColor.xaml"> 
      </ResourceDictionary> 
     </ResourceDictionary.MergedDictionaries> 
     <Style TargetType="TextBox"> 
      <Setter Property="Foreground" Value="Red" /> 
     </Style> 
    </ResourceDictionary> 
</Application.Resources> 

Bueno ... todo el color de primer plano de los cuadros de texto se convierten en rojo. Sin embargo, todos los cuadros de texto pierden el estilo del tema. Sí, sé que debería agregar "Basado en". Mi segundo intento es agregar "Basado en" en la etiqueta de estilo.

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary 
       Source="/PresentationFramework.Aero, Version=3.0.0.0, 
       Culture=neutral, PublicKeyToken=31bf3856ad364e35, 
       ProcessorArchitecture=MSIL;component/themes/Aero.NormalColor.xaml"> 
      </ResourceDictionary> 
     </ResourceDictionary.MergedDictionaries> 
     <Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}"> 
      <Setter Property="Foreground" Value="Red" /> 
     </Style> 
    </ResourceDictionary> 
</Application.Resources> 

Exception is throwwn. Igual que este WPF : Extend Theme's style - StackOverflowException

Eventualmente, logro mi objetivo por esto.

En App.xaml

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary 
       Source="/PresentationFramework.Aero, Version=3.0.0.0, 
       Culture=neutral, PublicKeyToken=31bf3856ad364e35, 
       ProcessorArchitecture=MSIL;component/themes/Aero.NormalColor.xaml"> 
      </ResourceDictionary> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

Y en todas las ventanas y el control del usuario, que tuvo que establecer explícitamente

<UserControl.Resources> 
    <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}"> 
     <Setter Property="Foreground" Value="Red" /> 
    </Style> 
</UserControl.Resources> 

El código anterior es copiar y pegar para muchas veces y no es fácil mantener. ¿Alguien sabe cómo lograr mi objetivo simplemente poniendo el primer plano en rojo por una vez?

Respuesta

2

Creo que se puede añadir el Style a un ResourceDictionary y la fusión que con el tema Aero de esta manera:

<Application.Resources> 
    <ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="/PresentationFramework.Aero, Version=3.0.0.0, 
     Culture=neutral, PublicKeyToken=31bf3856ad364e35, 
     ProcessorArchitecture=MSIL;component/themes/Aero.NormalColor.xaml"> 
     </ResourceDictionary> 

     <!-- Adding the style to a resource dictionary --> 
     <ResourceDictionary> 
     <Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}"> 
      <Setter Property="Foreground" Value="Red" /> 
     </Style> 
     </ResourceDictionary> 

    </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

Esto debería dar a todos sus cuadros de texto color de primer plano de color rojo sin tener que especificar explícitamente que en cada ventana y control de usuario.

+0

Funcionó para mí - Gracias. – djskinner

+0

Funcionó para mí, pero debería colocar el estilo de la caja de texto en un archivo de diccionario de recursos separado (por ejemplo, TextBoxStyles.xaml) y simplemente agregar un al diccionario fusionado. De lo contrario, es posible que enfrente un error con diccionarios fusionados que da como resultado una situación en la que el estilo no se aplica al primer cuadro de texto que se crea ... – Schweder

1

Tuve el mismo problema y probé el enfoque de Oskar. Sin embargo, causó un comportamiento extraño. Particularmente, los estilos no se aplicaron a algunos controles, mientras se aplicaban a otros controles del mismo tipo. Y no pude encontrar ninguna diferencia importante entre estos controles.

continué la búsqueda de la solución y encontré uno aquí: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/91718816-8674-4ad8-a3c8-ae283bebe224/

Todavía no es perfecta y clara, pero funciona, al menos para mí.

En resumen, se puede conseguir la idea desde el siguiente código:

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary> 
       <ResourceDictionary.MergedDictionaries> 
        <ResourceDictionary Source="/PresentationFramework.Aero, Version=3.0.0.0, 
     Culture=neutral, PublicKeyToken=31bf3856ad364e35, 
     ProcessorArchitecture=MSIL;component/themes/Aero.NormalColor.xaml" /> 
       </ResourceDictionary.MergedDictionaries> 
       <Style x:Key="ExtendedTextBoxStyle" TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}"> 
        <Setter Property="Foreground" Value="Red" /> 
       </Style> 
      </ResourceDictionary> 
     </ResourceDictionary.MergedDictionaries> 
     <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource ExtendedTextBoxStyle}" /> 
    </ResourceDictionary> 
</Application.Resources> 

para el mantenimiento y la legibilidad de estos objetos anidados ResourceDictionary podrían ir a los archivos separados XAML.

0

La respuesta exacta para esta pregunta es establecer todo el estilo personalizado en función del valor del recurso estático del control actual. Sin embargo, algunos controles pueden no tener un estilo predeterminado como ListView o ListViewItem.

<Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}"> 
    <Setter Property="Width" Value="250" /> 
    <Setter Property="Height" Value="25" /> 
</Style> 

Este estilo se puede localizar en cualquier tipo de diccionario de recursos como los recursos de las ventanas, los recursos de la red, recursos de cuadro de texto o diccionario de recursos externos.

Finalmente, debe agregar el tema del diccionario de recursos a los recursos de su aplicación como el siguiente código que agrego el tema Aero a mi aplicación.

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/PresentationFramework.Aero, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=MSIL;component/themes/aero.normalcolor.xaml" /> 
      <ResourceDictionary Source="/Themes/Default.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 
Cuestiones relacionadas