Élégamment remplacer le style de la zone de liste déroulante du ToggleButton dans WPF

J'ai une question concernant la façon d'élégance remplacer l'arbitraire d'un élément profondément à l'intérieur d'un contrôle visuel de l'arbre. J'ai aussi tenté de le résoudre en quelques manières différentes, mais j'ai rencontré plusieurs problèmes avec chaque. Habituellement, lorsque j'essaie de trois chemins différents et ne parviennent pas à chacun, j'aller en bas, prendre un café, et demandez à quelqu'un de plus intelligent que moi. Alors je suis ici.

Détails:

Je veux aplatir le style d'une liste déroulante afin de ne pas attirer l'attention sur lui. Je veux qu'il soit similaire à celui de Windows.Les formulaires.Zone de liste déroulante du FlatStyle je veux regarder la même chose sur Windows 7 et XP.

Surtout, je veux changer l'apparence d'une zone de liste déroulante du ToggleButton.

Je pouvais Mélange et de déchirer le modèle de contrôle de tripes et de le modifier manuellement. Qui n'a pas l'air très appétissant pour moi.

J'ai essayé d'utiliser un style de remplacer le ToggleButton de l'arrière-plan, mais il s'avère que l'ensemble de la zone de liste déroulante de contrôle est en fait une façade pour un ToggleButton.

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ComboBoxExpiriment2.MainWindow"
x:Name="Window"
xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Classic" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="204" Height="103">
<Grid x:Name="LayoutRoot">
    <ComboBox HorizontalAlignment="Left" Margin="32,26.723,0,0" Width="120" VerticalAlignment="Top" Height="21.277">
    <ComboBox.Style>
      <Style>
        <Setter Property="ToggleButton.Background" Value="Green" />
      </Style>
    </ComboBox.Style>
    </ComboBox>
</Grid>

Donc j'ai abandonné et a arraché à l'aide d'un Mélange. J'ai trouvé que c'est en fait un Style appelé ComboBoxTransparentButtonStyle avec un type de cible de ToggleButton. Le style définit un ControlTemplate qui utilise un DockPanel qui a une "Microsoft_Windows_Themes:ClassicBorderDecorator de type" jeu de la droite, et c'est ce que nous sommes en train d'essayer de les contrôler. (Êtes-vous avec moi pour l'instant?)
Voici le pic:

Élégamment remplacer le style de la zone de liste déroulante du ToggleButton dans WPF

<Style x:Key="ComboBoxTransparentButtonStyle" TargetType="{x:Type ToggleButton}">
                <Setter Property="MinWidth" Value="0"/>
                <Setter Property="MinHeight" Value="0"/>
                <Setter Property="Width" Value="Auto"/>
                <Setter Property="Height" Value="Auto"/>
                <Setter Property="Background" Value="Transparent"/>
                <Setter Property="BorderBrush" Value="{x:Static Microsoft_Windows_Themes:ClassicBorderDecorator.ClassicBorderBrush}"/>
                <Setter Property="BorderThickness" Value="2"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ToggleButton}">
                            <DockPanel SnapsToDevicePixels="true" Background="{TemplateBinding Background}" LastChildFill="false">
                                <Microsoft_Windows_Themes:ClassicBorderDecorator x:Name="Border" Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" DockPanel.Dock="Right" Background="Green" BorderBrush="{TemplateBinding BorderBrush}" BorderStyle="None" BorderThickness="{TemplateBinding BorderThickness}">
                                    <Path Fill="{TemplateBinding Foreground}" HorizontalAlignment="Center" VerticalAlignment="Center" Data="{StaticResource DownArrowGeometry}"/>
                                </Microsoft_Windows_Themes:ClassicBorderDecorator>
                            </DockPanel>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsChecked" Value="true">
                                    <Setter Property="BorderStyle" TargetName="Border" Value="AltPressed"/>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
                <Style.Triggers>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}"/>
                    </Trigger>
                </Style.Triggers>
            </Style>

Arg. N'est-ce pas WPF une explosion?

J'ai donc extrait le style ComboBoxTransparentButtonStyle et a chuté dans un autre projet de l'application.les ressources. Le problème est que je ne peux pas appliquer ce style à un ComboBox parce que le style, j'ai extrait a une targetType de ToggleButton, de sorte que le TargeTypes ne correspondent pas.

tl;dr comment voulez-vous faire ça?

OriginalL'auteur | 2009-11-25