Como substituir um estilo global (que não tem um x: Key), ou, alternativamente, aplicar um estilo chamado a todos os controles alvo do tipo?

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

Pergunta

Eu declarei um estilo que eu quero para aplicar a todos os botões no projeto, reside o estilo no ResourceDictionary:

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

Agora, de alguma janela, eu quero herdar desta estilo, mas adicionar um valor:

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

O problema é que ele não herda a partir do estilo global, a fim de herdar eu tenho que atribuir uma chave para o estilo global:

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

E, em seguida, herdam da janela XAML (e / ou substituição - opcional)-lo:

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

O problema é que se você atribuir uma tecla, não é global e você tem que chamá-lo em cada janela / escopo.

Uma solução para a minha pergunta deve ser um dos dois (está mais lá qualquer coisa que eu estou perdendo?):

  1. Tenha um estilo global com uma chave, que é aplicada automaticamente a todos os seus controlos orientados em todo o aplicativo.
  2. Uma maneira de se referir ao estilo sem nome de nível ResourceDictionary sem e substituí-lo.

Eu pensei sobre redeclaring os estilos de perto os estilos nomeados (no ResourceDictionary) que realmente 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}"/

Mas eu estou procurando coisas melhores do que estupidamente redeclare todos os estilos.

Foi útil?

Solução

Tente isto:

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

Eu anunciei meus estilos de base em um ResourceDictionary em App.xaml, se eu substituí-los em uma janela específica como esta, que normalmente funciona.

Outras dicas

Em algum lugar no dicionário recurso global que você definir um estilo base com uma chave. Este estilo de base é direcionado para um tipo que é a base para todos os tipos para o qual pretendem aplicar esse estilo. Então você definir estilos que têm como alvo os tipos que você quer e é baseado no estilo de base mencionado acima.

<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>

Agora, os dois últimos estilos são aplicados a todos os controles IntegerUpDown e DoubleUpDown dentro de sua aplicação sem qualquer menção de uma chave.

Portanto, a regra de base:. O estilo base deve ter a chave para se referir a ele, e os estilos derivados podem não e, portanto, eles podem ser aplicados sem quaisquer chaves - somente por tipos de destino

Gostaria de sugerir que o que você pode estar procurando por aqui é um estilo de mestre ou cenário de comportamento que é geralmente conseguida através da criação de um controle de usuário. Se você fosse criar um novo controle de botão com seu estilo 'global' aplicada a ele, então qualquer lugar que você usaria esse controle você poderia simplesmente adicionar qualquer ' Novo ou estilos de substituição, se / quando eles eram necessários .

Se você não tiver criado um controle de usuário, eles são fáceis de implementar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top