这有效,除了边距以像素为单位,与显示器的分辨率或字体大小或任何其他可变因素无关。
你的假设是不正确的。(我知道,因为我曾经有同样的假设和同样的担忧。)
实际上不是像素
首先,边距不是以像素为单位的。(你已经认为我疯了,对吗?)来自FrameworkElement.Margin的文档:
厚度测量的默认单位是与设备无关的单位(1/96 英寸)。
我认为以前版本的文档倾向于将其称为“像素”,或者后来称为“与设备无关的像素”。随着时间的推移,他们开始意识到这个术语是一个巨大的错误,因为 WPF 实际上并没有在物理像素方面做任何事情——他们使用这个术语来表示新事物,但他们的听众认为它意味着什么它一直都有。因此,现在文档倾向于通过回避对“像素”的任何引用来避免混淆;他们现在改用“设备独立单元”。
如果您的计算机的显示设置设置为 96dpi(默认的 Windows 设置),那么这些与设备无关的单位将与像素一一对应。但是,如果您已将显示设置设置为 120dpi(在以前的 Windows 版本中称为“大字体”),那么 Height="96" 的 WPF 元素实际上将是 120 个物理像素高。
因此,您认为边距“不会相对于显示器的分辨率”的假设是不正确的。您可以自己验证这一点,方法是编写 WPF 应用程序,然后切换到 120dpi 或 144dpi 并运行您的应用程序,并观察一切仍然排成一行。您对边距“与显示器分辨率无关”的担忧被证明不是问题。
(在 Windows Vista 中,您可以通过右键单击桌面 > 个性化来切换到 120dpi,然后单击侧栏中的“调整字体大小 (DPI)”链接。我相信这在 Windows 7 中是类似的。请注意,这需要每次重新启动时间你改变它。)
字体大小无关紧要
至于字体大小,这也不是问题。这是您可以证明的方法。将以下 XAML 粘贴到Kaxaml或任何其他 WPF 编辑器中:
<StackPanel Orientation="Horizontal" VerticalAlignment="Top">
<ComboBox SelectedIndex="0">
<TextBlock Background="Blue">Foo</TextBlock>
</ComboBox>
<ComboBox SelectedIndex="0" FontSize="100pt">
<TextBlock Background="Blue">Foo</TextBlock>
</ComboBox>
</StackPanel>

观察 ComboBox 镶边的粗细不受字体大小的影响。从 ComboBox 顶部到 TextBlock 顶部的距离完全相同,无论您使用的是默认字体大小还是完全极端的字体大小。组合框的内置边距是恒定的。
使用不同的字体也没关系,只要标签和 ComboBox 内容使用相同的字体,字体大小、字体样式等相同。标签的顶部会对齐,并且如果顶部对齐,基线也会对齐。
所以是的,使用边距
我知道,这听起来很草率。但是 WPF 没有内置的基线对齐,而边距是它们为我们提供的处理此类问题的机制。他们做到了,因此利润可以发挥作用。
这里有一个提示。当我第一次测试这个时,我不相信组合框的 chrome 会完全对应于 3 像素的上边距——毕竟,WPF 中的许多东西,包括尤其是字体大小,都是以精确的、非整数的方式测量的尺寸,然后捕捉到设备像素——我怎么知道在 120dpi 或 144dpi 屏幕设置时不会因为四舍五入而错位?
答案很简单:将代码模型粘贴到 Kaxaml 中,然后放大(窗口左下角有一个缩放滑块)。如果即使放大后一切仍然排成一行,那你就没事了。
将以下代码粘贴到 Kaxaml 中,然后开始放大,向自己证明边距确实是要走的路。如果红色覆盖在 100% 缩放、125% 缩放 (120dpi) 和 150% 缩放 (144dpi) 时与蓝色标签的顶部对齐,那么您可以确定它适用于任何东西。我已经尝试过了,在 ComboBox 的情况下,我可以告诉你,他们确实为 chrome 使用了整数大小。上边距 3 将使您的标签每次都与 ComboBox 文本对齐。
(如果您不想使用 Kaxaml,您可以在 XAML 中添加一个临时 ScaleTransform 以将其缩放到 1.25 或 1.5,并确保一切正常。即使您首选的 XAML 编辑器没有缩放功能。)
<Grid>
<StackPanel Orientation="Horizontal" VerticalAlignment="Top">
<TextBlock Background="Blue" VerticalAlignment="Top" Margin="0 3 0 0">Label:</TextBlock>
<ComboBox SelectedIndex="0">
<TextBlock Background="Blue">Combobox</TextBlock>
</ComboBox>
</StackPanel>
<Rectangle Fill="#6F00" Height="3" VerticalAlignment="Top"/>
</Grid>
- 100% 时:

- 在 125% 时:

- 在 150% 时:

他们总是排队。利润是要走的路。