none
ControlTemplate für ComboBox mit Standardeigenschaften gesucht RRS feed

  • Frage

  • Hallo,
    ich setze die ComboBox mit einem eigenen ControlTemplate ein.

    <ControlTemplate x:Key="Style1" TargetType="{x:Type ComboBox}">
        <Grid>
            <ToggleButton Grid.Column="2" Height="20"
       x:Name="ToggleButton" Focusable="False" IsChecked="{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press" />

            <Popup x:Name="PART_Popup" IsOpen="{TemplateBinding IsDropDownOpen}">
                <Border x:Name="PopupBorder"
                HorizontalAlignment="Stretch" Height="Auto"
                MinWidth="{TemplateBinding ActualWidth}"
                MaxHeight="{TemplateBinding MaxDropDownHeight}"
                BorderThickness="{TemplateBinding BorderThickness}"
                BorderBrush="Black" Background="White" CornerRadius="3">
                    <ScrollViewer x:Name="ScrollViewer" BorderThickness="0" Padding="1">
                        <ItemsPresenter/>
                    </ScrollViewer>
                </Border>
            </Popup>
        </Grid>
    </ControlTemplate>
     
    <ComboBox Template="{StaticResource Style1}" />

    Das ControlTemplate habe ich aus dem Internet.Ziel ist es Popup zu erweitern, was auch schon funktioniert.
    Am sonstigen Aussehen der ComboBox soll nichts geändert werden.
     
    Leider ist der ToggleButton vom ControlTemplate nicht sichtbar (Höhe musste ich auch setzen) und Border sieht auch anders aus als der Standard.
    Was muss ich für den ToggleButton und Border setzen, damit die Standardeinstellungen übernommen werden?
    Eigentlich brauche ich als Basis ein ControlTemplate, welches an dem bisherigen Aussehen der ComboBox nichts ändern und worauf ich aufbauen kann, d.h im Popup Änderungen vornehmen kann.

    Alexander

    Mittwoch, 4. Dezember 2013 17:05

Antworten

  • Sobald man das Template überschreibt, muss man alles selbst zusammen bauen. Wenn du dir, wie oben beschrieben, den Standardstyle generieren lässt, dann erhälst du auch die exakte Vorlage für das ControlTemplate. Somit auch für den ToggleButton:
    <ToggleButton x:Name="toggleButton" Grid.ColumnSpan="2"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}"
                    Background="{TemplateBinding Background}"
                    IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
                    Style="{StaticResource ComboBoxToggleButton}"/>
    Wie du siehst wird dem Button unter anderem auch ein Style zugewiesen. Dieser Style wird auch mit generiert. Dazu kommen dann auch noch einige andere Resourcen. Gucke einfach mal durch den Code durch, aber auch hier gilt, das es unter jedem Betriebssystem gleich aussehen wird.

    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.

    • Als Antwort markiert AlexanderRi Donnerstag, 5. Dezember 2013 17:23
    Mittwoch, 4. Dezember 2013 19:24
    Moderator

Alle Antworten

  • Hallo,
    nur kurz vorne Weg, auch WPF passt sich ans jeweilige Betriebssystem an. So sehen die Buttons unter Windows 8 anders aus als unter Vista.

    Du müsstest also für jedes OS einen eigenen Style schreiben. An die jweiligen Daten kannst du heran kommen indem du (am besten in einem neuen Projekt) einen Rechtsklick auf die markierte ComboBox machst und Vorlage bearbeiten > Kopie bearbeiten... wählst. Dadurch wird dir der komplette Style mit Template als Resource erstellt. Dort kannst du dann die Farben etc. heraus suchen.

    Teilweise siehst du dort solche dynamischen Resourcenbindungen:

    {DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}

    Damit wird eine Systemfarbe geladen. Diese passt sich dann auch an das jeweilige Betriebssystem an, alle sind aber auch dort nicht verfügbar. Eine Liste der verfügbaren findest du hier.

    Du kannst dir ggf. auch selbst so eine Klasse erstellen deren Eigenschaften du als Farben nutzt. Die Farben musst du dann nur beim Start der Anwendung laden.


    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, 4. Dezember 2013 17:22
    Moderator
  • Hallo Koopakiller,
    ich will keine Fraben ändern. Ich will die ComboBox im Popup-Bereich nur mit zusätzlichen Controls erweitern.
    Ich benötige ein absolut einfaches ControlTemplate (ohne Farbangaben), welches ich weitere Controls hinzufügen kann.
    Wenn ich dieses ControlTemplate der ComboBox zuweise, dann soll diese genauso aussehen wie ohne einem separaten ControlTemplate.
    Und das Erstellen von diesem einfachen ControlTemplate schaffe ich nicht. Bei mir fehlt der ToggleButton und die ComboBox eine ganz geringe Höhe.
    Ohne Zuweisung vom ControlTemplate ist alles in Ordnung.

    Im Idealfall:
    <ControlTemplate x:Key="Style1" TargetType="{x:Type ComboBox}">
        <Grid>
            <ToggleButton/>
            <Popup>
                <Border>
                    <ScrollViewer>
                        <ItemsPresenter/>
                    </ScrollViewer>
                </Border>
            </Popup>
        </Grid>
    </ControlTemplate>


    Alexander

    Mittwoch, 4. Dezember 2013 17:34
  • Sobald man das Template überschreibt, muss man alles selbst zusammen bauen. Wenn du dir, wie oben beschrieben, den Standardstyle generieren lässt, dann erhälst du auch die exakte Vorlage für das ControlTemplate. Somit auch für den ToggleButton:
    <ToggleButton x:Name="toggleButton" Grid.ColumnSpan="2"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}"
                    Background="{TemplateBinding Background}"
                    IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
                    Style="{StaticResource ComboBoxToggleButton}"/>
    Wie du siehst wird dem Button unter anderem auch ein Style zugewiesen. Dieser Style wird auch mit generiert. Dazu kommen dann auch noch einige andere Resourcen. Gucke einfach mal durch den Code durch, aber auch hier gilt, das es unter jedem Betriebssystem gleich aussehen wird.

    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.

    • Als Antwort markiert AlexanderRi Donnerstag, 5. Dezember 2013 17:23
    Mittwoch, 4. Dezember 2013 19:24
    Moderator