Szukaj…
Uwagi
Uwagi wstępne
W WPF styl definiuje wartości jednej lub więcej właściwości zależności dla danego elementu wizualnego. Style są stosowane w całej aplikacji, aby interfejs użytkownika był bardziej spójny (np. Nadanie wszystkim przyciskom dialogowym jednakowego rozmiaru) i aby ułatwić zbiorcze zmiany (np. Zmianę szerokości wszystkich przycisków).
Style są zazwyczaj definiowane w ResourceDictionary
na wysokim poziomie w aplikacji (np. W App.xaml lub w temacie), więc jest dostępny w całej aplikacji, ale można je również zdefiniować dla pojedynczego elementu i jego elementów potomnych, np. Stosując styl do wszystkich elementów TextBlock
w StackPanel
.
<StackPanel>
<StackPanel.Resources>
<Style TargetType="TextBlock">
<Setter Property="Margin" Value="5,5,5,0"/>
<Setter Property="Background" Value="#FFF0F0F0"/>
<Setter Property="Padding" Value="5"/>
</Style>
</StackPanel.Resources>
<TextBlock Text="First Child"/>
<TextBlock Text="Second Child"/>
<TextBlock Text="Third Child"/>
</StackPanel>
Ważne notatki
- Lokalizacja, w której styl jest zdefiniowany, wpływa na to, gdzie jest on dostępny.
- Odwołania do przodu nie mogą być rozstrzygane przez
StaticResource
. Innymi słowy, jeśli definiujesz styl, który zależy od innego stylu lub zasobu w słowniku zasobów, należy go zdefiniować za / poniżej zasobu, od którego zależy. -
StaticResource
to zalecany sposób odwoływania się do stylów i innych zasobów (ze względów wydajnościowych i behawioralnych), chyba że wyraźnie potrzebujesz użyciaDynamicResource
, np. W przypadku motywów, które można zmieniać w czasie wykonywania.
Zasoby
MSDN ma dogłębne artykuły na temat stylów i zasobów, które mają więcej głębi niż jest to możliwe tutaj.
Definiowanie nazwanego stylu
Styl nazwany wymaga ustawienia właściwości x:Key
i ma zastosowanie tylko do elementów, które jawnie odwołują się do niego według nazwy:
<StackPanel>
<StackPanel.Resources>
<Style x:Key="MyTextBlockStyle" TargetType="TextBlock">
<Setter Property="Background" Value="Yellow"/>
<Setter Property="FontWeight" Value="Bold"/>
</Style>
</StackPanel.Resources>
<TextBlock Text="Yellow and bold!" Style="{StaticResource MyTextBlockStyle}" />
<TextBlock Text="Also yellow and bold!" Style="{DynamicResource MyTextBlockStyle}" />
<TextBlock Text="Plain text." />
</StackPanel>
Definiowanie stylu niejawnego
Styl niejawny dotyczy wszystkich elementów danego typu w zakresie. Styl niejawny może pomijać x:Key
TargetType
ponieważ jest domyślnie taki sam jak właściwość TargetType
stylu.
<StackPanel>
<StackPanel.Resources>
<Style TargetType="TextBlock">
<Setter Property="Background" Value="Yellow"/>
<Setter Property="FontWeight" Value="Bold"/>
</Style>
</StackPanel.Resources>
<TextBlock Text="Yellow and bold!" />
<TextBlock Text="Also yellow and bold!" />
<TextBlock Style="{x:Null}" Text="I'm not yellow or bold; I'm the control's default style!" />
</StackPanel>
Dziedziczenie ze stylu
Często potrzebny jest styl podstawowy, który definiuje właściwości / wartości wspólne dla wielu stylów należących do tej samej kontrolki, szczególnie w przypadku czegoś takiego jak TextBlock
. Dokonuje się tego za pomocą właściwości BasedOn
. Wartości są dziedziczone, a następnie można je zastąpić.
<Style x:Key="BaseTextBlockStyle" TargetType="TextBlock">
<Setter Property="FontSize" Value="12"/>
<Setter Property="Foreground" Value="#FFBBBBBB" />
<Setter Property="FontFamily" Value="Arial" />
</Style>
<Style x:Key="WarningTextBlockStyle"
TargetType="TextBlock"
BasedOn="{StaticResource BaseTextBlockStyle">
<Setter Property="Foreground" Value="Red"/>
<Setter Property="FontWeight" Value="Bold" />
</Style>
W powyższym przykładzie każdy TextBlock
wykorzystujący styl WarningTextBlockStyle
byłby przedstawiany jako 12px Arial na czerwono i pogrubiony.
Ponieważ niejawne style mają niejawny x:Key
pasujący do ich typu TargetType
, możesz je również dziedziczyć:
<!-- Implicit -->
<Style TargetType="TextBlock">
<Setter Property="FontSize" Value="12"/>
<Setter Property="Foreground" Value="#FFBBBBBB" />
<Setter Property="FontFamily" Value="Arial" />
</Style>
<Style x:Key="WarningTextBlockStyle"
TargetType="TextBlock"
BasedOn="{StaticResource {x:Type TextBlock}}">
<Setter Property="Foreground" Value="Red"/>
<Setter Property="FontWeight" Value="Bold" />
</Style>