2011-07-05 9 views
10

Próbuję uzyskać pole tekstowe, aby wypełnić dostępne miejsce w kolumnie o zmiennej wysokości. Pole tekstowe jest częścią kontroli użytkownika:Jak uzyskać pole tekstowe do wypełnienia kolumny z możliwością zmiany rozmiaru?

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

Ta kontrola użytkownika w oknie z pionowym polan:

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

Problem polega na tym polu tekstowym pojawi się bardzo wąski - co ja chcesz to zrobić, to wypełnić lewą kolumnę i zmienić rozmiar za pomocą splittera. Jak mogę to zrobić?

+0

Czy masz na myśli dopasowanie przez szerokość, albo zarówno szerokość, jak i wysokość? – Alex

+0

Dopasowuje tylko szerokość. – imekon

Odpowiedz

29

Użyj HorizontalAlignment = "Stretch" zamiast "Left" dla FieldControl. Jeśli to konieczne, usuń MaxWidth. Użyj opcji TextAlignment, aby wyrównać tekst.

+4

To działa, jeśli nie chcę mieć MaxWidth. Jednak ... jeśli dodaję MaxWidth (ponieważ kolumna staje się bardzo szeroka i nie chcę, aby pole tekstowe ją wypełniało), FieldControl unosi się w środku kolumny. Jeśli dodaję HorizontalAlignment = "Left", to wracam tam, gdzie zacząłem. Jak uzyskać pole tekstowe do wyrównania na lewo od kolumny bez wypełniania go i radzić sobie z tym, że kolumna jest zmniejszana podczas przeciągania splittera? – imekon

+0

Zgadzam się z imekon. Ta odpowiedź przywraca cię do miejsca, w którym zacząłeś. – Vaccano

+0

@anivas +1 dla rozróżnienia między wyrównaniem poziomym a wyrównaniem tekstu oraz potrzebą użycia obu. Zapomniałem. –

1

prostu zobaczyć, czy jest to, że chcesz

<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

Chciałem tylko dodać do kilku przykładów dla przyszłych wyszukiwań kodowych.

kładę to w górnej części pliku 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> 

a następnie w DataGrid:

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

ten centruje tekst i sortowanie jest nadal aktywna. Pole tekstowe wypełnia komórkę iw tym przypadku jest kolorowe za pomocą konwertera bool.

Powiązane problemy