1,如何在WPF中使用ComboBox
代码
<Grid> <ComboBox Width="200" Height="23"> <ComboBoxItem Content="Tea" /> <ComboBoxItem Content="Milk" IsSelected="True" /> <ComboBoxItem Content="Coffee" /> </ComboBox> </Grid>
效果

2,自定义ComboBox的Item
代码
<Grid> <ComboBox HorizontalAlignment="Center" VerticalAlignment="Center" SelectedIndex="1"> <ComboBoxItem> <StackPanel Orientation="Horizontal"> <Image Width="60" Height="30" Source="/ComboBox Style Sample;component/img/copyright.png" /> <TextBlock VerticalAlignment="Center" Foreground="Red">Itme1</TextBlock> </StackPanel> </ComboBoxItem> <ComboBoxItem> <StackPanel Orientation="Horizontal"> <Image Width="60" Height="30" Source="/ComboBox Style Sample;component/img/down-circle.png" /> <TextBlock VerticalAlignment="Center" Foreground="Green">Item2</TextBlock> </StackPanel> </ComboBoxItem> <ComboBoxItem> <StackPanel Orientation="Horizontal"> <Image Width="60" Height="30" Source="/ComboBox Style Sample;component/img/left-circle.png" /> <TextBlock VerticalAlignment="Center" Foreground="Blue">Item3</TextBlock> </StackPanel> </ComboBoxItem> </ComboBox> </Grid>
效果

3,自定义ComboBox样式
代码
ComboBoxItem样式
<Style x:Key="stlCbxItem" TargetType="{x:Type ComboBoxItem}"> <Setter Property="HorizontalContentAlignment" Value="Stretch" /> <Setter Property="VerticalContentAlignment" Value="Center" /> <Setter Property="RenderOptions.ClearTypeHint" Value="Enabled" /> <Setter Property="BorderThickness" Value="0" /> <Setter Property="Foreground" Value="White" /> <Setter Property="Height" Value="28" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ComboBoxItem}"> <Grid Margin="0,0.5" Background="{TemplateBinding Background}"> <Border x:Name="ItemBackground" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="1" IsHitTestVisible="False" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> <ContentPresenter x:Name="contentPresenter" Margin="{TemplateBinding Padding}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" /> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter TargetName="ItemBackground" Property="Background" Value="#224466" /> </Trigger> <Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="ItemBackground" Property="Background" Value="#226688" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>
ToggleButton样式
<Style x:Key="stlToggleButton" TargetType="{x:Type ToggleButton}"> <Setter Property="Foreground" Value="White" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate> <Grid Background="Transparent"> <Grid.ColumnDefinitions> <ColumnDefinition Width="0.7*" /> <ColumnDefinition Width="0.3*" MinWidth="16" MaxWidth="30" /> </Grid.ColumnDefinitions> <TextBlock Grid.Column="0" Margin="5,0,0,0" VerticalAlignment="Center" Foreground="White" Text="{Binding Text, RelativeSource={RelativeSource AncestorType={x:Type ComboBox}, Mode=FindAncestor}}" /> <Border x:Name="Back" Grid.Column="1" Background="Transparent" BorderBrush="Transparent" BorderThickness="0"> <Path x:Name="PathFill" Width="8" Height="6" Data="M5,0 L10,10 L0,10 z" Fill="#1b94e0" RenderTransformOrigin="0.5,0.5" Stretch="Fill" StrokeThickness="0"> <Path.RenderTransform> <TransformGroup> <ScaleTransform /> <SkewTransform /> <RotateTransform Angle="180" /> <TranslateTransform /> </TransformGroup> </Path.RenderTransform> </Path> </Border> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="PathFill" Property="Fill" Value="#1b94e0" /> <Setter TargetName="Back" Property="Background" Value="Transparent" /> <Setter TargetName="Back" Property="BorderBrush" Value="Transparent" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>
ComboBox样式
<Style x:Key="stlCbx" TargetType="{x:Type ComboBox}"> <Setter Property="SnapsToDevicePixels" Value="True" /> <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" /> <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" /> <Setter Property="ScrollViewer.CanContentScroll" Value="True" /> <Setter Property="HorizontalAlignment" Value="Left" /> <Setter Property="Height" Value="28" /> <Setter Property="Margin" Value="0,0,0,0" /> <Setter Property="ItemContainerStyle" Value="{StaticResource stlCbxItem}" /> <Setter Property="ItemTemplate"> <Setter.Value> <DataTemplate> <TextBlock Margin="0,3,0,3" Foreground="#ffffff" Text="{Binding Text}" /> </DataTemplate> </Setter.Value> </Setter> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ComboBox}"> <Border Background="#aaaaaa" BorderBrush="#eee" BorderThickness="0" CornerRadius="2"> <Grid> <ToggleButton ClickMode="Press" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource stlToggleButton}" /> <Popup x:Name="Popup" AllowsTransparency="True" Focusable="False" IsOpen="{TemplateBinding IsDropDownOpen}" Placement="Bottom" PopupAnimation="Slide"> <Border x:Name="DropDown" MinWidth="{TemplateBinding ActualWidth}" MaxHeight="{TemplateBinding MaxDropDownHeight}" Background="Transparent" SnapsToDevicePixels="True"> <Border Margin="0,2,0,0" Background="#002244" CornerRadius="2"> <ScrollViewer MaxHeight="{TemplateBinding MaxDropDownHeight}" Margin="4,6,4,6" CanContentScroll="True" HorizontalScrollBarVisibility="Auto" SnapsToDevicePixels="True" VerticalScrollBarVisibility="Auto"> <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" /> </ScrollViewer> </Border> </Border> </Popup> </Grid> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style>
页面中使用ComboBox样式
<Window x:Class="ComboBox_Style_Sample.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Title="MainWindow" Width="800" Height="450" mc:Ignorable="d"> <Grid> <ComboBox Width="377" Height="33" Margin="0" HorizontalAlignment="Center" VerticalAlignment="Center" Style="{StaticResource stlCbx}"> <ComboBoxItem Content="item1" /> <ComboBoxItem Content="item2" /> </ComboBox> </Grid></Window>
效果

4,数据绑定
代码
<Grid> <StackPanel VerticalAlignment="Center" Orientation="Vertical"> <ComboBox Name="myComboBox" Width="200" Height="23" SelectionChanged="myComboBox_SelectionChanged" /> <Label Width="97" Content="Selected Data:" /> <TextBox Name="txtData" Width="202" Height="23" Text="TextBox" TextWrapping="Wrap" /> </StackPanel> </Grid>
public partial class DataBindingSample : Window { private List<Computer> Computers; public DataBindingSample() { InitializeComponent(); Computers = new List<Computer>(); myComboBox.ItemsSource = Computers; myComboBox.DisplayMemberPath = "Name"; myComboBox.SelectedValuePath = "ID"; } private void Window_Loaded(object sender, RoutedEventArgs e) { Computers.Add(new Computer() { ID = 1, Name = "Computer A"}); Computers.Add(new Computer() { ID = 2, Name = "Computer B" }); Computers.Add(new Computer() { ID = 3, Name = "Computer C" }); myComboBox.SelectedIndex = 1; } private void myComboBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) { txtData.Text = myComboBox.SelectedValue.ToString(); } } public class Computer { public string Name { get; set; } public int ID { get; set; } }
效果

5,示例代码下载