Текстовые поля WPF слишком велики - PullRequest
4 голосов
/ 18 февраля 2009

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

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

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

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

1 Ответ

13 голосов
/ 18 февраля 2009

Я предполагаю, что ваш 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 Background="Red">
  <TextBox VerticalAlignment="Center" HorizontalAlignment="Center"
           Text="Sample text" FontSize="2" />
</Grid>

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

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

...