在ComboBox项目上设置FontSize

时间:2013-12-10 16:06:37

标签: wpf xaml combobox

我为组合框继承了以下样式:

<Style x:Key="CustomComboBox" 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="FontSize" Value="64"/>-->
    <!--<Setter Property="MinWidth" Value="120"/>-->
    <Setter Property="MinHeight" Value="20"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ComboBox">
                <Border x:Name="tst">
                    <Grid>
                        <ToggleButton 
                        Name="ToggleButton" 
                        Template="{StaticResource ComboBoxToggleButton1}" 
                        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="Transparent"
                        Visibility="Hidden"
                        IsReadOnly="{TemplateBinding IsReadOnly}"/>
                        <Popup 
                        Name="Popup"
                        Placement="Bottom"
                        IsOpen="{TemplateBinding IsDropDownOpen}"
                        AllowsTransparency="True" 
                        Focusable="False"
                        PopupAnimation="Slide">
                            <Grid 
                            Background="LightGray"
                          Name="DropDown"
                          SnapsToDevicePixels="True"                
                          MinWidth="{TemplateBinding ActualWidth}"
                          MaxHeight="{TemplateBinding MaxDropDownHeight}">
                                <Border 
                                x:Name="DropDownBorder"
                                Background="{StaticResource WindowBackgroundBrush1}"
                                BorderThickness="2"
                                BorderBrush="{StaticResource SolidBorderBrush}"/>
                                <ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True">
                                    <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained"/>
                                </ScrollViewer>
                            </Grid>
                        </Popup>
                    </Grid>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="HasItems" Value="false">
                        <Setter TargetName="DropDownBorder" Property="MinHeight" Value="95"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush1}"/>
                    </Trigger>
                    <Trigger Property="IsGrouping" Value="true">
                        <Setter Property="ScrollViewer.CanContentScroll" Value="True"/>
                    </Trigger>
                    <Trigger SourceName="Popup" Property="Popup.AllowsTransparency" Value="true">
                        <Setter TargetName="DropDownBorder" Property="CornerRadius" Value="4"/>
                        <Setter TargetName="DropDownBorder" Property="Margin" Value="0,2,0,0"/>
                    </Trigger>
                    <Trigger Property="IsKeyboardFocused" Value="true">
                        <Setter Property="BorderBrush" Value="Pink"/>
                        <Setter Property="BorderThickness" Value="3"/>
                    </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>

如果我更改了样式中的FontSize,它只会改变ComboBox的大小,而不会改变里面文本的大小。

如果我在ContentPresenter中设置TextElement.FontSize,它就没有效果。

我的样式中也有这个,但是在这里更改FontSize属性也没有效果。我还尝试为ContentPresenter设置TextElement.FontSize。

<Style TargetType="{x:Type ComboBoxItem}">
    <Setter Property="SnapsToDevicePixels" Value="true"/>
    <Setter Property="OverridesDefaultStyle" Value="true"/>
    <Setter Property="Background" Value="Black"/>
    <!--<Setter Property="FontSize" Value="64"/>-->
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ComboBoxItem">
                <Border
                  Name="Border"
                  Padding="2"
                  SnapsToDevicePixels="true">
                    <ContentPresenter />
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsHighlighted" Value="true">
                        <Setter TargetName="Border" Property="Background" Value="{StaticResource TestBrush}"/>
                    </Trigger>
                    <Trigger Property="IsHighlighted" Value="false">
                        <Setter TargetName="Border" Property="Background" Value="Black"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

我错过了什么?

添加模板:

<ControlTemplate x:Key="ComboBoxTextBox" TargetType="TextBox" >
    <Border x:Name="PART_ContentHost" Focusable="False" Background="Black" />
</ControlTemplate>

<ControlTemplate x:Key="ComboBoxToggleButton1" TargetType="ToggleButton">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition Width="20" />
        </Grid.ColumnDefinitions>
        <Border
                x:Name="Border" 
              Grid.ColumnSpan="2"
              CornerRadius="2"
              Background="{StaticResource NormalBrush1}"
              BorderBrush="{StaticResource NormalBorderBrush}"
              BorderThickness="1" />
        <Border 
                  Grid.Column="0"
                  CornerRadius="2,0,0,2" 
                  Margin="1" 
                  Background="{StaticResource WindowBackgroundBrush1}" 
                  BorderBrush="{StaticResource NormalBorderBrush}"
                  BorderThickness="0,0,1,0" />
        <Path 
              x:Name="Arrow"
              Grid.Column="1"     
              Fill="{StaticResource GlyphBrush}"
              HorizontalAlignment="Center"
              VerticalAlignment="Center"
              Data="M 0 0 L 4 4 L 8 0 Z"/>
    </Grid>
    <ControlTemplate.Triggers>
        <Trigger Property="ToggleButton.IsMouseOver" Value="true">
            <Setter TargetName="Border" Property="Background" Value="{StaticResource DarkBrush1}" />
        </Trigger>
        <Trigger Property="ToggleButton.IsChecked" Value="true">
            <Setter TargetName="Border" Property="Background" Value="{StaticResource PressedBrush1}" />
        </Trigger>
        <Trigger Property="IsEnabled" Value="False">
            <Setter TargetName="Border" Property="Background" Value="{StaticResource CollapsedComboBoxColor}" />
            <Setter TargetName="Border" Property="BorderBrush" Value="{StaticResource DisabledBorderBrush}" />
            <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush1}"/>
            <Setter TargetName="Arrow" Property="Fill" Value="Transparent" />
        </Trigger>
        <Trigger Property="IsEnabled" Value="True">
            <Setter TargetName="Border" Property="Background" Value="{StaticResource CollapsedComboBoxColor}" />
            <Setter TargetName="Border" Property="BorderBrush" Value="{StaticResource DisabledBorderBrush}" />
            <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush1}"/>
            <Setter TargetName="Arrow" Property="Fill" Value="{StaticResource EnabledArrowBrush}" />
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

2 个答案:

答案 0 :(得分:0)

我发现了我的情况。

还有另一个资源字典文件样式化TextBlocks。这覆盖了ComboBox内部的文本大小。

任何人都在研究这篇文章中遇到的类似问题,请注意这样的ComboBox有一个底层TextBlock,它将为它们定义样式。

答案 1 :(得分:0)

是的,TextBox内的ComboBox es将继承其他地方设置的样式。但是,这并不意味着你无能为力。

当您为ControlTemplate样式指定ComboBox时,请在TextBoxContentPresenter资源部分中添加相应的ItemsPresenter样式:

<ControlTemplate TargetType="{x:Type ComboBox}">
  <Grid>
    <Border x:Name="ContentPresenterBorder">
      <Grid>
        <ToggleButton x:Name="DropDownToggle" ClickMode="Press" Template="{StaticResource ...}" Margin="15,0" Background="Transparent"
            IsChecked="{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" />

        <ContentPresenter Name="ContentSite" Content="{TemplateBinding ComboBox.SelectionBoxItem}" ContentTemplate="{TemplateBinding ComboBox.SelectionBoxItemTemplate}"
            HorizontalAlignment="{TemplateBinding HorizontalAlignment}" VerticalAlignment="Center" Margin="20,0" IsHitTestVisible="False">
          <ContentPresenter.Resources>
            <Style TargetType="{x:Type TextBlock}">
              <Setter Property="FontSize" Value="16" />
              <Setter Property="FontWeight" Value="Bold" />
            </Style>
          </ContentPresenter.Resources>
        </ContentPresenter>

        <TextBox x:Name="PART_EditableTextBox" Foreground="White" IsReadOnly="{TemplateBinding IsReadOnly}" Visibility="Hidden" />

        <Popup Name="PART_Popup" AllowsTransparency="True" IsOpen="{TemplateBinding ComboBox.IsDropDownOpen}" PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}">
          <Grid Name="DropDown" MinWidth="{TemplateBinding FrameworkElement.ActualWidth}" MaxHeight="{TemplateBinding ComboBox.MaxDropDownHeight}" SnapsToDevicePixels="True">
            <Border Name="DropDownBorder">
              <ScrollViewer Margin="0">
                <ItemsPresenter KeyboardNavigation.DirectionalNavigation="Contained">
                  <ItemsPresenter.Resources>
                    <Style TargetType="{x:Type TextBlock}">
                      <Setter Property="FontSize" Value="12" />
                      <Setter Property="FontWeight" Value="Normal" />
                    </Style>
                  </ItemsPresenter.Resources>
                </ItemsPresenter>
              </ScrollViewer>
            </Border>
          </Grid>
        </Popup>
      </Grid>
    </Border>
  </Grid>

  <ControlTemplate.Triggers>
    ...
  </ControlTemplate.Triggers>
</ControlTemplate>