1

当我执行以下步骤时,我的应用程序的主要形式在设计器中不断变白:

1)在设计模式下打开表单(此时所有控件都可见) 2)查看表单的源代码 3)切换回设计视图

执行上述步骤后,表单的设计模式下没有任何可见的内容(甚至是表单)。我的应用程序中只有一个表单存在这个问题,不幸的是,这是我的主要表单,其中有很多逻辑。解决方法是始终关闭表单并在设计模式下重新打开它,以显示所有组件再次可见。当我的可用内存不足时,我遇到了设计师的不稳定错误,但是这种形式总是会产生这种症状并且是唯一的一种。关于造成这种情况的任何想法?我想我总是可以创建一个新表单并尝试移动所有控件和逻辑,但是如果有更简单的选择,我宁愿避免这项工作。

4

3 回答 3

2

诊断是控件的 Paint 事件或 OnPaint 方法行为异常。这些方法在设计时运行,因此您将获得控件的准确可视化表示,例如,您可以在设计时看到 PictureBox 的 Image 属性。当这样的绘画事件陷入循环时,整个表单将停止正确渲染。除了一个简单的错误之外,典型的原因是代码在设计模式下被非标准的运行时环境弄糊涂了。您使用 DesignMode 属性来确保此类代码不会造成问题并在设计模式下被禁用。

找到行为不端的代码是一项挑战,尤其是当这些不是您自己编写的控件时。除了逐个删除控件以找到麻烦制造者之外,您还可以通过启动另一个 Visual Studio 实例并使用工具 + 附加到进程来附加到第一个实例来使用调试器。

于 2012-09-03T15:52:01.167 回答
0

根据个人经验,我可以确认这在 Visual Studio 2003 和 2005 中都是偶尔出现的问题,无论是使用 VB 还是 C#。我们将这两个版本都修补到了最新的服务包,甚​​至直接从 Microsoft 获得了修补程序,但都没有解决问题。

对于 Visual Studio 2003 中的 VB,控件的消失也删除了底层设计器代码,因此我们不得不从我们的版本控制系统中恢复已删除的代码。非常烦人 - 因为我们经常会丢失代码更改并且必须重新开始。

于 2012-09-04T10:17:22.067 回答
0

您绝对应该检查下一个链接: https ://weblog.west-wind.com/posts/2019/Feb/14/WPF-Hanging-in-Infinite-Rendering-Loop?fbclid=IwAR23ZnUrz7buVpFLXOX2qQin1WcifQ6h280EO25URO74NTGDkTedx1TDRb4

这是该页面的引用:

使用 StarDefinitionsCanExceedAvailableSpace Override 此设置会覆盖新的 GridRendering 行为,基本上可以让您在项目中使用 .NET 4.7.x 目标运行,但保留以前版本中使用的旧行为。

可以在 app.config 中为您的应用程序设置一个配置设置:

<configuration>
     <runtime>
        <AppContextSwitchOverrides value="Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=true"
     />
    </runtime>
</configuration>

我可以验证使用该开关可以让我运行 4.7.1 并且在任何缩放模式下都看不到锁定。在我之后

在 4.6.2 中运行我的版本后,我再次在一个单独的分支中升级到 4.7.1 来尝试这一点,并且确实该开关使应用程序以 4.7.1 为目标运行。所以有一个hacky的解决方法。

不过,这是一种解决方法。根据微软的说法,这个“修复”改进了网格渲染分配,提供更精确的大小,还提高了性能并减少了内存使用。在纸面上,这是一个很大的改进,但是......好吧,副作用

我怀疑这个问题并不普遍,因为没有太多关于它的信息。我认为 Markdown Monster 提出了这个问题,因为启动序列有很多窗口操作。MM 使用 MahApps UI 框架,该框架为主窗口使用窗口动画和额外的渲染帧,并且 MM 本身将窗口移出屏幕以进行初始渲染,并在窗口不适合屏幕时根据屏幕尺寸和 DPI 设置调整窗口大小否则会在屏幕外。IOW,将初始窗口放到屏幕上比简单的 WPF 表单更有可能遇到此错误。

所以我怀疑每个应用程序都需要担心这一点,但如果你有一个 4.7.x WPF 应用程序,那么在不同的分辨率和比例级别上尝试它可能是个好主意,只是看看它的表现如何。

于 2020-07-05T10:45:05.497 回答