2011-02-10 4 views
0

Я определил пользовательский стиль WPF. Я хочу, чтобы всякая кнопка в Grid была красной. Но если я определяю этот стиль, то сетка будет красной !! Зачем? Я явно определил Button.Background.Почему WPF-стиль применяется к родительскому элементу управления?

<Window x:Class="WpfApplication2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 

    <Window.Resources> 
     <Style x:Key="MyStyle"> 
      <Setter Property="Button.Background" Value="Red" /> <!-- Only inner buttons --> 
     </Style>    
    </Window.Resources> 

    <Grid Style="{StaticResource MyStyle}"> 
     <Button Content="Go" Margin="29,36,385,239" /> 
    </Grid> 
</Window> 

ответ

0

Не можете ли вы установить TargetType на кнопку, чтобы этот стиль применялся только к кнопке?

<Style x:Key="MyStyle" TargetType="Button"> 
    <Setter Property="Background" Value="Red" /> 
</Style> 
+0

Нет, потому что стиль ДОЛЖЕН быть применен к сетке. И должен содержать все разные стили для разных внутренних элементов управления – Robert

1

Чтобы добиться того, что вы после того, как я думаю, что вы собираетесь должны определить внутренние Style сек в Style.Resources. Это сделает все Button s в Grid забрать «внутренний» Style, если они Явно не использовать другой Style

<Window.Resources> 
    <Style x:Key="MyStyle"> 
     <Style.Resources> 
      <!-- Only inner buttons --> 
      <Style TargetType="Button"> 
       <Setter Property="Background" Value="Red" /> 
      </Style> 
     </Style.Resources> 
    </Style> 
</Window.Resources> 
<Grid Style="{StaticResource MyStyle}"> 
    <Button Content="Go" Margin="29,36,385,239" /> 
</Grid> 

Поскольку Button.Background не вложенное свойство (в отличие, например, TextBlock.Foreground), в Background вон 't применяется к Button s в Grid.

Но что касается «Почему Grid забрать Background« Я не мог сказать вам. Мне кажется, что это ошибка. фон для Button наследуется от Control и фон для Grid наследуется от Panel так, насколько я могу видеть, что значение не должно использоваться Grid, но я мог бы быть что-то отсутствует

также , вы получите следующее сообщение об ошибке, если вы пытаетесь установить Button.Background непосредственно на MC3015 Grid

об ошибке: вложенное свойство «Button.Background» не определено на «Сетка» или один из его базовых классов.

0

К сожалению, стили не работают. Если у вас есть известная коллекция детской, вы можете обмануть с чем-то вроде (некрасиво):

<Setter Property="{Binding RelativeSource={RelativeSource Self} Path=Children[0].Background}" Value="Red" /> 

Конечно, это работает только, если вы знаете индексы детей, и это довольно хрупкая. Я не уверен, что это сработает для вашего дела b/c, вы сказали, что вы должны применить стиль к сетке, так что я предполагаю, что содержимое сетки динамически генерируется.

Смежные вопросы