wpf combox样式自定义

wpf   combox原生的控件样式 非常的强大,而且支持自动完成、下拉单选、下拉方向、下拉框可定义大小等。

一个原生的combox的样式是这样子的:

 

 

 在某些时候,根据设计的需要,combox样式需要更改,以下是我根据自己理解所写的combox自定义的样式。这个样式是由ToggleButton和ComboBox组成,先展示一下我改变之后的combox的样式。

 

 

 

 

我这是为了区分所以设置了不同的颜色,颜色可以根据自己的喜欢改变,话不多说,先展示ToggleButton的代码。

 

<!--Combox右边button-->

        <Style x:Key="ComboBoxReadonlyToggleButton" TargetType="ToggleButton">
            <Setter Property="IsTabStop" Value="false" />
            <Setter Property="ClickMode" Value="Press" />
            <Setter Property="MinHeight" Value="22"></Setter>
            <Setter Property="MinWidth" Value="80"></Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ToggleButton">
                        <Grid>
                            <Border x:Name="Background" BorderBrush="#787878"
                                BorderThickness="1"  Background="#198B53">
                                <Path x:Name="Path" Height="Auto" Margin="0,0.082,0,8.859" Width="Auto"
                                    Stretch="Fill" Stroke="{x:Null}" StrokeLineJoin="Round"
                                    StrokeThickness="1"
                                    Data="M0,3 C0,1.3431457 1.3431457,0 3,0 L129,0 C130.65686,0 132,1.3431457 132,3 L132,13.853975 C86.718803,0.055481441 26.160202,27.400364 0,11.585506 z">
                                    <Path.Fill>
                                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                            <!--combox背景色#198B53-->
                                            <GradientStop Color="#198B53" Offset="0.113" />
                                            <GradientStop Color="#198B53" Offset="1" />
                                        </LinearGradientBrush>
                                    </Path.Fill>
                                </Path>
                            </Border>
                            <!--倒三角的颜色#0099ff-->
                            <Path Height="10" x:Name="Path1" HorizontalAlignment="Right"
                                VerticalAlignment="Center" Margin="5,0,7,0" Width="10"
                                Fill="#0099ff" Stretch="Fill" Stroke="#0099ff"
                                Data="M0.5,0.5 L9.5,0.5 L5.0625,9.5 L5.0625,9.5 z" />
                        </Grid>

                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <!--移入时按钮颜色 图案颜色 背景颜色 锯齿颜色-->
                                <Setter TargetName="Path1" Property="Fill" Value="#198B53"></Setter>
                                <Setter TargetName="Background" Property="Background" Value="#198B53"></Setter>
                                <Setter TargetName="Background" Property="BorderBrush" Value="#198B53"></Setter>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

 

然后下面是ComboBox代码:

  <Style x:Key="DefaultComboBoxStyle" TargetType="ComboBox">
            <Setter Property="Foreground" Value="#FFFFFFFF" />
            <Setter Property="Width" Value="100"></Setter>
            <Setter Property="Height" Value="30"></Setter>
            <Setter Property="VerticalAlignment" Value="Center"></Setter>
            <Setter Property="HorizontalContentAlignment" Value="Left"></Setter>
            <Setter Property="BorderBrush" Value="#FFFFFFFF" />
            <Setter Property="BorderThickness" Value="1" />
            <Setter Property="VerticalContentAlignment" Value="Center" />
            <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" />
            <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" />
            <Setter Property="Padding" Value="4,3" />
            <Setter Property="ItemContainerStyle">
                <Setter.Value>
                    <!--这个是下拉框的属性设置-->
                    <Style TargetType="ComboBoxItem">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="ComboBoxItem">
                                    <Border Name="Back"  Background="#525252"  BorderThickness="0,0,0,0" BorderBrush="#525252" >
                                        <ContentPresenter ContentSource="{Binding Source}"  VerticalAlignment="Center" HorizontalAlignment="Left" Margin="10,0,0,0" ></ContentPresenter>
                                    </Border>
                                    <ControlTemplate.Triggers>
                                        <Trigger Property="IsMouseOver" Value="True">
                                            <Setter TargetName="Back" Property="Background" Value="#484848"></Setter>
                                        </Trigger>
                                        <!--下拉框背景色-->
                                        <Trigger Property="IsHighlighted" Value="True">
                                            <Setter TargetName="Back" Property="Background" Value="#3A99FF"></Setter>
                                        </Trigger>
                                    </ControlTemplate.Triggers>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </Setter.Value>
            </Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ComboBox">
                        <Grid x:Name="MainGrid">
                           <Popup x:Name="PART_Popup" Margin="1" Grid.Row="1" 
                                IsOpen="{Binding Path=IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}}">
                                <Grid x:Name="Shdw" MaxHeight="{TemplateBinding MaxDropDownHeight}"
                                    MinWidth="{Binding Path=ActualWidth, ElementName=MainGrid}" >
                                    <!--下拉框的属性设置-->
                                        <!--Background -->
                                    <Border x:Name="Bordertop"   Width="100" CornerRadius="0" BorderThickness="0"  Background="#525252">
                                        <Border.Effect>
                                            <DropShadowEffect Color="Black"  BlurRadius="2" ShadowDepth="0" Opacity="1"/>
                                        </Border.Effect>
                                        <ScrollViewer Width="150">
                                            <ItemsPresenter />
                                        </ScrollViewer>
                                    </Border>
                                </Grid>
                            </Popup>
                            <ToggleButton Style="{StaticResource ComboBoxReadonlyToggleButton}"
                                BorderThickness="3" BorderBrush="#03ffea"   Background="{TemplateBinding Background}"
                                IsChecked="{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" />
                            <!--combox字体的间距-->
                            <TextBlock Margin="10 0 0 0" 
                                HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                IsHitTestVisible="false"
                                Text="{TemplateBinding Text}"
                               />
                        </Grid>
                            
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

 

 

 最后在combox引用样式就大功告成啦:

<StackPanel Margin ="0 20 0 0">
            <ComboBox   Style="{StaticResource DefaultComboBoxStyle}"  VerticalContentAlignment="Center" HorizontalContentAlignment="Left">
                <ComboBoxItem>ComboBox1</ComboBoxItem>
                <ComboBoxItem IsSelected =" True" >ComboBox2</ComboBoxItem>
                <ComboBoxItem>ComboBox3</ComboBoxItem>
            </ComboBox>

        </StackPanel>

  

 

 

posted @ 2019-11-22 16:10  熊大的小跟班  阅读(4215)  评论(8编辑  收藏  举报