【问题标题】:custom combobox in wpf Applicationwpf应用程序中的自定义组合框
【发布时间】:2013-04-29 20:23:45
【问题描述】:

我是 WPF 应用程序的新手。我需要像这张图片一样自定义我的组合框。

我试过这个例子 http://www.eidias.com/Blog/2012/2/20/customizing-wpf-combo-box-style

    <Window x:Class="win.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1"  Height="300" Width="300" Background="Red">
    <Window.Resources>
        <ControlTemplate x:Key="CustomToggleButton" TargetType="ToggleButton">
            <Grid>
                <Border Name="Border" />
                <Border Name="SmallBorder" />
                <Path Name="Arrow" />
            </Grid>
        </ControlTemplate>
        <Style TargetType="{x:Type ComboBoxItem}">
            <Setter Property="FrameworkElement.OverridesDefaultStyle" Value="True" />
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ComboBoxItem}">
                        <Border>
                            <ContentPresenter />
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <Style TargetType="{x:Type ComboBox}">
            <Setter Property="FrameworkElement.OverridesDefaultStyle" Value="True" />
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ComboBox">
                        <Grid>
                            <ToggleButton Template="{StaticResource CustomToggleButton}" />
                            <ContentPresenter />
                            <TextBox />
                            <Popup>
                                <Grid>
                                    <Border>
                                        <ScrollViewer>
                                            <ItemsPresenter />
                                        </ScrollViewer>
                                    </Border>
                                </Grid>
                            </Popup>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <Grid>
        <ComboBox Grid.Column="1" Height="40" Width="200" >
            <ComboBoxItem Name="item1">item1</ComboBoxItem>
            <ComboBoxItem Name="item2">item2</ComboBoxItem>
            <ComboBoxItem Name="item3">item3</ComboBoxItem>
        </ComboBox>
    </Grid>
</Window>

这个输出像文本框一样工作。请帮帮我!

【问题讨论】:

    标签: c# wpf windows-7 combobox customization


    【解决方案1】:

    我也喜欢这种格式并决定复制它。请在下面找到 XAML。希望它可以帮助某人......

    <Window x:Class="ComboStyle.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    
    <Window.Resources>
        <ControlTemplate x:Key="ComboBoxToggleButton" TargetType="{x:Type ToggleButton}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                    <ColumnDefinition Width="20" />
                </Grid.ColumnDefinitions>
                <Border
                      x:Name="Border" 
                      Grid.ColumnSpan="2"
                      CornerRadius="0"
                      Background="#FF3F3F3F"
                      BorderBrush="#FF97A0A5"
                      BorderThickness="1" />
                <Border 
                      Grid.Column="0"
                      CornerRadius="0" 
                      Margin="1" 
                      Background="#FF3F3F3F" 
                      BorderBrush="#FF97A0A5"
                      BorderThickness="0,0,1,0" />
                <Path 
                      x:Name="Arrow"
                      Grid.Column="1"     
                      Fill="White"
                      HorizontalAlignment="Center"
                      VerticalAlignment="Center"
                      Data="M0,0 L0,2 L4,6 L8,2 L8,0 L4,4 z"
                    />
            </Grid>
            <!--<ControlTemplate.Triggers>
                <Trigger Property="ToggleButton.IsMouseOver" Value="true">
                    <Setter TargetName="Border" Property="Background" Value="#808080" />
                </Trigger>
                <Trigger Property="ToggleButton.IsChecked" Value="true">
                    <Setter TargetName="Border" Property="Background" Value="#E0E0E0" />
                </Trigger>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter TargetName="Border" Property="Background" Value="#EEEEEE" />
                    <Setter TargetName="Border" Property="BorderBrush" Value="#AAAAAA" />
                    <Setter Property="Foreground" Value="#888888"/>
                    <Setter TargetName="Arrow" Property="Fill" Value="#888888" />
                </Trigger>
            </ControlTemplate.Triggers>-->
        </ControlTemplate>
    
        <ControlTemplate x:Key="ComboBoxTextBox" TargetType="{x:Type TextBox}">
            <Border x:Name="PART_ContentHost" Focusable="False" Background="{TemplateBinding Background}" />
        </ControlTemplate>
    
        <Style x:Key="{x:Type ComboBox}" TargetType="{x:Type 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="Foreground" Value="White"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type 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="3,3,23,3"
                                VerticalAlignment="Center"
                                HorizontalAlignment="Left" />
                            <TextBox x:Name="PART_EditableTextBox"
                                Style="{x:Null}" 
                                Template="{StaticResource ComboBoxTextBox}" 
                                HorizontalAlignment="Left" 
                                VerticalAlignment="Center" 
                                Margin="3,3,23,3"
                                Focusable="True" 
                                Background="#FF3F3F3F"
                                Foreground="Green"
                                Visibility="Hidden"
                                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="#FF3F3F3F"
    
                                    BorderThickness="1"
                                    BorderBrush="#888888"/>
                                    <ScrollViewer Margin="4,6,4,6" 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="#888888"/>
                            </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"/>
                                <Setter TargetName="DropDownBorder" Property="Margin" Value="0,2,0,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>
    
        <!-- SimpleStyles: ComboBoxItem -->
        <Style x:Key="{x:Type ComboBoxItem}" TargetType="{x:Type ComboBoxItem}">
            <Setter Property="SnapsToDevicePixels" Value="true"/>
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="OverridesDefaultStyle" Value="true"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ComboBoxItem}">
                        <Border Name="Border"
                                  Padding="2"
                                  SnapsToDevicePixels="true">
                            <ContentPresenter />
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsHighlighted" Value="true">
                                <Setter TargetName="Border" Property="Background" Value="#FF4F4F4F"/>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Foreground" Value="#888888"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    
    
    <Grid>
        <Border Padding="10" Background="#FF3F3F3F">
             <ComboBox Grid.Column="1" Height="30" Width="250" >
                <ComboBoxItem Name="Item1">Item1</ComboBoxItem>
                <ComboBoxItem Name="Item2">Item2</ComboBoxItem>
                <ComboBoxItem Name="Item3">Item3</ComboBoxItem>
                <ComboBoxItem Name="Item4">Item4</ComboBoxItem>
                <ComboBoxItem Name="Item5">Item5</ComboBoxItem>
                <ComboBoxItem Name="Item6">Item6</ComboBoxItem>
            </ComboBox>           
        </Border>
    
    </Grid>
    

    【讨论】:

      【解决方案2】:

      查看此链接:

      http://www.eidias.com/Blog/2012/2/20/customizing-wpf-combo-box-style

      这是一个博客,其中包含有关如何制作自定义 Combobox 的示例代码。他正在制作的自定义组合框看起来非常像您需要的组合框。所以我认为这对你很有用。

      【讨论】:

      • 我尝试了相同的示例,但没有得到输出。它像文本框一样工作。没有应用任何样式!!
      • 这和原发帖人说他试过的一样。它不起作用。
      【解决方案3】:

      这是 WPF ComboBox 的完整样式。它也很容易定制。

      http://www.wpfhelper.com/index.php/styles-in-wpf/combobox/15-combobox-style-in-wpf

      代码很长,所以我不会在这里全部发布。但是,这里是基本的 ComboBox 样式:

      <Style TargetType="{x:Type ComboBox}">         
          <Setter Property="Foreground" Value="Gray" />
          <Setter Property="BorderBrush" Value="Gray" />
          <Setter Property="Background" Value="White" />
          <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="FontSize" Value="16" />
          <Setter Property="FontWeight" Value="Bold" />
          <Setter Property="MinWidth" Value="50"/>
          <Setter Property="MinHeight" Value="32"/>
          <Setter Property="Template">
              <Setter.Value>
                  <ControlTemplate TargetType="ComboBox">
                      <Grid>
                          <ToggleButton
                                  Name="ToggleButton"
                                  BorderBrush="{TemplateBinding BorderBrush}"
                                  Background="{TemplateBinding Background}"
                              Foreground="{TemplateBinding Foreground}"
                                  Style="{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="10,3,30,3"
                                  VerticalAlignment="Center"
                                  HorizontalAlignment="Center" />
                          <TextBox x:Name="PART_EditableTextBox"
                                  Style="{x:Null}"
                                  Template="{StaticResource ComboBoxTextBox}"
                                  HorizontalAlignment="Center"
                                  VerticalAlignment="Center"
                                  Margin="3,3,23,3"
                                  Focusable="True"                               
                                  Visibility="Hidden"
                                  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="White"
                                          BorderThickness="2"
                                          BorderBrush="Gray"/>
                                  <ScrollViewer Margin="4,6,4,6" 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="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"/>
                              <Setter TargetName="DropDownBorder" Property="Margin" Value="0,2,0,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>
      

      【讨论】:

        猜你喜欢
        • 2015-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-04
        相关资源
        最近更新 更多