【问题标题】:Why does WPF "height" property behaves like this, when it has "Auto" value?为什么 WPF 的“高度”属性具有“自动”值时的行为是这样的?
【发布时间】:2013-10-01 12:33:11
【问题描述】:

下午好!

我不想打扰你们,但我对 WPF 中的窗口“高度”属性没有什么疑问,当它具有“自动”值时。因为我想了解这里的事情是如何运作的。这是 XAML 代码:

<Window x:Class="WpfTest.MainWindow"
        x:Name="window"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Collapsed and Hidden buttons comparison" Width="500">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <StackPanel Height="50" Grid.Column="0" Margin="5,0">
            <Button Visibility="Collapsed">This is collapsed button</Button>
            <Button >Below collapsed button</Button>
        </StackPanel>
        <StackPanel Height="50" Grid.Column="1" Margin="5,0">
            <Button  Visibility="Hidden">This is hidden button</Button>
            <Button >Below hidden button</Button>
        </StackPanel>
    </Grid>
</Window>

当我使用明确的高度时:

Height="300"

或

 SizeToContent="WidthAndHeight"

在宽度之前一切都很完美,但是当我不输入或删除默认高度时,窗口有这种奇怪的外观。

在属性中“高度”的值为“自动”。当我使用程序代码获取实际高度时,它是 526。

MessageBox.Show(Convert.ToString(window.Height),"Height of the window");

有人可以解释一下为什么窗口会这样(我的意思是它从哪里获取高度)。提前致谢。

【问题讨论】:

  • 这里到底有什么奇怪的地方?它必须有一些高度。
  • 新建 WPF 窗口时的默认高度是 350,为什么当我删除这个值时它正好变成 526?
  • @MattBurland 是的,但我认为他暗示他希望高度为 50 或接近。
  • 请参阅here 了解有关如何计算窗口大小的信息。当您创建新窗口时,350 只是设计器的默认值。 526 可能是MinHeight 的默认值,但我不会依赖它。
  • 这实际上超出了 WPF 的范围。当您使用 Double.NaN(在 XAML 中也称为 Auto)时,WPF 在调用 Win32 的 CreateWindow 时会通过 CW_USEDEFAULT。 Windows 有一个特定的(undocumented)算法来放置和调整窗口大小,这就是你所看到的。更多信息msdn.microsoft.com/en-us/library/ms632679

标签: c# wpf


【解决方案1】:

这实际上超出了 WPF 的范围。当您使用 Double.NaN(在 XAML 中也称为 Auto)时,WPF 在调用 Win32 的 CreateWindow 时会通过 CW_USEDEFAULT。 Windows 有一个特定的(未记录)算法来放置和调整窗口大小,这就是你所看到的。

正如 Raymond Chen 明智的 suggests,您不能依赖这种未记录的 API,所以要么使用 SizeToContent,要么自己指定大小。请注意,您还可以使用 MinWidth 和 MinHeight 属性。

【讨论】:

    【解决方案2】:

    当您创建窗口时,默认高度设置为 SizeToContent 。当 Auto 被指定时,它会占用任何/或只占用它需要的空间。那就是尽可能多地占用空间。这是默认值。

    您可以阅读更多关于它的信息Use Automatic Layout Overview

    表格的大小与屏幕分辨率有很大关系

    编辑:

    这是有意设计的:

    MSDN

    属性Form.Size: 此属性的最大值受限于 窗体运行的屏幕分辨率。值不能 在每个屏幕尺寸上大于 12 像素(水平 + 12 和垂直 + 12)。

    【讨论】:

    • 这不是真的。 SizeToContent 会这样做,Auto 不会。自动遵循设置的任何其他规则(例如MinHeight、MaxHeight)。
    • 谢谢您的回复,我明白了。抱歉,这个问题可能很愚蠢,但是当我只有 2 个高度为 50 的 StackPanel 时,为什么它需要这么高的高度?
    • 我认为这是相关的stackoverflow.com/questions/3146106/…
    • @SecretSquirrel 非常感谢。它解释了一切。
    【解决方案3】:

    有时我也不明白 M$ 在幕后做了什么,但这是我对窗口高度/宽度的部分看法......如果你试图处理基于 WPF 窗口的情况会变得更糟屏幕支持不同的放大倍率。您知道人们何时将较大的文本/图标大小从 100%、125% 和 150% 更改为设置。

    无论如何,我发现当您运行一个没有高度/宽度的窗口并且它以“正常”模式运行时,它似乎启动了大约 3/4 的屏幕...如何/在哪里它确定了我没有找到的这个默认值。由于您指定了宽度,因此它尊重您对给定宽度的要求,但似乎保留了“正常”高度。

    现在如果你使用表达式混合通过

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    mc:Ignorable="d" d:DesignWidth="350" d:DesignHeight="400"
    

    这似乎告诉您的设计师我希望窗口以 350w x 400h 绘制。如上所述,“d:”是可忽略的,因此它不固定在这些尺寸上。因此,当实际绘制表单时,它会进行自己的巫毒计算以保持窗口大小成比例。

    “d:DesignWidth”和“d:DesignHeight”不仅仅是一个高度/宽度声明,其中高度/宽度应用为实际尺寸。

    因此,这可能无法准确解释如何/为什么,但这是我遇到的问题,并希望它可能对您遇到的情况有所帮助。

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 2023-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多