WPF窗口布局

7
我在WPF窗口上有几个列表框,表单上设置了Height="Auto" Width="Auto"。在不同的分辨率下,该表单大小完美适配,但问题是当我按最大化按钮时,表单调整大小时会出现一个厚实的“黑色L”形状。我已经在很多WPF应用程序中看到过这种情况,但直到现在才需要解决这个问题。是否有一种方法可以双缓冲窗口,或在WPF中调用SuspendLayout()来调整表单上的控件大小?如何摆脱这个丑陋的黑色L形状?

1
你能添加一张你所看到的视觉瑕疵的截图吗?我无法完全想象它。 - Drew Noakes
我尝试过截屏,但Windows无法捕捉到问题,但我在画图中制作了一个快速的模型。http://img16.imageshack.us/img16/403/25229633.png只有当列表框中有数据时才会出现此问题。如果我不添加任何数据,则不会出现问题。这几乎就像是列表框在调整窗口大小时重新加载数据。 - Vault
看起来和这个问题重复了:https://dev59.com/6EbRa4cB1Zd3GeqP1pWf - Massimiliano
2个回答

3

引用最近Hanselminutes的一段话:

Ian Griffiths: ... 有一个 win32 cue,它是普通的 win32 消息循环,WPF 从中池化消息并将其放在自己的队列上,然后按照自己的节奏处理它们,部分原因是希望能够重新排序事件。例如,它会优先考虑某些事情而不是输入处理,这也是为什么在调整 WPF 应用程序大小时会出现略微奇怪的重绘处理,您可能已经注意到,在调整窗口大小时会出现一小段空白区域,这是因为它在实际处理之前先确认了调整大小事件,然后绘制稍微与正常情况不同。所以有一个 win32 消息队列,但它实际上不是 WPF 的主要消息队列,这些都是调度程序试图尽可能隐藏的实现细节。

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


0

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

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

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


1
取消虚拟化并没有奏效。老实说,我在许多WPF应用程序中都遇到过这个问题,开发人员总是将其视为低优先级并将其推迟到队列的后面。 - Vault

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