2017-01-30 15 views
0

У меня есть TextBlock стиль, как это:Могу ли я применить стиль WPF к элементу только в определенном макете?

<Style TargetType="TextBlock" x:Key="FormLabel"> 
    <Setter Property="Height" Value="20" /> 
    <Setter Property="Margin" Value="10" /> 
    <Setter Property="TextAlignment" Value="Right" /> 
    <Setter Property="VerticalAlignment" Value="Center" /> 
</Style> 

Я использую его в Grid форм, основанных, например:

<TextBlock Text="Code" Grid.Row="1" Grid.Column="0" Style="{StaticResource FormLabel}" /> 

Теперь вместо того, чтобы повторять имя стиля на каждом TextBlock в сетке, я бы предпочитают, например, имеет Grid стиля, как:

<Style TargetType="Grid" x:Key="FormGrid"> 
    <Setter Property="Width" Value="400" /> 
    ... 
</Style> 

Тогда я бы, если это возможно, хотел бы изменить свой стиль TextBlock применить только к этому элементу, когда он является дочерним элементом Grid со стилем FormGrid.

Возможно ли это, и если да, то как я могу его достичь?

+0

У вас может быть стиль TextBlock по умолчанию (без ключа x:) в ресурсах сетки. – Clemens

+0

@Clemens Это именно то, что я сказал, что я не хочу. Я хочу стиль только для текстовых полей в 'FormGrid'. – ProfK

ответ

3

Это действительно возможно с использованием неявного стиля в другом стиле в качестве ресурса. Возьмем следующий пример:

... 
<Window.Resources> 
    <Style x:Key="FormGrid" TargetType="Grid"> 
     <Style.Resources> 
      <Style TargetType="TextBlock"> 
       <Setter Property="Height" Value="20" /> 
       <Setter Property="Margin" Value="10" /> 
       <Setter Property="TextAlignment" Value="Right" /> 
       <Setter Property="VerticalAlignment" Value="Center" /> 
      </Style> 
     </Style.Resources> 
     <Setter Property="Width" Value="400" /> 
    </Style> 
</Window.Resources> 
<StackPanel> 
    <Grid Style="{StaticResource FormGrid}"> 
     <TextBlock Text="This text block is styled with FormGrid TextBlock implicit style."/> 
    </Grid>   
    <TextBlock Text="This text block uses the default style."/> 
</StackPanel> 
... 
0

Это не возможно из-за возможностей WPF. То, что вы смотрите здесь, - это CSS, как стилисты. WPF Только позволяет наследование стиля через свойство BasedOn. Я не уверен, что это может быть альтернативой, но вы можете определить этот особый стиль TextBlock как часть этих ресурсов сетки и целевой, чтобы соответствовать любому текстовому блоку внутри него.

<Grid.Resources> 
    <Style TargetType="TextBlock"> 
    <Setter Property="Height" Value="20" /> 
    <Setter Property="Margin" Value="10" /> 
    <Setter Property="TextAlignment" Value="Right" /> 
    <Setter Property="VerticalAlignment" Value="Center" /> 
    </Style> 
</Grid.Resources> 
+0

Хорошая идея, но я должен был бы включить этот стиль в каждую сетку. Спасибо за эту идею, но у Ярика есть то, что выглядит моим идеальным решением. – ProfK

+0

Да, этот способ лучше! –