2017-01-05 2 views
0

Дано:Условный BasedOn в XAML стили

<Style x:Key="ThirdLevelGroupBoxStyle" TargetType="GroupBox" BasedOn="{StaticResource MetroGroupBox}"> 
    <Setter Property="Background" Value="{DynamicResource AccentColorBrush3}" /> 
</Style> 

<Style x:Key="SecondLevelGroupBoxStyle" TargetType="GroupBox" BasedOn="{StaticResource MetroGroupBox}"> 
    <Setter Property="Background" Value="{DynamicResource AccentColorBrush2}" /> 
</Style> 

<Style TargetType="GroupBox" x:Key="WidgetControlTemplateStyle" BasedOn="{StaticResource ThirdLevelGroupBoxStyle}"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding CanExecuteClickCommand}" Value="True"> 
      <!-- TODO: SecondLevelGroupBoxStyle --> 
      <Setter Property="Background" Value="{DynamicResource AccentColorBrush2}" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

<ControlTemplate TargetType="ContentControl" x:Key="WidgetControlTemplate"> 
    <GroupBox ... Style="{StaticResource WidgetControlTemplateStyle}"> 
     <ContentPresenter /> 
    </GroupBox> 
</ControlTemplate> 

ControlTemplate имеет стиль WidgetControlTemplate. Я хочу основать (BasedOn) WidgetControlTemplate условно на ThirdLevelGroupBoxStyle или SecondLevelGroupBoxStyle, чтобы избежать дублирования XAML. Есть ли способ достичь этого?

Если я не могу этого сделать, я должен продублировать определение SecondLevelGroupBoxStyle.

ответ

0

Есть ли способ достичь этого?

Нет, не в XAML. Базовый стиль, основанный на стиле, должен быть известен во время разработки.

Если я не могу этого сделать, я должен продублировать определение SecondLevelGroupBoxStyle.

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

Что вы можете сделать, это использовать триггер, который устанавливает свойство Background для GroupBox либо AccentColorBrush3, либо AccentColorBrush2 вместо того, чтобы пытаться наследовать это свойство из другого стиля. Похоже, вы уже делаете это в своем стиле WidgetControlTemplateStyle. И да, если ThirdLevelGroupBoxStyle/SecondLevelGroupBoxStyle устанавливает более одного свойства, вам также придется установить все это в WidgetControlTemplateStyle.

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

+0

Спасибо, по крайней мере, я знаю, что нет хорошего способа это сделать. И да, это более чем 1 собственность; ( –

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