在 XAML 中怎么说:默认宽度和高度,例如文本框
Posted
技术标签:
【中文标题】在 XAML 中怎么说:默认宽度和高度,例如文本框【英文标题】:In XAML how to say: default width and height for e.g. TextBox 【发布时间】:2010-10-04 22:21:36 【问题描述】:所以我从 html 的角度来看 WPF。
我只想像这样在我的窗口上放一个TextBox
:
<Grid>
<TextBox Name="theName" />
</Grid>
原来TextBox
是巨大的,覆盖了整个窗口。 (!)
好的,这不是我想要的,但我也不想定义确切的大小,因为我知道 Height
和 Width
应该是灵活的,所以我尝试:
<TextBox Name="theName" Width="Auto" Height="Auto"/>
同样的事情。所以我尝试:
<TextBox Name="theName"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"/>
同样的事情。所以我只是硬编码尺寸:
<TextBox Name="theName" Width="100" Height="20"/>
我知道在 WPF 中这不是一个好的编程习惯。
那么,你如何告诉TextBox
“显示正在使用的字体大小的默认大小”?
【问题讨论】:
【参考方案1】:使用不同的容器。 Grid 总是拉伸其子控件以填充网格单元格。
你可以使用例如仅在一个方向上拉伸其控件的堆栈面板。
【讨论】:
只是一个警告点。虽然 StackPanel 仅在一个方向上拉伸子控件,除非您明确约束该子对象,否则 StackPanel 会在该方向上为这些子对象提供无限空间。使用某些控件可能会导致异常的副作用。The Grid always streches its child controls
- 这不是真的,您可以将对齐设置为 stretch
以外的其他答案中所写的内容。
@Bip901 是的,现在你可以这样做了。这个问题是 12 年前提出的,所以 Grid 发生了一些变化:)【参考方案2】:
除了像 Stefan 提到的那样使用不同的面板之外,您还可以给 TextBox 一个非 Stretch 的对齐方式。例如
<TextBox Name="theName" HorizontalAlignment="Left" VerticalAlignment="Top"/>
【讨论】:
【参考方案3】:您可以更进一步地采用 Bryan 的示例。通过指定不拉伸的特定对齐方式并进一步约束 TextBox,使其不会扩展超过特定大小。例如:
<Grid x:Name="LayoutRoot">
<TextBox HorizontalAlignment="Left" VerticalAlignment="Top" Text="TextBox" TextWrapping="Wrap"
MinWidth="15" MinHeight="20" MaxWidth="500" MaxHeight="50"/>
</Grid>
您可以通过在 Grid 内设置行/列并以各种方式限制它们来更进一步。当您来自 HTML 背景时,可以将其想象为使用表格来控制布局。请记住,您还可以嵌套其他容器对象(即 StackPanels、WrapPanels、其他 Grids 等...)。
XAML 和 WPF/Silverlight 控件的挑战在于它们非常灵活,因此您必须掌握所有选项以及它们如何影响布局。
祝你好运。我现在正在经历同样的事情。
【讨论】:
【参考方案4】:WPF 中的大小不是像素,它们是 1/96 英寸的“与设备无关的像素” - 因此在当今的正常 DPI 设置中,它们将 1:1 映射到像素。
但是,如果你在高 DPI 模式下运行程序,TextBox 会随着 DPI(和字体)而增长。
所以设置一个硬编码的大小并不是那么糟糕。
除此之外,您只能使用非“拉伸”的 HorizontalAlignment 和 VerticalAlignment,这会将 TextBox 的大小调整为内容 - 但是空的 TextBox 会很小。
您可以将 VerticalAlignment 设置为“Center”、“Top”或“Bottom”以获得大约一行的自动高度(可能由 MinHeight 设置支持以避免非常小的字体问题),然后设置 Width 以便 TextBox宽度不会随着用户输入而改变。
【讨论】:
以上是关于在 XAML 中怎么说:默认宽度和高度,例如文本框的主要内容,如果未能解决你的问题,请参考以下文章