2011-05-15 29 views
2

有沒有什麼方法可以增加組合框中按鈕[有向下箭頭符號]的大小?我增加了組合框的高度和寬度,但箭頭按鈕並不與整體尺寸相關。更改wpf中組合框的按鈕大小

在此先感謝, 約翰。

回答

3

你在說可編輯的ComboBox嗎?在普通組合框中,「按鈕」是(未展開的)組合框的整個大小。所以,我覺得你說的肯定是一個可編輯的ComboBox其中按鈕是右對齊一個文本框佔用空間的其餘部分。

這聽起來像你想要的按鈕的寬度成正比,而不是僅僅佔用,它必須採取的空間。

如果我是正確的在這方面,那麼你要編輯的ControlTemplate,通過以下羅素Troywest的建議。特別是,我想你會想改變Placement 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> 

這是ControlTemplate組合框的可編輯狀態。關鍵部分是頂部的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的比例不正確您)。

您還會看到ToggleButtonStyleComboBoxToggleButton,這也將在Blend生成的資源中找到。這將包含您需要編輯的Path對象,以便在您選擇時更改小箭頭的大小。

+0

謝謝蒂姆。看起來像第三段中的解決方案可以幫助我。你能不能給我更多的信息。其實,我需要按鈕的大小增加一點。我相信當我增加按鈕的列大小時,它也會影響按鈕的大小。 – logeeks 2011-05-15 16:59:46

+0

我增加了更多信息,但並不確定你正在尋找什麼。隨意留下另一條評論,如果我沒有涵蓋你想要的內容,我可以添加更多信息。 – Tim 2011-05-16 14:45:03

-3

我敢肯定,你將不得不改變組合框這也改變所有列表項

0

我想你會需要惹控制模板的字體大小。這question正在做類似的事情,所以答案可能會推動你在正確的方向。

1

您是否希望整個組合框變得更大,包括文字和下拉按鈕以及下拉箭頭?這可能是有用的,例如用於自助服務終端或觸摸屏。

如果是這樣,那麼你可以使用一個縮放變換 - 只需使整個組合框出現在其原始大小的200%,或300%,或任何其他。 WPF是矢量圖,因此可以很好地擴展。

爲此,您可以使用ScaleTransform作爲LayoutTransform。這將擴展您的組合框高達3倍正常大小:

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

這將是這樣的(之前和應用ScaleTransform後):

enter image description here

您也可以看看到Viewbox,如果你的目標是採取一些控制和伸展他們來填滿整個屏幕。它與ScaleTransform實際上是一樣的,但不是對縮放級別進行硬編碼,而是讓Viewbox自動縮放您的內容以填充它的父級。