2011-08-01 73 views
2

我试图创建一个WPF组合框自定义样式,但每当我这样做,下拉不开,我想用下面的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> 
+0

您的目标是?它是否使ComboBox toggel按钮具有与您的应用中的其他按钮相同的样式,或者为每个ComboBoxItem添加鼠标悬停颜色?如果是后者,你可以通过对物品本身进行造型来做到这一点。 – sellmeadog

+0

否则,我建议看默认ComboBox控件模板,修改你需要为它比一个按钮,一个更复杂的控制什么:http://msdn.microsoft.com/en-us/library/ms752094(v= vs.85)的.aspx – sellmeadog

+0

我想在风格控件模板上面重新编码与组合框工作,包括边框等,如果有删除的蓝色鼠标悬停颜色,那么请做我的客人 –

回答

6

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

+0

这很棒,很有帮助,并让我一路走来。谢谢 –

1

如果你想改变整个ComboBox控件的外观,最容易做的事情是开始与original template,并对其进行修改以满足您的需求。要更改项目突出显示的方式,您需要重置HighlightBrushKey值。希望这个资源是有帮助的:http://bea.stollnitz.com/blog/?p=26

+0

+1这个例子演示了一种做法。 –

0

你将不得不重写默认的组合框模板,以使其正常工作(请参阅此SO后)。

你有权访问Expression Blend?您可以使用它来提取和编辑控制模板。我发现它对edit/create模板非常有用。

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

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>