2011-08-01 101 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>