используя стиль в WPF - PullRequest
       22

используя стиль в WPF

0 голосов
/ 13 апреля 2010

В моем приложении я использую словарь ресурсов ShinyBlue.xaml, который имеет этот код для элемента управления GroupBox:

    <Style TargetType="{x:Type GroupBox}">

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GroupBox}">
                <Grid SnapsToDevicePixels="true">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="6" />
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="6" />
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="*" />
                        <RowDefinition Height="6" />
                    </Grid.RowDefinitions>
                    <Border Grid.ColumnSpan="4" Grid.RowSpan="4"
                            Background="{DynamicResource LightBrush}"
                            CornerRadius="4,4,4,4"
                            BorderThickness="1,1,1,1" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

   </Style>

Эти стили, общие для всех приложений. Но в одной из форм я хочу изменить Background на Transparent. Я хочу переопределить только свойство Background, но оно не работает

<Style TargetType="GroupBox" BasedOn="{StaticResource {x:Type GroupBox}}">
    <Setter Property="Background" Value="Transparent"/>
</Style>

Код выше не работает должным образом.

Как я могу изменить GroupBox Background в определенной форме?.

1 Ответ

0 голосов
/ 13 апреля 2010

Ваш ControlTemplate фактически не использует свойство Background, но он присваивает конкретное значение свойству Background границы, а именно {DynamicResource LightBrush}. Теперь, когда вы устанавливаете свойство Background локально, это не имеет никакого эффекта, потому что Border по-прежнему использует ресурс LightBrush.
Вы должны использовать TemplateBinding s, чтобы сделать правильный фон в вашем контроле следующим образом:

<Style TargetType="{x:Type GroupBox}">
    <!-- set default value for the template -->
    <Setter Property="Background" Value="{DynamicResource LightBrush}" />

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GroupBox}">
                <Grid SnapsToDevicePixels="true">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="6" />
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="6" />
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="*" />
                        <RowDefinition Height="6" />
                    </Grid.RowDefinitions>
                    <!-- Note the new TemplateBinding for the Background property! -->
                    <Border Grid.ColumnSpan="4" Grid.RowSpan="4" Background="{TemplateBinding Background}" CornerRadius="4,4,4,4" BorderThickness="1,1,1,1" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

</Style>

Таким образом, Border фактически использует свойство Background для GroupBox. Чтобы по умолчанию использовать LightBrush, я добавил Setter, который определяет значение по умолчанию для свойства Background. Это значение затем может быть переопределено путем локальной установки свойства Background в вашем GroupBox.

...