2010-09-07 12 views
15

dopiero zaczęliśmy od XAML i nadal walczymy z podstawowymi problemami: Pochodząc z CSS, chcielibyśmy zdefiniować ogólny styl przycisku z niestandardowym szablonem kontrolnym, a następnie drugi styl dziedziczy wszystko od pierwszego stylu za pomocą "basedon". Ten drugi styl powinien następnie zastąpić właściwości, takie jak "kolor pierwszego planu" (który działa), ale także właściwości elementów potomnych w naszym niestandardowym szablonie, takich jak "kolor tła" np. Dołączonego elementu granicy itp. (Który nie działa).Jak dziedziczyć styl XAML i przesłonić właściwość elementu potomnego?

Co znajduje się w ogólne podejście go o takie rzeczy? Jak daleko możemy pójść ze stylów kaskadowych?

Cheers!

Odpowiedz

6

Standardowe podejście do tworzenia dostosowywanego szablonu sterowania polega na użyciu TemplateBinding w szablonie w celu powiązania z właściwościami kontrolki, a następnie w celu ustawienia tych właściwości w stylach potomnych.

Na przykład tworzy szablon przycisku z elementem sterującym Obramowanie i łączy tło obramowania z właściwością tła przycisku. Ustawiając właściwość Tło przycisku w innych stylach, zmienia właściwość Tło obramowania.

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

Wiele właściwości kontrolki ma być używanych w szablonach kontrolnych i nie wpłynie na inne zachowanie po ich zmianie. Są to BorderBrush, BorderThickness, Background, Padding, HorizontalContentAlignment i VerticalContentAlignment.

23

Można używać odziedziczony styl bez klucza odniesienie:

<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

mam (W mojej aplikacji WPF) domyślne (baza) style zdefiniowane w ResourceDictionary w App.xaml (w projekcie starcie). Na przykład dla przycisku w następujący sposób.

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

We wszystkich widokach używam (domyślnie) tego ogólnego stylu (automatycznie dziedziczony)! Kiedy muszę zmienić lub dodać właściwość w domyślnym stylu (zdefiniowanym w App.xaml), tworzę nowy styl oparty na domyślnym stylu.

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

Kiedy potrzebuję ukryć lub zdecydowanie przedefiniować styl domyślny (w pewnym widoku) tworzę nowy styl (na podstawie niczego).

<Style TargetType="Button"/> 

Możesz oczywiście kontynuować dziedziczenie w App.xaml lub w określonym widoku. Możesz zastosować nowy styl o nazwie w domyślnym stylu i użyć nowego stylu według nazwy. Na przykład styl RedButton i 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 ...

UWAGA: zamiast określić swój styl w App.xaml można użyć osobnego biblioteki (DLL) tylko style i ResourceDictionary z biblioteki do ResourceDictionary.MergedDictionaries App.xaml .

Powiązane problemy