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życia DynamicResource , 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>


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow