2009-02-18 3 views
4

У меня есть страница WPF с некоторыми вводами данных TextBoxes, и они выглядят намного больше, чем нужно шрифту. Что определяет высоту текстового поля? есть ли способ подхлестывать их?Текстовые поля WPF слишком большие

Текстовое поле становится все больше и меньше, в зависимости от размера шрифта он показывает (так что я не хочу, чтобы установить свойство высоты непосредственно, если я могу помочь ему.

Вот пример того, что я имею в виду ...

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Page.Resources> 
    <Style x:Key="LabelStyle" TargetType="Label"> 
     <Setter Property="HorizontalAlignment" Value="Right"/> 
     <Setter Property="VerticalAlignment" Value="Center"/> 
     <Setter Property="VerticalContentAlignment" Value="Center"/> 
    </Style> 

    <Style x:Key="TextBoxStyle" TargetType="TextBox"> 
     <Setter Property="HorizontalAlignment" Value="Left"/> 
     <Setter Property="VerticalAlignment" Value="Center"/> 
     <Setter Property="VerticalContentAlignment" Value="Center"/> 
    </Style> 

    </Page.Resources> 
    <StackPanel> 
    <WrapPanel> 
     <Label Style="{StaticResource LabelStyle}" Content="{Binding ActualHeight, RelativeSource={RelativeSource Self}}"/> 
     <TextBox Style="{StaticResource TextBoxStyle}" Text="{Binding ActualHeight, RelativeSource={RelativeSource Self}, Mode=OneWay}"/> 
    </WrapPanel> 
    <WrapPanel> 
     <Label Style="{StaticResource LabelStyle}" Content="{Binding ActualHeight, RelativeSource={RelativeSource Self}}"/> 
     <TextBox Style="{StaticResource TextBoxStyle}" Text="{Binding ActualHeight, RelativeSource={RelativeSource Self}, Mode=OneWay}"/> 
    </WrapPanel> 
    </StackPanel> 
</Page> 

Если вы посмотрите на размер вы увидите ярлык немного больше, чем текстовое поле. Изменение VerticalAlignment на текстовое поле Top делает это тот же размер. в качестве временной меры я просто установить маржу метка до -2.

ответ

13

Я предполагаю, что вы r TextBox Контейнер вызывает слишком большую величину.

Попробуйте следующий код XAML в Kaxaml:

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <Grid VerticalAlignment="Center" HorizontalAlignment="Center"> 
    <TextBox Text="Sample text" FontSize="2" /> 
    </Grid> 

</Page> 

Это делает как очень маленький текстовое поле в центре страницы. Если вы удалите VerticalAlignment="Center" и HorizontalAlignment="Center" из контейнера, то текстовое поле очень велико.

По умолчанию горизонтальные и вертикальные выравнивания для Grid и TextBox: Stretch, что в основном означает, что элемент не заботится и будет принимать то, что ему дано. Поэтому механизм компоновки задает TextBox, насколько он большой, и не получает ответа, поэтому макет задает Grid. Grid не заботится ни о том, чтобы он, наконец, запрашивал Page/Window, который имеет фиксированный размер, а затем этот размер распространяется по визуальному дереву (с учетом любых полей и отступов). Конечным результатом является то, что TextBox заполняет всю площадь.

Чтобы подтвердить это, переместите атрибуты выравнивания от Grid до самого TextBox. Визуальную визуальную визуальную визуальную визуальную визуализацию вы не видите, но если вы зададите цвет фона для Grid, вы бы это сделали.

<Grid Background="Red"> 
    <TextBox VerticalAlignment="Center" HorizontalAlignment="Center" 
      Text="Sample text" FontSize="2" /> 
</Grid> 

Если вы хотите, чтобы переполнить границы текстового поля прямо против текста, вы можете также установить Padding="0" на самом текстовом поле.

См. this article для получения дополнительной информации о системе разметки WPF.

+0

Конечно, он заполняет пространство контейнера, вопрос в том, почему он делает контейнерное пространство таким большим? Похоже, что когда он измеряет размерность для детей, если метка имеет другое значение VerticalAlignment из текстового поля, тогда размер также немного отличается. – gimpy

+0

Привет @jifman, я отредактировал свой ответ, чтобы предоставить вам более подробную информацию. Поэкспериментируйте с этим в Kaxaml, используя разные цвета фона на разных элементах, чтобы вы могли видеть, что делают невидимые элементы. Надеюсь, это поможет. –

0

Вот пример того, что я имею в виду ...

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Page.Resources> 
    <Style x:Key="LabelStyle" TargetType="Label"> 
     <Setter Property="HorizontalAlignment" Value="Right"/> 
     <Setter Property="VerticalAlignment" Value="Center"/> 
     <Setter Property="VerticalContentAlignment" Value="Center"/> 
    </Style> 

    <Style x:Key="TextBoxStyle" TargetType="TextBox"> 
     <Setter Property="HorizontalAlignment" Value="Left"/> 
     <Setter Property="VerticalAlignment" Value="Center"/> 
     <Setter Property="VerticalContentAlignment" Value="Center"/> 
    </Style> 

    </Page.Resources> 
    <StackPanel> 
    <WrapPanel> 
     <Label Style="{StaticResource LabelStyle}" Content="{Binding ActualHeight, RelativeSource={RelativeSource Self}}"/> 
     <TextBox Style="{StaticResource TextBoxStyle}" Text="{Binding ActualHeight, RelativeSource={RelativeSource Self}, Mode=OneWay}"/> 
    </WrapPanel> 
    <WrapPanel> 
     <Label Style="{StaticResource LabelStyle}" Content="{Binding ActualHeight, RelativeSource={RelativeSource Self}}"/> 
     <TextBox Style="{StaticResource TextBoxStyle}" Text="{Binding ActualHeight, RelativeSource={RelativeSource Self}, Mode=OneWay}"/> 
    </WrapPanel> 
    </StackPanel> 
</Page> 

Если вы посмотрите на размер вы увидите ярлык немного больше, чем текстовое поле. Изменение VerticalAlignment в текстовом поле Top делает его того же размера. В качестве промежуточной меры я просто установил маржу на метку до -2.