2010-04-13 4 views
0

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

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

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

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

ответ

0

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

<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 на самом деле использует свойство фона в Groupbox в. Чтобы использовать его по умолчанию LightBrush, я добавил Setter, который определяет значение по умолчанию для свойства Background. Это значение затем может быть отменено путем локальной установки свойства Background в GroupBox.

+0

спасибо. Качественный товар. – Polaris

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