2011-07-05 1 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には、 "Left"の代わりにHorizo​​ntalAlignment = "Stretch"を使用してください。必要に応じてMaxWidthを削除します。 TextAlignmentを使用してテキストを揃えます。

+4

私はMaxWidthを持っていない場合は動作します。しかし、...もし私がMaxWidthを追加すると(カラムが非常に広くなり、テキストフィールドにそれを埋め込まないようにするため)、FieldControlはカラムの中央に浮動します。 Horizo​​ntalAlignment = "Left"を追加すると、私はどこから始めたのでしょうか。どのようにして列の左側にテキストフィールドを配置し、それを塗りつぶさずに整列させ、スプリッタをドラッグしたときに縮小されている列に対処するのですか? – 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ファイルの先頭でこれを置く:DataGrid内

<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> 

そして:

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

をこれは、テキストとソートがまだ有効になっている中央に配置します。テキストボックスはセルを塗りつぶします。この場合、ブールコンバータを使用して色付けされています。