Frage

In HTML / CSS können Sie einen Stil definieren, die für viele Arten von Elementen angewandt werden können, z.

.highlight {
    color:red;
}

kann sowohl P und DIV angewandt werden, z.

<p class="highlight">this will be highlighted</p>
<div class="highlight">this will also be highlighted</div>

aber in XAML scheinen Sie die Target für Stile definieren zu müssen, sonst eine Fehlermeldung angezeigt:

<Style x:Key="formRowLabel" TargetType="TextBlock">

ist es eine Möglichkeit, ein XAML-Stil zu ermöglichen, um mehrere Elemente angewandt werden oder es sogar offen zu lassen, wie in CSS?

War es hilfreich?

Lösung

Die Einrichter in WPF Stile werden während der Kompilierung überprüft; CSS-Stile werden dynamisch angelegt.

Sie haben einen Typ festlegen, so dass WPF die Eigenschaften in den Setter auf die Abhängigkeitseigenschaften dieses Typs auflösen kann.

Sie können den Zieltyp Basisklassen festgelegt, dass Sie die gewünschten Eigenschaften enthalten und dann diesen Stil abgeleiteten Klassen gelten. Zum Beispiel könnten Sie einen Stil für Steuerungsobjekte erstellen und dann gilt es auf mehrere Arten von Kontrollen (Button, TextBox, CheckBox usw.)

<Style x:Key="Highlight" TargetType="{x:Type Control}">
    <Setter Property="Foreground" Value="Red"/>
</Style>

...

<Button Style="{StaticResource Highlight}" Content="Test"/>
<TextBox Style="{StaticResource Highlight}" Text="Test"/>
<CheckBox Style="{StaticResource Highlight}" Content="Test"/>

Andere Tipps

<!-- Header text style -->
<Style x:Key="headerTextStyle">
    <Setter Property="Label.VerticalAlignment" Value="Center"></Setter>
    <Setter Property="Label.FontFamily" Value="Trebuchet MS"></Setter>
    <Setter Property="Label.FontWeight" Value="Bold"></Setter>
    <Setter Property="Label.FontSize" Value="18"></Setter>
    <Setter Property="Label.Foreground" Value="#0066cc"></Setter>
</Style>

<!-- Label style -->
<Style x:Key="labelStyle" TargetType="{x:Type Label}">
    <Setter Property="VerticalAlignment" Value="Top" />
    <Setter Property="HorizontalAlignment" Value="Left" />
    <Setter Property="FontWeight" Value="Bold" />
    <Setter Property="Margin" Value="0,0,0,5" />
</Style>

Ich denke, diese beiden Verfahren zur Herstellung einer Art erklären könnte Ihre Frage beantworten. In der ersten gibt es keine Target angegeben, aber die Eigenschaftsnamen werden mit dem Präfix ‚Label‘. In der zweiten wird der Stil für Label-Objekte erstellt.

Eine andere Methode, es zu tun:

<UserControl.Resources>
  <Style x:Key="commonStyle" TargetType="Control">
     <Setter Property="FontSize" Value="24"/>
  </Style>
  <Style BasedOn="{StaticResource commonStyle}" TargetType="ListBox"/>
  <Style BasedOn="{StaticResource commonStyle}" TargetType="ComboBox"/>
</UserControl.Resources>

Ich wollte einen Stil auf einen Textblock und einen Text anzuwenden, sondern die gewählte Antwort für mich nicht funktionierte, weil Textblock von Control nicht erben, in meinem Fall wollte ich die Sichtbarkeit Eigenschaft beeinflussen, so dass ich verwenden Framework

<Style x:Key="ShowIfRequiredStyle" TargetType="{x:Type FrameworkElement}">
        <Setter Property="Visibility" Value="Collapsed"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding ShowIfRequiredStyle, UpdateSourceTrigger=PropertyChanged}" Value="true">
                <Setter Property="Visibility" Value="Visible"/>
            </DataTrigger>
        </Style.Triggers>
</Style>

<TextBlock Style="{StaticResource ResourceKey=ShowIfRequiredStyle}"/>
<TextBox Style="{StaticResource ResourceKey=ShowIfRequiredStyle}"/>

Dies funktioniert für die Visibility-Eigenschaft, weil beiden Elemente aus Framework und die Eigenschaft erben wird definiert. Natürlich wird dies nur in der Systemsteuerung definierten Objekte nicht funktionieren, können Sie den Hierarchiebaum suchen und versuchen, eine Basisklasse zu finden, jedenfalls dachte ich, das jemanden helfen könnte, da dies ein Top-Sucher ist und die gewählte Antwort ist ein wenig unvollständig.

Es gibt eine alternative Antwort auf die Frage. Sie können die Target Parameter aus dem Stil ganz verlassen, die es zu verschiedenen Kontrollen anwenden können, aber nur, wenn Sie den Namen der Eigenschaft mit dem Präfix „Control“.

<Style x:Key="Highlight">
    <Setter Property="Control.Foreground" Value="Red"/> 
</Style> 

Natürlich funktioniert dies nur für Eigenschaften der Basissteuerklasse. Wenn Sie zu setzen versucht, sagt Itemssource, wäre es nicht, weil es keine Control.ItemsSource ist

Ich habe diese Arbeits

<Style x:Key="HeaderStyleThin"  TargetType="{x:Type Border}">
    <Setter Property="Background" Value="Black" />

    <Style.Resources>
        <Style TargetType="{x:Type TextBlock}">
               <Setter Property="Background=" Value="Red" />
        </Style>
        </Style.Resources>

</Style>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top