Почему стиль WPF применяется к родительскому элементу управления? - PullRequest
0 голосов
/ 10 февраля 2011

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

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

Ответы [ 3 ]

1 голос
/ 10 февраля 2011

Чтобы достичь того, что вы ищете, я думаю, вам нужно определить внутренние Style s в Style.Resources.Это заставит все Button в 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 не будет применено к Button в Grid.

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

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

ошибка MC3015: присоединенное свойство 'Button.Background' не определено для 'Grid' или одного из его базовых классов.

0 голосов
/ 10 февраля 2011

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

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

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

0 голосов
/ 10 февраля 2011

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

<Style x:Key="MyStyle" TargetType="Button">
  <Setter Property="Background" Value="Red" />
</Style>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...