none
Textstyle einer Combobox an den Textstyle einen Textblocks anpassten RRS feed

  • Frage

  • Hallo zusammen,

    ich möchte einen Style für mehrere Comboboxen anlegen. Alle Combobox zeigen in ihren Comboboxitems nur Text an. Warum funktioniert folgender Code nicht?

    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
        Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
    
            <!-- Textblock -->
            <Style TargetType="TextBlock" x:Key="Beschriftung">
                <Setter Property="FontSize" Value="11"/>
                <Setter Property="TextElement.Foreground" Value="Red"/>
            </Style>
            
            
            <!-- Combobox -->
            <Style TargetType="ComboBox">
                <Setter Property="TextBlock.Style" Value="{StaticResource Beschriftung}"/>
            </Style>
       
        </Window.Resources>
        <StackPanel>
            <ComboBox >
                <ComboBoxItem>Item 1</ComboBoxItem>
                <ComboBoxItem>Item 2</ComboBoxItem>
                <ComboBoxItem>Item 3</ComboBoxItem>
                <ComboBoxItem>Item 4</ComboBoxItem>
                <ComboBoxItem>Item 5</ComboBoxItem>
            </ComboBox>
        </StackPanel>
    </Window>
    

    Die Fehlermeldung lautet:

    Das Style-Objekt darf keine Auswirkungen auf die Style-Eigenschaft des Objekts haben, für das sie gilt.   

    Grüße

    Jürgen

    Mittwoch, 31. Juli 2013 09:21

Antworten

  • Hallo, wenn du nur einen Style für ComboBox und TextBlock anlegst, werden die ComboBoxItem's nicht betroffen sein. Darum brauchst du eben auch einen Style dafür. Zum Glück gibt es aber die BasedOn-Eigenschaft. Damit kannst du einen Style für viele Typen vereinfachen.
          <!-- Basiswerte -->
            <my:Double x:Key="BeschriftungFontSize">30</my:Double>
            <FontFamily x:Key="BeschriftungFontFamily">Arial</FontFamily>
            <SolidColorBrush x:Key="BeschriftungColor">Red</SolidColorBrush>
    
            <Style TargetType="FrameworkElement" x:Key="myBase">
                <Setter Property="TextBlock.FontSize" Value="{StaticResource BeschriftungFontSize}"/>
                <Setter Property="TextBlock.FontSize" Value="{StaticResource BeschriftungFontSize}"/>
                <Setter Property="TextBlock.Foreground" Value="{StaticResource BeschriftungColor}"/>
            </Style>
    
            <!-- Textblock -->
            <Style TargetType="TextBlock" BasedOn="{StaticResource myBase}"></Style>
    
            <!-- Combobox -->
            <Style TargetType="ComboBox" BasedOn="{StaticResource myBase}"></Style>
    
            <!-- GroupBox -->
            <Style TargetType="GroupBox" BasedOn="{StaticResource myBase}"></Style>
    
            <!-- RadioButton -->
            <Style TargetType="RadioButton" BasedOn="{StaticResource myBase}"></Style>
    
            <!-- ComboBoxItem -->
            <Style TargetType="ComboBoxItem" BasedOn="{StaticResource myBase}"></Style>
    Immer klappt dieser Trick natürlich nicht. Aber solange alle Typen die Eigenschaften von der selben Klasse erben, geht es.

    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Mittwoch, 31. Juli 2013 14:36
    Moderator

Alle Antworten

  • Folgendes Beispiel läuft und bringt im Ergebnis, was ich erreichen möchte. Aber der Weg scheint mir nicht sauber, denn, wenn ich mich entschließe einen weiteren Parameter hinzu zu nehmen, so muss ich dies an N Stellen nachziehen. Gibt's eine bessere Lösung?

    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:my="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
    
            <!-- Basiswerte -->
            <my:Double x:Key="BeschriftungFontSize">30</my:Double>
            <FontFamily x:Key="BeschriftungFontFamily">Arial</FontFamily>
            <SolidColorBrush x:Key="BeschriftungColor">Red</SolidColorBrush>
            
            <!-- Textblock -->
            <Style TargetType="TextBlock">
                <Setter Property="FontSize" Value="{StaticResource BeschriftungFontSize}"/>
                <Setter Property="FontSize" Value="{StaticResource BeschriftungFontSize}"/>
                <Setter Property="Foreground" Value="{StaticResource BeschriftungColor}"/>
            </Style>
    
            <!-- Combobox -->
            <Style TargetType="ComboBox">
                <Setter Property="FontSize" Value="{StaticResource BeschriftungFontSize}"/>
                <Setter Property="FontFamily" Value="{StaticResource BeschriftungFontFamily}"/>
                <Setter Property="Foreground" Value="{StaticResource BeschriftungColor}"/>
            </Style>
    
            <!-- GroupBox -->
            <Style TargetType="GroupBox">
                <Setter Property="FontSize" Value="{StaticResource BeschriftungFontSize}"/>
                <Setter Property="FontFamily" Value="{StaticResource BeschriftungFontFamily}"/>
                <Setter Property="Foreground" Value="{StaticResource BeschriftungColor}"/>
            </Style>
    
            <!-- RadioButton -->
            <Style TargetType="RadioButton">
                <Setter Property="FontSize" Value="{StaticResource BeschriftungFontSize}"/>
                <Setter Property="FontFamily" Value="{StaticResource BeschriftungFontFamily}"/>
                <Setter Property="Foreground" Value="{StaticResource BeschriftungColor}"/>
            </Style>
        
        </Window.Resources>
        <StackPanel>
            <TextBlock>Ein Textblock</TextBlock>
            <ComboBox>
                <ComboBoxItem>Item 1</ComboBoxItem>
                <ComboBoxItem>Item 2</ComboBoxItem>
                <ComboBoxItem>Item 3</ComboBoxItem>
                <ComboBoxItem>Item 4</ComboBoxItem>
                <ComboBoxItem>Item 5</ComboBoxItem>
            </ComboBox>
            <GroupBox Header="Bitte Wählen">
                <StackPanel>
                    <RadioButton Content="Wert 1"/>
                    <RadioButton Content="Wert 2"/>
                </StackPanel>
            </GroupBox>
        </StackPanel>
    </Window>
    

    Grüße

    Jürgen

    Mittwoch, 31. Juli 2013 12:24
  • Hallo, wenn du nur einen Style für ComboBox und TextBlock anlegst, werden die ComboBoxItem's nicht betroffen sein. Darum brauchst du eben auch einen Style dafür. Zum Glück gibt es aber die BasedOn-Eigenschaft. Damit kannst du einen Style für viele Typen vereinfachen.
          <!-- Basiswerte -->
            <my:Double x:Key="BeschriftungFontSize">30</my:Double>
            <FontFamily x:Key="BeschriftungFontFamily">Arial</FontFamily>
            <SolidColorBrush x:Key="BeschriftungColor">Red</SolidColorBrush>
    
            <Style TargetType="FrameworkElement" x:Key="myBase">
                <Setter Property="TextBlock.FontSize" Value="{StaticResource BeschriftungFontSize}"/>
                <Setter Property="TextBlock.FontSize" Value="{StaticResource BeschriftungFontSize}"/>
                <Setter Property="TextBlock.Foreground" Value="{StaticResource BeschriftungColor}"/>
            </Style>
    
            <!-- Textblock -->
            <Style TargetType="TextBlock" BasedOn="{StaticResource myBase}"></Style>
    
            <!-- Combobox -->
            <Style TargetType="ComboBox" BasedOn="{StaticResource myBase}"></Style>
    
            <!-- GroupBox -->
            <Style TargetType="GroupBox" BasedOn="{StaticResource myBase}"></Style>
    
            <!-- RadioButton -->
            <Style TargetType="RadioButton" BasedOn="{StaticResource myBase}"></Style>
    
            <!-- ComboBoxItem -->
            <Style TargetType="ComboBoxItem" BasedOn="{StaticResource myBase}"></Style>
    Immer klappt dieser Trick natürlich nicht. Aber solange alle Typen die Eigenschaften von der selben Klasse erben, geht es.

    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Mittwoch, 31. Juli 2013 14:36
    Moderator
  • Halllo Koopakiller,

    danke, jetzt funst es

    Grüße

    Jürgen

    Mittwoch, 31. Juli 2013 15:10
  • Hallo Juergen,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Wenn nicht, neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.

    Danke und viele Grüße,
    Ionut


    Ionut Duma, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-PrinzipEntwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 6. August 2013 13:30
    Moderator