2011-07-05 71 views
10

我想獲得一個TextBox來填充可調整大小的列中的可用空間。文本框是用戶控件的一部分:如何獲取文本框以填充可調整大小的列?

<UserControl x:Class="TextBoxLayout.FieldControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 
     <Label Grid.Column="0">Name</Label> 
     <TextBox Grid.Column="1"/> 
    </Grid> 
</UserControl> 

這個用戶控件是一個窗口,一個垂直分割:

<Window x:Class="TextBoxLayout.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:TextBoxLayout" 
    Title="Text box layout" Height="400" Width="600"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition MinWidth="100"/> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition MinWidth="100"/> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 

     <local:FieldControl Grid.Column="0" Grid.Row="0" MaxWidth="200" HorizontalAlignment="Left"/> 

     <TextBlock Grid.Column="0" Grid.Row="1" Text="Testing"/> 

     <GridSplitter Grid.Column="1" Grid.Row="0" Grid.RowSpan="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="3"/> 

     <TextBlock Grid.Column="2" Grid.Row="0" Grid.RowSpan="2" Text="Testing"/> 
    </Grid> 
</Window> 

的問題是文本框似乎是非常狹窄的 - 我會想要做的是填充左欄,並用分隔線調整大小。我怎麼做?

+0

你的意思是適合寬度,或寬度和高度? – Alex

+0

只適合寬度。 – imekon

回答

29

爲FieldControl使用Horizo​​ntalAlignment =「Stretch」而不是「Left」。如果需要,刪除MaxWidth。使用TextAlignment對齊文本。

+4

這工作,如果我不想有一個MaxWidth。但是,如果我添加MaxWidth(因爲列變得非常寬,我不希望文本字段填充它),那麼FieldControl漂浮在列的中心。如果我加回Horizo​​ntalAlignment =「左」,那麼我就回到我開始的地方。如何讓文本字段在沒有填充的情況下對齊列的左側,並且在拖動分離器時應對正在縮小的列? – imekon

+0

我同意imekon。這個答案讓你回到你開始的地方。 – Vaccano

+0

@anivas +1用於區別Horizo​​ntalAlignment和TextAlignment,並且需要使用兩者。我已經忘記了。 –

1

只是看看是否是你想要

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition MinWidth="100" /> 
     <ColumnDefinition Width="Auto" /> 
     <ColumnDefinition MinWidth="100" /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 

    <local:FieldControl Grid.Column="0" 
         Grid.Row="0" 
         Margin="2" 
         /> 

    <TextBlock Grid.Column="0" 
       Grid.Row="1" 
       Text="Testing" /> 

    <GridSplitter Grid.Column="1" 
        Grid.Row="0" 
        Grid.RowSpan="2" 
        HorizontalAlignment="Stretch" 
        VerticalAlignment="Stretch" 
        Width="3" /> 

    <TextBlock Grid.Column="2" 
       Grid.Row="0" 
       Grid.RowSpan="2" 
       Text="Testing" /> 
</Grid> 
1

只想添加爲將來的代碼搜索更多的例子。

我把這個XAML文件的頂部:

<UserControl.Resources> 
    <Style TargetType="{x:Type TextBlock}" x:Key="CenterCell"> 
     <Setter Property="Background" Value="{Binding Included, Converter={StaticResource BoolToColorConverter}}"/> 
     <Setter Property="HorizontalAlignment" Value="Stretch"/> 
     <Setter Property="TextAlignment" Value="Center"/> 
    </Style> 
</UserControl.Resources> 

然後在DataGrid:

<DataGridTextColumn Header="Excluded" Binding="{Binding Excluded}" ElementStyle="{StaticResource CenterCell}"/> 

這中心的文字和排序仍處於啓用狀態。文本框填充單元格,在這種情況下使用bool轉換器進行着色。