【问题标题】:Not rendering controls in debug mode不在调试模式下呈现控件
【发布时间】:2021-10-08 00:00:16
【问题描述】:

我有一个 winform 应用程序,我在其中调用一个设置窗口作为新线程上的 ShowDialog。

当我在调试模式下运行应用程序时,设置表单的 Show() 事件不会触发。我尝试了备用 Load() 事件,它起作用了。在这种方法中,我填充了一个列表(DataGridView)并显示它。当表单呈现时,什么都没有显示。它只是一个空白表格。

但是,对于相同的代码,当我在没有调试的情况下运行它时(ctrl + F5),会触发 Show() 方法并显示列表。

代码是一个庞大框架的一部分,因此,我认为我无法提供足够可理解的度量。

我使用的是 Win7 64 位 m/c。

此外,即使我签入了 spy++,它也没有在表单中显示任何内容 - 因此它没有使用任何控件呈现。也没有为 DEBUG 隔离代码。

为什么会发生这种情况以及哪些设置可能需要更改?

【问题讨论】:

  • 你调用Invoke方法吗?你说你在一个新线程中显示对话框,那么你应该调用Invoke方法。
  • 如果您想知道在调试模式下到底发生了什么,请在任何抛出的异常上激活中断(在 VS 中,选择 Debug->Exceptions,然后在 Common Language Runtime Exceptions 前面 选中 Thrown 下的复选框)。您可以查看是否抛出任何异常。
  • 是的,我确实使用 Invoke,因为我从后台线程调用它。我尝试设置Thrown,但它没有抛出任何异常,只是弹出了空白表单。我在做一个 ctrl + F5 然后在 VS 中附加这个过程。这以某种方式起作用。
  • 创建一个有问题的最小项目并将其上传到某个地方(例如在 SkyDrive 上),以便我们对其进行测试并调查问题。

标签: c# winforms


【解决方案1】:

我认为解决方案非常简单。在 WinForms 编程中有一个叫做UI Thread 的东西。这意味着所有与 UI 相关的代码都应该在这个线程上执行。如果您在非 UI 线程上执行 UI 相关代码,您可能会收到“跨线程操作无效”异常或意外行为。

我认为这里的解决方案是在 UI 线程而不是新线程上创建设置窗口。

【讨论】:

  • 我必须使用新线程,因为现有应用程序就是这样设计的。此外,每当发生 UI 交互时,我都会使用 Invoke() 并调用委托方法。此外,当我在没有调试模式的情况下运行它时,它确实可以正常工作。只有在调试时才会出现问题。 VS2010会导致这个问题吗?
【解决方案2】:

对于初学者,在新线程上调用 ShowDialog() 表明您确实想改为调用 Show()。也就是说,当调试和发布版本执行不同时,通常意味着某些事情不同步。不知道它是如何发生的或为什么会发生,但修复通常就像点击“重建解决方案”一样简单。

【讨论】:

    【解决方案3】:

    在我遇到的类似情况下,将表单的 StartPositionWindowsDefaultLocation 设置为例如CenterScreen 帮忙。

    【讨论】:

      猜你喜欢
      • 2022-06-26
      • 1970-01-01
      • 2014-11-12
      • 2018-04-07
      • 1970-01-01
      • 1970-01-01
      • 2018-07-22
      • 2015-12-17
      • 1970-01-01
      相关资源
      最近更新 更多