自定义组合框样式

时间:2011-08-01 23:56:43

标签: c# wpf xaml combobox

我正在尝试为WPF ComboBox创建自定义样式但是每当我这样做时,下拉列表都没有打开,我想使用从我的按钮样式创建的以下XAML代码,但是将它移植到使用ComboBox控件,我将如何做到这一点,以便下拉菜单显示,并让我能够更改鼠标悬停颜色。

<ControlTemplate TargetType="Button">
    <Border Name="border" 
            BorderThickness="{TemplateBinding BorderThickness}"
            Padding="{TemplateBinding Padding}" 
            BorderBrush="{TemplateBinding BorderBrush}" 
            CornerRadius="1" 
            Background="{TemplateBinding Background}">
        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                          VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
    </Border>
    <ControlTemplate.Triggers>
        <!--TODO: Set the right colors-->
        <Trigger Property="IsMouseOver" Value="True">
            <Setter TargetName="border" Property="BorderBrush" Value="#FFC6C6C6" />
            <Setter Property="Foreground" Value="#FF333333" />
        </Trigger>
        <Trigger Property="IsPressed" Value="True">
            <Setter Property="Foreground" Value="#FF666666" />
        </Trigger>
        <Trigger Property="IsEnabled" Value="false">
            <Setter Property="Foreground" Value="#FFCCCCCC"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

4 个答案:

答案 0 :(得分:6)

ComboBoxes相当复杂,如果你改变ControlTemplate的一个方面,就像你需要提供所有其他功能的那些触发器一样,你最好的选择可能是复制默认模板并进行调整。可以找到默认模板on MSDN(请参阅Default WPF Themes链接)。

答案 1 :(得分:1)

如果要更改整个ComboBox控件的外观,最简单的方法是从original template开始并修改它以满足您的需要。要更改项目突出显示的方式,您需要重置HighlightBrushKey值。希望此资源有用:http://bea.stollnitz.com/blog/?p=26

答案 2 :(得分:0)

您必须覆盖默认的ComboBox模板才能使其正常工作(请参阅此SO帖子)。

您是否可以访问Expression Blend?您可以使用它来提取和编辑控件模板。我觉得它对edit / create模板非常有用。

Show Me the Templates是另一种查看控件模板的工具。

答案 3 :(得分:0)

您可以尝试使用此模板并按照自己的方式进行编辑。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d">
    <ControlTemplate x:Key="ComboBoxToggleButton" TargetType="ToggleButton">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition Width="20" />
            </Grid.ColumnDefinitions>
            <Border
          x:Name="Border" 
          Grid.ColumnSpan="2"
          CornerRadius="0"
          Background="#FF535353"
          BorderBrush="#FF535353"
          BorderThickness="0" />
            <Border 
          Grid.Column="0"
          CornerRadius="0,0,0,0" 
          Margin="1" 
          Background="#FF323232" 
          BorderBrush="#FF535353"
          BorderThickness="3,0,0,0" />
            <Path 
          x:Name="Arrow"
          Grid.Column="1"     
          Fill="#3a3a3a"
          HorizontalAlignment="Center"
          VerticalAlignment="Center"
          Data="M 0 0 L 4 4 L 8 0 Z"/>
        </Grid>
        <ControlTemplate.Triggers>
            <Trigger Property="IsEnabled" Value="False">
                <Setter TargetName="Border" Property="Background" Value="LightGray" />
                <Setter TargetName="Border" Property="BorderBrush" Value="Gray" />
                <Setter Property="Foreground" Value="DarkGray"/>
                <Setter TargetName="Arrow" Property="Fill" Value="DarkGray" />
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
    <ControlTemplate x:Key="ComboBoxTextBox" TargetType="TextBox">
        <Border x:Name="PART_ContentHost" Focusable="False" Height="30" BorderThickness="0" Background="Transparent" />
    </ControlTemplate>
    <Style x:Key="CmoboboxStyle" TargetType="ComboBox">
        <Setter Property="SnapsToDevicePixels" Value="true"/>
        <Setter Property="OverridesDefaultStyle" Value="true"/>
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
        <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
        <Setter Property="ScrollViewer.CanContentScroll" Value="true"/>
        <Setter Property="MinWidth" Value="120"/>
        <Setter Property="MinHeight" Value="20"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ComboBox">
                    <Grid>
                        <ToggleButton 
                    Name="ToggleButton" 
                    Template="{StaticResource ComboBoxToggleButton}" 
                    Grid.Column="2" 
                    Focusable="false"
                    IsChecked="{Binding Path=IsDropDownOpen,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent}}"
                    ClickMode="Press">
                        </ToggleButton>
                        <ContentPresenter
                        Name="ContentSite"
                        IsHitTestVisible="False" 
                        Content="{TemplateBinding SelectionBoxItem}"
                        ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}"
                        ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"
                        Margin="8,0,0,0"
                        VerticalAlignment="Center"
                        HorizontalAlignment="Left" />
                        <TextBox x:Name="PART_EditableTextBox"
                        Style="{x:Null}" 
                        Template="{StaticResource ComboBoxTextBox}" 
                        HorizontalAlignment="Left" 
                        VerticalAlignment="Center" 
                        Text="{TemplateBinding Text}"
                        Focusable="True" 
                        Background="Transparent"
                        Visibility="Hidden"
                        Foreground="DarkBlue"
                        IsReadOnly="{TemplateBinding IsReadOnly}"/>
                        <Popup 
                        Name="Popup"
                        Placement="Bottom"
                        IsOpen="{TemplateBinding IsDropDownOpen}"
                        AllowsTransparency="True" 
                        Focusable="False"
                        PopupAnimation="Slide">
                            <Grid 
                          Name="DropDown"
                          SnapsToDevicePixels="True"                
                          MinWidth="{TemplateBinding ActualWidth}"
                          MaxHeight="{TemplateBinding MaxDropDownHeight}">
                                <Border 
                                x:Name="DropDownBorder"
                                Background="#FF323232"
                                BorderThickness="4,0,0,0"
                                BorderBrush="#FF535353"/>
                                <ScrollViewer Margin="4,0,0,0" SnapsToDevicePixels="True">
                                    <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" />
                                </ScrollViewer>
                            </Grid>
                        </Popup>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="HasItems" Value="false">
                            <Setter TargetName="DropDownBorder" Property="MinHeight" Value="95"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="LightGray"/>
                        </Trigger>
                        <Trigger Property="IsGrouping" Value="true">
                            <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                        </Trigger>
                        <Trigger SourceName="Popup" Property="Popup.AllowsTransparency" Value="true">
                            <Setter TargetName="DropDownBorder" Property="CornerRadius" Value="0,0,0,0"/>
                            <Setter TargetName="DropDownBorder" Property="Margin" Value="0"/>
                        </Trigger>
                        <Trigger Property="IsEditable"
           Value="true">
                            <Setter Property="IsTabStop" Value="false"/>
                            <Setter TargetName="PART_EditableTextBox" Property="Visibility" Value="Visible"/>
                            <Setter TargetName="ContentSite" Property="Visibility" Value="Hidden"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
        </Style.Triggers>
    </Style>
</ResourceDictionary>