2010-09-07 2 views
15

Мы только что начали с XAML и по-прежнему боремся с основными проблемами: Исходя из CSS, мы хотели бы определить общий стиль кнопки с настраиваемым шаблоном управления, а затем второй стиль наследуем все, начиная с первого стиля, используя «basedon. Этот второй стиль затем должен переопределять такие свойства, как «цвет переднего плана» (который работает), а также свойства дочерних элементов внутри нашего настраиваемого шаблона, такие как «цвет фона», например, включенного элемента границы и т. Д. (Который не работает).Как наследовать стиль XAML и переопределить свойство дочернего элемента?

Что общего подхода идти о таких вещах? Как далеко мы можем пойти со стилями каскадных?

Ура!

ответ

6

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

Например, это создает шаблон кнопки с элементом управления границей и привязывает фон границы к свойству «Фон» кнопки. Установив свойство Background для Button в других стилях, он изменит свойство Background на границе.

<StackPanel> 
    <StackPanel.Resources> 
     <Style x:Key="BaseButtonStyle" TargetType="Button"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="Button"> 
         <Border 
          BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}" 
          Background="{TemplateBinding Background}"> 
          <ContentPresenter/> 
         </Border> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
     <Style x:Key="BlueButtonStyle" TargetType="Button" 
       BasedOn="{StaticResource BaseButtonStyle}"> 
      <Setter Property="Background" Value="Blue"/> 
     </Style> 
     <Style x:Key="RedButtonStyle" TargetType="Button" 
       BasedOn="{StaticResource BaseButtonStyle}"> 
      <Setter Property="Background" Value="Red"/> 
     </Style> 
    </StackPanel.Resources> 
    <Button Style="{StaticResource RedButtonStyle}">Red</Button> 
    <Button Style="{StaticResource BlueButtonStyle}">Blue</Button> 
</StackPanel> 

Многие из свойств на Control предназначены для использования в шаблонах управления и не будут влиять на другое поведение, если они изменены. Это BorderBrush, BorderThickness, Background, Padding, HorizontalContentAlignment и VerticalContentAlignment.

23

Вы можете использовать унаследованный стиль, без ключа справки:

<Grid> 
    <Grid.Resources> 
     <!-- Definition of default appearance of a button --> 
     <Style TargetType="Button" x:Key="Default"> 
      <Setter Property="Background" Value="Red"></Setter> 
      <Setter Property="FontFamily" Value="Segoe Black" /> 
      <Setter Property="HorizontalAlignment" Value="Center" /> 
      <Setter Property="FontSize" Value="32pt" /> 
      <Setter Property="Foreground" Value="#777777" /> 
     </Style> 
     <!-- Define general style that based is base on the default style of the button without a key reference--> 
     <Style TargetType="Button" BasedOn="{StaticResource Default}"/> 

     <!-- In sub style override the properties you need --> 
     <Style BasedOn="{StaticResource Default}" TargetType="Button" x:Key="SubButton" > 
      <Setter Property="FontSize" Value="8pt" /> 
     </Style> 

    </Grid.Resources> 

    <Button Content="Main" Height="51" HorizontalAlignment="Left" Margin="154,72,0,0" Name="button1" VerticalAlignment="Top" Width="141" /> 
    <Button Content="Sub" Style="{StaticResource SubButton}" Height="51" HorizontalAlignment="Left" Margin="154,162,0,0" Name="button2" VerticalAlignment="Top" Width="141" /> 
</Grid> 
10

У меня есть (В моем WPF приложения) по умолчанию (базовые) типы, определенные в ResourceDictionary в App.xaml (в проекте запуска). Например, для кнопки следующим образом.

<Style TargetType="Button"> 
     <Setter Property="Margin" Value="5"/> 
     <Setter Property="FontWeight" Value="DemiBold"/> 
     <Setter Property="FontSize" Value="16"/> 
    </Style> 

Во всех представлениях я использую (по умолчанию) этот общий стиль (автоматически унаследованный)! Когда мне нужно изменить или добавить какое-либо свойство в стиле по умолчанию (определенное в App.xaml), я создаю новый стиль, основанный на стиле по умолчанию.

<Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}"> 
     <!-- change --> 
     <Setter Property="Margin" Value="10" /> 
     <!-- add --> 
     <Setter Property="Foreground" Value="Red" /> 
    </Style> 

Когда мне нужно скрыть или сильно переопределить стиль по умолчанию (в какой-то точки зрения) создать новый стиль (на основе ничего).

<Style TargetType="Button"/> 

Вы, конечно, можете продолжить наследование в App.xaml или в определенном виде. Вы можете создать новый стиль с именем по стилю по умолчанию и использовать новый стиль по имени. Например, стиль RedButton и GreenButton.

<Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}" x:Key="RedButton"> 
     <Setter Property="Foreground" Value="Red" /> 
    </Style> 

    <Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}" x:Key="GreenButton"> 
     <Setter Property="Foreground" Value="Green" /> 
    </Style> 

Etc ...

Примечание: вместо определить свой стиль в App.xaml вы можете использовать автономную библиотеку (DLL) только стили и ResourceDictionary из вашей библиотеки в app.xaml ResourceDictionary.MergedDictionaries ,

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