在wpf中更改组合框的按钮大小

时间:2011-05-15 12:03:28

标签: c# wpf

有没有办法增加组合框内按钮[有向下箭头符号]的大小?我增加了组合框的高度和宽度,但箭头按钮与整体尺寸不相符。

提前致谢, 约翰。

4 个答案:

答案 0 :(得分:3)

您在谈论可编辑的ComboBox吗?在普通的ComboBox中,“按钮”是(未展开的)ComboBox的整个大小。所以我认为你必须要谈论一个可编辑的ComboBox,其中按钮右对齐,文本框占据了剩下的空间。

听起来你希望按钮的宽度成比例,而不是占用它必须占用的空间。

如果我在这方面是正确的,那么您将要编辑ControlTemplate,如下面的Russell Troywest所建议的那样。特别是,我认为您将要更改放置Grid定义列定义的方式。对于包含文本框的列,它们当前定义为*,对于包含按钮的列,它们定义为Auto。您可能希望分别将这些更改为3**(这会使文本框始终为宽度的75%,按钮始终为宽度的25%)。

当你在那里时,你可能还想改变绘制小下拉箭头的方式(它只是一个Path对象),因为当你'时,它可能有点奇怪。我的按钮本身很大。

修改

我正在添加更多信息,但我不确定你在寻找什么。

当您编辑ComboBox的模板时(我建议使用Blend,可以非常轻松地将这些东西拉出来 - 只需右键单击它,选择编辑模板,然后编辑复制和混合将拉出所有默认样式/模板供你编辑),你会在那里找到这段代码:

<ControlTemplate x:Key="ComboBoxEditableTemplate" TargetType="{x:Type ComboBox}">
    <Grid x:Name="Placement" SnapsToDevicePixels="true">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
            <Popup x:Name="PART_Popup" AllowsTransparency="true" Grid.ColumnSpan="2" IsOpen="{Binding IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}}" PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}" Placement="Bottom">
                <Microsoft_Windows_Themes:SystemDropShadowChrome x:Name="Shdw" Color="Transparent" MaxHeight="{TemplateBinding MaxDropDownHeight}" MinWidth="{Binding ActualWidth, ElementName=Placement}">
                    <Border x:Name="DropDownBorder" BorderBrush="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}" BorderThickness="1" Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}">
                        <ScrollViewer x:Name="DropDownScrollViewer">
                            <Grid RenderOptions.ClearTypeHint="Enabled">
                                <Canvas HorizontalAlignment="Left" Height="0" VerticalAlignment="Top" Width="0">
                                    <Rectangle x:Name="OpaqueRect" Fill="{Binding Background, ElementName=DropDownBorder}" Height="{Binding ActualHeight, ElementName=DropDownBorder}" Width="{Binding ActualWidth, ElementName=DropDownBorder}"/>
                                </Canvas>
                                <ItemsPresenter x:Name="ItemsPresenter" KeyboardNavigation.DirectionalNavigation="Contained" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                            </Grid>
                        </ScrollViewer>
                    </Border>
                </Microsoft_Windows_Themes:SystemDropShadowChrome>
            </Popup>
            <Microsoft_Windows_Themes:ListBoxChrome x:Name="Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.ColumnSpan="2" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderFocused="{TemplateBinding IsKeyboardFocusWithin}"/>
            <TextBox x:Name="PART_EditableTextBox" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" IsReadOnly="{Binding IsReadOnly, RelativeSource={RelativeSource TemplatedParent}}" Margin="{TemplateBinding Padding}" Style="{StaticResource ComboBoxEditableTextBox}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"/>
            <ToggleButton Grid.Column="1" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource ComboBoxToggleButton}"/>
        </Grid>
        <ControlTemplate.Triggers>
            <Trigger Property="IsKeyboardFocusWithin" Value="true">
                <Setter Property="Foreground" Value="Black"/>
            </Trigger>
            <Trigger Property="IsDropDownOpen" Value="true">
                <Setter Property="RenderFocused" TargetName="Border" Value="true"/>
            </Trigger>
            <Trigger Property="HasItems" Value="false">
                <Setter Property="Height" TargetName="DropDownBorder" Value="95"/>
            </Trigger>
            <Trigger Property="IsEnabled" Value="false">
                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                <Setter Property="Background" Value="#FFF4F4F4"/>
            </Trigger>
            <Trigger Property="IsGrouping" Value="true">
                <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
            </Trigger>
            <Trigger Property="HasDropShadow" SourceName="PART_Popup" Value="true">
                <Setter Property="Margin" TargetName="Shdw" Value="0,0,5,5"/>
                <Setter Property="Color" TargetName="Shdw" Value="#71000000"/>
            </Trigger>
            <Trigger Property="ScrollViewer.CanContentScroll" SourceName="DropDownScrollViewer" Value="false">
                <Setter Property="Canvas.Top" TargetName="OpaqueRect" Value="{Binding VerticalOffset, ElementName=DropDownScrollViewer}"/>
                <Setter Property="Canvas.Left" TargetName="OpaqueRect" Value="{Binding HorizontalOffset, ElementName=DropDownScrollViewer}"/>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>

这是ComboBox的可编辑状态的ControlTemplate。要查看的关键部分是顶部放置网格的ColumnDefinitions。它们目前定义为:

<Grid.ColumnDefinitions>
    <ColumnDefinition Width="*"/>
    <ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>

这意味着ToggleButton(在第二列中)只获得它需要的任何空间,TextBox(在第一列中)获得剩余的空间。给了ComboBox

您只想将该部分更改为:

<Grid.ColumnDefinitions>
    <ColumnDefinition Width="3*"/>
    <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>

由于我上面描述的原因(显然你需要确定正确的比例,如果3:1的比例对你不正确)。

您还会看到ToggleButton有一个Style ComboBoxToggleButton,也可以在Blend生成的资源中找到。如果您选择这样做,那将包含您需要编辑的Path对象以更改小箭头的大小。

答案 1 :(得分:1)

您是否希望整个组合框更大,包括文本和下拉按钮以及下拉箭头?这可能是有用的,例如用于自助服务终端或触摸屏。

如果是这样,那么你可以使用比例变换 - 只需使整个组合框显示为其原始大小的200%,或300%,或其他任何东西。 WPF是矢量,所以它可以很好地扩展。

为此,您可以使用ScaleTransform作为LayoutTransform。这会将您的ComboBox扩展到正常大小的3倍:

<ComboBox ItemsSource="...">
    <ComboBox.LayoutTransform>
        <ScaleTransform ScaleX="3" ScaleY="3"/>
    </ComboBox.LayoutTransform>
</ComboBox>

看起来像这样(在应用ScaleTransform之前和之后):

  

enter image description here

如果您的目标是采取一些控制并将其拉伸以填满整个屏幕,您也可以查看Viewbox。它实际上与ScaleTransform相同,但是您不必对缩放级别进行硬编码,而是让Viewbox自动缩放您的内容以填充其父级。

答案 2 :(得分:0)

我认为你需要搞乱控制模板。这个question正在做类似的事情,所以答案可能会让你朝着正确的方向前进。

答案 3 :(得分:-4)

我很确定您必须更改组合框的字体大小,这也会更改所有列表项