2012-06-01 30 views
0

我創建了從組合框派生的控件。我的應用程序中每個組合框都有一個共同的樣式。除了我創建的控件外,每個組合框的樣式都可以正常工作。將樣式應用到自定義組合框中

請參考代碼。

-xaml -Code對於自定義組合框

<local:FilteredComboBox Grid.Row="3" Grid.Column="1" Height="20"  x:Name="cbBillingProvider" Padding="4 3" /> 

自定義組合框--C#代碼。從combobox.xaml

ResourceDictionary 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" 
       xmlns:local="clr-namespace:BCBSKCICD10" 
       mc:Ignorable="d"> 
<ResourceDictionary.MergedDictionaries> 
<ResourceDictionary Source="Shared.xaml" /> 
</ResourceDictionary.MergedDictionaries> 

<ControlTemplate x:Key="ComboBoxToggleButton" 
       TargetType="{ x:Type ToggleButton}"> 
<Grid> 
    <Grid.ColumnDefinitions> 
    <ColumnDefinition /> 
    <ColumnDefinition Width="20" /> 
    </Grid.ColumnDefinitions> 
    <VisualStateManager.VisualStateGroups> 
    <VisualStateGroup x:Name="CommonStates"> 
     <VisualState x:Name="Normal" /> 
     <VisualState x:Name="MouseOver"> 
     <Storyboard> 
      <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background). 
       (GradientBrush.GradientStops)[1].(GradientStop.Color)" 
             Storyboard.TargetName="Border"> 
      <EasingColorKeyFrame KeyTime="0" 
           Value="{StaticResource ControlMouseOverColor}" /> 
      </ColorAnimationUsingKeyFrames> 
     </Storyboard> 
     </VisualState> 
     <VisualState x:Name="Pressed" /> 
     <VisualState x:Name="Disabled"> 
     <Storyboard> 
      <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background). 
       (GradientBrush.GradientStops)[1].(GradientStop.Color)" 
             Storyboard.TargetName="Border"> 
      <EasingColorKeyFrame KeyTime="0" 
           Value="{StaticResource DisabledControlDarkColor}" /> 
      </ColorAnimationUsingKeyFrames> 
      <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill). 
       (SolidColorBrush.Color)" 
             Storyboard.TargetName="Arrow"> 
      <EasingColorKeyFrame KeyTime="0" 
           Value="{StaticResource DisabledForegroundColor}" /> 
      </ColorAnimationUsingKeyFrames> 
      <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush). 
       (GradientBrush.GradientStops)[1].(GradientStop.Color)" 
             Storyboard.TargetName="Border"> 
      <EasingColorKeyFrame KeyTime="0" 
           Value="{StaticResource DisabledBorderDarkColor}" /> 
      </ColorAnimationUsingKeyFrames> 
     </Storyboard> 
     </VisualState> 
    </VisualStateGroup> 
    <VisualStateGroup x:Name="CheckStates"> 
     <VisualState x:Name="Checked"> 
     <Storyboard> 
      <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background). 
       (GradientBrush.GradientStops)[1].(GradientStop.Color)" 
             Storyboard.TargetName="Border"> 
      <EasingColorKeyFrame KeyTime="0" 
           Value="{StaticResource ControlPressedColor}" /> 
      </ColorAnimationUsingKeyFrames> 
     </Storyboard> 
     </VisualState> 
     <VisualState x:Name="Unchecked" /> 
     <VisualState x:Name="Indeterminate" /> 
    </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 
    <Border x:Name="Border" 
      Grid.ColumnSpan="2" 
      CornerRadius="2" 
      BorderThickness="1"> 
    <Border.BorderBrush> 
     <LinearGradientBrush EndPoint="0,1" 
          StartPoint="0,0"> 
     <GradientStop Color="{DynamicResource BorderLightColor}" 
         Offset="0" /> 
     <GradientStop Color="{DynamicResource BorderDarkColor}" 
         Offset="1" /> 
     </LinearGradientBrush> 
    </Border.BorderBrush> 
    <Border.Background> 

     <LinearGradientBrush StartPoint="0,0" 
          EndPoint="0,1"> 
     <LinearGradientBrush.GradientStops> 
      <GradientStopCollection> 
      <GradientStop Color="{DynamicResource ControlLightColor}" /> 
      <GradientStop Color="{DynamicResource ControlMediumColor}" 
          Offset="1.0" /> 
      </GradientStopCollection> 
     </LinearGradientBrush.GradientStops> 
     </LinearGradientBrush> 

    </Border.Background> 
    </Border> 
    <Border Grid.Column="0" 
      CornerRadius="2,0,0,2" 
      Margin="1" > 
    <Border.Background> 
     <SolidColorBrush Color="{DynamicResource ControlLightColor}"/> 
    </Border.Background> 
    </Border> 
    <Path x:Name="Arrow" 
     Grid.Column="1" 
     HorizontalAlignment="Center" 
     VerticalAlignment="Center" 
     Data="M 0 0 L 4 4 L 8 0 Z" > 
    <Path.Fill> 
     <SolidColorBrush Color="{DynamicResource GlyphColor}"/> 
    </Path.Fill> 
    </Path> 
</Grid> 
</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="MaxHeight" Value="20"></Setter> 

    <Setter Property="Template"> 

    <Setter.Value> 
    <ControlTemplate TargetType="{x:Type ComboBox}"> 
     <Grid> 
     <VisualStateManager.VisualStateGroups> 
      <VisualStateGroup x:Name="CommonStates"> 
      <VisualState x:Name="Normal" /> 
      <VisualState x:Name="MouseOver" /> 
      <VisualState x:Name="Disabled"> 
       <Storyboard> 
       <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_EditableTextBox" 
               Storyboard.TargetProperty="(TextElement.Foreground). 
        (SolidColorBrush.Color)"> 
        <EasingColorKeyFrame KeyTime="0" 
             Value="{StaticResource DisabledForegroundColor}" /> 
       </ColorAnimationUsingKeyFrames> 
       </Storyboard> 
      </VisualState> 
      </VisualStateGroup> 
      <VisualStateGroup x:Name="EditStates"> 
      <VisualState x:Name="Editable"> 
       <Storyboard> 
       <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" 
               Storyboard.TargetName="PART_EditableTextBox"> 
        <DiscreteObjectKeyFrame KeyTime="0" 
              Value="{x:Static Visibility.Visible}" /> 
       </ObjectAnimationUsingKeyFrames> 
       <ObjectAnimationUsingKeyFrames 
        Storyboard.TargetProperty="(UIElement.Visibility)" 
               Storyboard.TargetName="ContentSite"> 
        <DiscreteObjectKeyFrame KeyTime="0" 
              Value="{x:Static Visibility.Hidden}" /> 
       </ObjectAnimationUsingKeyFrames> 
       </Storyboard> 
      </VisualState> 
      <VisualState x:Name="Uneditable" /> 
      </VisualStateGroup> 
     </VisualStateManager.VisualStateGroups> 
     <ToggleButton x:Name="ToggleButton" 
         Template="{StaticResource ComboBoxToggleButton}" 
         Grid.Column="2" 
         Focusable="false" 
         ClickMode="Press" 
         IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, 
      RelativeSource={RelativeSource TemplatedParent}}"/> 
     <ContentPresenter x:Name="ContentSite" 
          IsHitTestVisible="False" 
          Content="{TemplateBinding SelectionBoxItem}" 
          ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" 
          ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" 
          Margin="3,3,23,3" 
          VerticalAlignment="Stretch" 
          HorizontalAlignment="Left"> 
     </ContentPresenter> 
     <TextBox x:Name="PART_EditableTextBox" 
       Style="{x:Null}" 
       Template="{StaticResource ComboBoxTextBox}" 
       HorizontalAlignment="Left" 
       VerticalAlignment="Bottom" 
       Margin="3,3,23,3" 
       Focusable="True" 
       Background="Transparent" 
       Visibility="Hidden" 
       IsReadOnly="{TemplateBinding IsReadOnly}" /> 
     <Popup x:Name="Popup" 
       Placement="Bottom" 
       IsOpen="{TemplateBinding IsDropDownOpen}" 
       AllowsTransparency="True" 
       Focusable="False" 
       PopupAnimation="Slide"> 
      <Grid x:Name="DropDown" 
       SnapsToDevicePixels="True" 
       MinWidth="{TemplateBinding ActualWidth}" 
       MaxHeight="{TemplateBinding MaxDropDownHeight}"> 
      <Border x:Name="DropDownBorder" 
        BorderThickness="1"> 
       <Border.BorderBrush> 
       <SolidColorBrush Color="{DynamicResource BorderMediumColor}" /> 
       </Border.BorderBrush> 
       <Border.Background> 
       <SolidColorBrush Color="{DynamicResource ControlLightColor}" /> 
       </Border.Background> 
      </Border> 
      <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="AllowsTransparency" 
       Value="true"> 
      <Setter TargetName="DropDownBorder" 
        Property="CornerRadius" 
        Value="4" /> 
      <Setter TargetName="DropDownBorder" 
        Property="Margin" 
        Value="0,2,0,0" /> 
     </Trigger> 
     </ControlTemplate.Triggers> 
    </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
    </Style>  
    <Style x:Key="{x:Type ComboBoxItem}" 
    TargetType="{x:Type ComboBoxItem}"> 
<Setter Property="SnapsToDevicePixels" 
     Value="true" /> 
<Setter Property="OverridesDefaultStyle" 
     Value="true" /> 
<Setter Property="Template"> 
    <Setter.Value> 
    <ControlTemplate TargetType="{x:Type ComboBoxItem}"> 
     <Border x:Name="Border" 
       Padding="2" 
       SnapsToDevicePixels="true" 
       Background="Transparent"> 
     <VisualStateManager.VisualStateGroups> 
      <VisualStateGroup x:Name="SelectionStates"> 
      <VisualState x:Name="Unselected" /> 
      <VisualState x:Name="Selected"> 
       <Storyboard> 
       <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border" 
               Storyboard.TargetProperty="(Panel.Background). 
        (SolidColorBrush.Color)"> 
        <EasingColorKeyFrame KeyTime="0" 
             Value="{StaticResource SelectedBackgroundColor}" /> 
       </ColorAnimationUsingKeyFrames> 
       </Storyboard> 
      </VisualState> 
      <VisualState x:Name="SelectedUnfocused"> 
       <Storyboard> 
       <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border" 
               Storyboard.TargetProperty="(Panel.Background). 
        (SolidColorBrush.Color)"> 
        <EasingColorKeyFrame KeyTime="0" 
             Value="{StaticResource SelectedUnfocusedColor}" /> 
       </ColorAnimationUsingKeyFrames> 
       </Storyboard> 
      </VisualState> 
      </VisualStateGroup> 
     </VisualStateManager.VisualStateGroups> 
     <ContentPresenter /> 
     </Border> 
    </ControlTemplate> 
    </Setter.Value> 
</Setter> 
</Style> 
</ResourceDictionary> 

public class FilteredComboBox : ComboBox 
{ 
} 

-Combo框樣式代碼任何一個可以幫助採用同樣的風格,我的自定義組合框?

感謝

阿布爾瓦·沙阿

回答

0

試試這個:

public class FilteredComboBox : ComboBox 
{ 
    static FilteredComboBox() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(FilteredComboBox), 
      new FrameworkPropertyMetadata(typeof(ComboBox))); 
    } 
} 
0

我得承認我不喜歡這一點,因爲你必須創建一個新的行所創建的每個繼承類型(可能不可能),但您始終可以引用默認樣式。

​​

我想這是一樣硬在C#每次編碼它