TextBox в UserControl не занимает все пространство - PullRequest
1 голос
/ 28 января 2012

У меня есть список WPF с пользовательскими элементами. Каждый элемент представляет собой пользовательский элемент управления, состоящий из сетки с двумя текстовыми полями. Я хочу, чтобы правильный занимал все пространство, чтобы заполнить ListBoxItem. Но все, что я получаю, - это то, что сам элемент занимает все пространство, а текстовое поле принимает размер его содержимого.

Итак, это список:

    <ListBox x:Name="leftListBox" Grid.Column="0" Margin="10" 
             HorizontalContentAlignment="Stretch">
        <ListBox.ItemTemplate>
            <DataTemplate>                    
                    <local:CustomLine />                    
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

И пользовательский контроль:

<UserControl x:Class="SharpComparer.CustomLine"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="30">
    <UserControl.Resources>
        <Style TargetType="{x:Type TextBox}">
             <Setter Property="VerticalAlignment" Value="Center" />
        </Style>
    </UserControl.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="40" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <TextBox x:Name="NumberColumn" x:FieldModifier="public" 
                 Text="{Binding LineNumber}"
                 Grid.Column="0" HorizontalAlignment="Right" />
        <TextBox x:Name="TextColumn" x:FieldModifier="public" 
                 Text="{Binding Text}"
                 Grid.Column="1" HorizontalAlignment="Left" />
    </Grid>
</UserControl>

То, что я уже попробовал после некоторого исследования на некоторых постах MSDN и здесь, по поводу переполнения стека: установка HorizontalContentAlignment на Stretch для Listbox.ItemContainerStyle. Я использовал некоторые границы, чтобы найти кусок, который создает проблемы. Кажется, ListBoxItems занимают всю ширину, пользовательский контроль и его сетку. Текстовое поле не занимает все пространство, хотя я думал, что Width="*" внутри ColumnDefinition сетки сделает это.
Другая идея состояла в том, чтобы привязать ширину текстового поля к его родительскому размеру, но затем он также занимает пространство левого текстового поля (что имеет смысл, потому что он получает всю ширину), и вычитание этой ширины, похоже, не работает.

Что я делаю не так?

1 Ответ

2 голосов
/ 28 января 2012

Вы должны изменить код UserControl с этого:

<TextBox x:Name="TextColumn" x:FieldModifier="public" 
                 Text="{Binding Text}"
                 Grid.Column="1" HorizontalAlignment="Left" />

на это:

<TextBox x:Name="TextColumn" x:FieldModifier="public" 
                 Text="{Binding Text}"
                 Grid.Column="1" HorizontalAlignment="Stretch" />
...