簡體   English   中英

在wpf中更改組合框的按鈕大小

[英]changing the button size of the combo box in wpf

有沒有辦法增加組合框中按鈕的大小? 我增加了組合框的高度和寬度,但箭頭按鈕與整體尺寸不成比例。

預先感謝約翰。

您是在談論可編輯的組合框嗎? 在普通的ComboBox中,“按鈕”是(未展開的)ComboBox的整體大小。 因此,我認為您必須談論的是可編輯的ComboBox,其中按鈕右對齊,而文本框占用其余空間。

聽起來您希望按鈕的寬度成比例,而不是僅僅占用它必須占用的空間。

如果我在這方面是對的,那么您將需要編輯ControlTemplate ,如下面的Russell Troywest所建議。 特別是,我想您將希望更改Placement Grid定義其列定義的方式。 對於包含文本框的列,它們當前被定義為*對於包含按鈕的列,它們被定義為Auto 您可能需要將它們分別更改為3** (這將使文本框始終為寬度的75%,按鈕始終為寬度的25%)。

當您在那兒時,您可能還想更改繪制小下拉箭頭的方式(它只是一個Path對象),因為當按鈕本身很大時,看起來那么小可能有點奇怪。

編輯:

我添加了更多信息,但不確定您要尋找什么。

當您編輯ComboBox的模板時(我建議使用Blend,這樣可以很容易地將其拉出-只需右鍵單擊它,選擇Edit Template,然后Edit Copy and 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的Editable狀態的ControlTemplate 要查看的關鍵部分是ColumnDefinitions的Placement網格的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具有ComboBoxToggleButton Style ,該Style也可以在Blend生成的資源中找到。 如果選擇這樣做,它將包含您需要編輯以更改小箭頭大小的Path對象。

您是否希望整個組合框更大,包括文本,下拉按鈕和下拉箭頭? 例如,對於信息亭或觸摸屏,這可能很有用。

如果是這樣,那么您可以使用比例轉換-只需使整個組合框以其原始大小的200%或300%或其他大小顯示即可。 WPF是矢量,因此可以很好地擴展。

要做到這一點,你可以使用一個ScaleTransform為您LayoutTransform 這會將您的ComboBox縮放到其正常大小的3倍:

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

看起來像這樣(在應用ScaleTransform之前和之后):

在此處輸入圖片說明

如果您的目標是采用一些控件並將其拉伸以填充整個屏幕,則您也可以查看Viewbox 它實際上與ScaleTransform相同,但是您無需讓Viewbox硬編碼縮放級別,而是讓Viewbox自動縮放內容以填充其父級。

我認為您將需要弄亂控制模板。 這個問題在做類似的事情,因此答案可能會把您推向正確的方向。

我很確定您必須更改組合框的字體大小,這也會更改所有列表項

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM