WPF文本框太大了。

4

我有一个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。

1个回答

14

我猜测你的TextBox的容器导致它太大了。

请尝试在Kaxaml中使用以下XAML代码:

<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",那么文本框将非常大。

GridTextBox的默认水平和垂直对齐方式是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"
请参阅此文章了解更多关于 WPF 布局系统的信息。

当然它会填充容器空间,问题是为什么它会使容器空间变得如此之大?似乎当它测量子元素的大小时,如果标签与文本框具有不同的VerticalAlignment,则大小也会略有不同。 - gimpy
嗨 @jifman,我编辑了我的答案以为您提供更多细节。在Kaxaml中尝试使用不同的背景颜色对不同的元素进行实验,这样您就可以看到其他不可见的元素正在做什么。希望能有所帮助。 - Drew Noakes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接