Cómo anular un estilo global (que no cuenta con una x: Key), o, alternativamente, aplicar un estilo llamado a todos los controles de tipo de orientación?

StackOverflow https://stackoverflow.com/questions/1303634

Pregunta

I declaró un estilo que quiero aplicar a todos los botones en el proyecto, el estilo reside en el ResourceDictionary:

<Style TargetType="StackPanel">
    <Setter Property="Orientation" Value="Horizontal" />
    <Setter Property="VerticalAlignment" Value="Center"/>
    <Setter Property="HorizontalAlignment" Value="Center"/>
</Style>

Ahora, en alguna ventana, quiero heredar de este estilo pero añaden un valor:

<Style TargetType="StackPanel"> 
    <Setter Property="Margin" Value="5"/>
</Style>

El problema es que no hereda de estilo global, con el fin de heredar tengo que asignar una clave para el estilo global:

<Style TargetType="StackPanel" x:Key="StackPanelStyle" />

Y a continuación, en la ventana hereda de XAML (y / o anulación - opcional) que:

<Style TargetType="StackPanel" BasedOn="StackPanelStyle" />

El problema es que si se asigna una clave, no es global y hay que llamar en cada ventana / ámbito.

Una solución a mi pregunta debería ser uno de los dos (¿hay algo más que estoy perdiendo?):

  1. Tener un estilo global con una clave, que se aplica automáticamente a todos sus controles específicos en toda la aplicación.
  2. A manera de referirse al estilo sin nombre ResourceDictionary-nivel sin y anularlo.

pensé en los estilos redeclarandolos cerca de los estilos con nombre (en el ResourceDictionary) que en realidad funciona:

<!--In the ResourceDictionary-->
<Style x:Key="StackPanelStyle" TargetType="StackPanel">
    <Setter Property="Orientation" Value="Horizontal" />
    <Setter Property="VerticalAlignment" Value="Center"/>
    <Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
<!--In the app.xaml-->
<Style TargetType="StackPanel" BasedOn="{StaticResource StackPanelStyle}"/>
<!--In the window/page scope-->
<Style TargetType="StackPanel" BasedOn="{StaticResource StackPanelStyle}"/

Pero estoy en busca de mejores cosas que redeclare estúpidamente todos los estilos.

¿Fue útil?

Solución

Prueba esto:

<Style TargetType="{x:Type StackPanel}" BasedOn="{StaticResource {x:Type StackPanel}}">
  <!-- ... -->
</Style>

he manifestado mis estilos de base en un ResourceDictionary en App.xaml, si les anulan en una ventana específica de este tipo, por lo general funciona.

Otros consejos

En algún lugar en el diccionario de recursos global se define un estilo de base con una llave. Este estilo de base está dirigido a un tipo que es la base para todo tipo para el que tiene la intención de aplicar ese estilo. A continuación, defina estilos que se dirigen a los tipos que desee y se basan en el estilo de base mencionado anteriormente.

<Style
    x:Key="upDownBaseStyle"
    TargetType="{x:Type Control}">
    <Setter
      Property="Margin"
      Value="2" />
    <Setter
      Property="HorizontalAlignment"
      Value="Stretch" />
    <Setter
      Property="VerticalAlignment"
      Value="Center" />
  </Style>

  <Style
    TargetType="{x:Type xceed:IntegerUpDown}"
    BasedOn="{StaticResource upDownBaseStyle}">
  </Style>

  <Style
    TargetType="{x:Type xceed:DoubleUpDown}"
    BasedOn="{StaticResource upDownBaseStyle}">
  </Style>

Ahora los dos últimos estilos se aplican a todos los controles y IntegerUpDown DoubleUpDown dentro de su uso sin ninguna mención de una clave.

Así que la regla de base:. El estilo de base debe tener la clave para referirse a ella, y los estilos derivados no puede, por lo que su aplicación no ofrece ninguna tecla - solamente por tipos de destino

Yo sugeriría que lo que puede estar buscando aquí es un estilo de maestría o escenario de comportamiento que generalmente se logra mediante la creación de un control de usuario. Si se va a crear un nuevo control de botón con su estilo 'global' que se le aplica, a continuación, en cualquier lugar que utiliza ese control puede simplemente añadir ningún ' Nuevos estilos o anular estilos si / cuando se les necesitaba .

Si no ha creado un control de usuario, que son fáciles de implementar.

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