【问题标题】:WPF layout on a Window窗口上的 WPF 布局
【发布时间】:2010-11-27 05:37:32
【问题描述】:

我在 WPF Windows 上有几个列表框,在表单上设置了 Height="Auto" Width="Auto"

在不同的分辨率下,表单大小完美,但问题是当我按下最大化按钮时,会在表单调整大小时看到一个粗大的“黑色 L”。我在很多 WPF 应用程序上都看到过这个问题,但直到现在都没有解决这个问题。

有没有办法在窗体上的控件调整大小时对窗口进行双缓冲,或者在 WPF 中调用 SuspendLayout()?怎样才能摆脱这个丑陋的黑L?

【问题讨论】:

  • 您可以添加您看到的视觉工件的屏幕截图吗?我无法完全想象它。
  • 我尝试打印屏幕,但 windows 没有发现问题,但我已经在绘画中做了一个快速模型。 img16.imageshack.us/img16/403/25229633.png 仅当列表框中有数据时才会出现此问题。如果我不添加任何数据,则不会出现问题。几乎就像在调整窗口大小时列表框正在重新加载数据一样
  • 看起来与这个问题重复:stackoverflow.com/questions/555326/…

标签: wpf layout controls resize rendering


【解决方案1】:

引用最近的Hanselminutes之一:

Ian Griffiths:... win32 提示 这是一个普通的win32消息循环,WPF将消息池化 把它们放在它自己的位置上 提示,然后自行处理 甜蜜的时光,部分是因为它想 能够重新排序事件,因为他们 进来。它会优先考虑某些 输入处理之上的东西,对于 顺便说一下,这就是为什么 你得到了稍微奇怪的重绘 处理调整 WPF 应用程序的大小, 你可能已经注意到你得到了一点 出现一点空白 临时调整窗口大小时 这是因为它承认 在事件真正发生之前调整事件大小 用它做任何事情,然后 绘画稍微不同步 与通常在那里的东西。所以那里 是一个 win32 消息队列,但它不是 实际上是 WPF 中的主要消息队列 这就是各种实现 调度员试图隐藏的细节 尽可能多地了解它。

这似乎与您的问题有关,但我不知道完整的解决方案。 也许,您应该尝试更改一些 Dispatcher 优先级?

【讨论】:

    【解决方案2】:

    Vault,我认为这可能与列表框执行的 UI 虚拟化有关。虚拟化允许列表框仅加载正在呈现的那些 UI 元素。列表框借助 VirtualizingStackPanel 作为其 ItemsPanelTemplate。

    所以我的猜测似乎是......最大化窗口会推动列表框生成更多 UI 元素,延迟会导致黑色“L”。

    您可以删除虚拟化并检查黑色“L”是否仍然出现。顺便说一句,虚拟化实际上是一个“好”的东西,关闭它通常是个坏主意。

    【讨论】:

    • 删除虚拟化无效。老实说,我在很多 WPF 应用程序中都看到过这个问题,开发人员总是将这个问题推到队列的后面,因为它被视为低优先级
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 2015-12-29
    • 2011-11-10
    • 1970-01-01
    • 2013-03-08
    相关资源
    最近更新 更多