模态对话框按钮点击不会长时间响应

时间:2016-10-05 18:01:32

标签: c# winforms modal-dialog click

我们有一个奇怪的客户问题,无法通过开发环境再现。我们看到它发生在客户环境中,但我们无法在我们拥有的任何其他环境中重现它。这使得解决问题变得困难,这就是我需要帮助的原因。

问题是,只要有一个模态对话框" OK" /"取消"按钮,当用户点击任何一个按钮时,该对话框需要很长时间才能响应并消失。第二次显示相同的对话框,点击响应更快。 我们观察到这主要是模态对话而不是非模态对话。

在显示模态对话框之前我们做的一件特别的事情是我们创建一个位于主窗体和模态对话框之间的新窗体。创建此新表单是为了提供模糊效果,以清楚地表明您必须先对模态对话框执行某些操作,然后才能返回主窗体。这是针对UI效果完成的,这里是代码,

private void BaseModalForm_Load(object sender, EventArgs e)
{
  // Some dialogs are not modal (For example Options Dialog ), still derived   from BaseModalForm .. Give the blur effect only when its a modal dialog.
  if (this.Modal)
  {
      Global.ModalDialogCount += 1;
      if (Global.MainForm != null && !Global.MainForm.IsDisposed)
      {
          // Create the white layer which would be rendered on top of the Main Window once the modal dialog appears, to give prominence to the modal dialog
          // Show the white layer only when first modal dialog is shown
        if (Global.MainForm.Visible && Global.ModalDialogCount == 1)
        {
          CreateWhiteLayerForm();
          whiteLayerForm.Show(Global.MainForm);
          whiteLayerForm.Enabled = false;
         }
      }
  }
}

private void CreateWhiteLayerForm()
{
    whiteLayerForm = new Form();

    int titleHeight = SystemInformation.CaptionHeight;
    int borderHeight = SystemInformation.FrameBorderSize.Height;
    int borderWidth = SystemInformation.FrameBorderSize.Width;

    // The white layer should not cover the title bar
    whiteLayerForm.Size = new System.Drawing.Size(Global.MainForm.Size.Width, Global.MainForm.Size.Height - titleHeight);
    whiteLayerForm.Location = new System.Drawing.Point(Global.MainForm.Location.X , Global.MainForm.Location.Y + borderHeight + titleHeight);
    whiteLayerForm.StartPosition = FormStartPosition.Manual;

    whiteLayerForm.AutoScaleMode = AutoScaleMode.None;
    whiteLayerForm.ShowInTaskbar = false;

    whiteLayerForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
    whiteLayerForm.BackColor = System.Drawing.Color.White;
    whiteLayerForm.Opacity = 0.5;
}

private void BaseModalForm_FormClosed(object sender, FormClosedEventArgs e)
{
    if(whiteLayerForm != null)
        whiteLayerForm.Dispose();
    if(this.Modal)
      Global.ModalDialogCount -= 1;
}

此代码始终有效,直到我们在客户环境中遇到这个奇怪的问题。我怀疑这可能导致点击不响应。

但这可能是错的。客户环境中的某些反病毒程序是否可能阻止点击?这个问题发生在那个环境中的很多人身上。

还有其他原因吗?有没有人偶然遇到过这个?任何帮助表示赞赏。如果您需要任何其他细节,请告诉我。

2 个答案:

答案 0 :(得分:0)

原因可能是在其他一些应用程序中,不加区分地错误地设置其他应用程序的窗口对象上的挂钩。

我在安装了Punto Switcher的工作站上看到了同样的情况。尝试摆脱键盘切换器,托盘内的词典,调试工具,键盘记录器,不要忘记病毒:)。

答案 1 :(得分:0)

图形变量

尽管使用相同的代码,图形渲染将花费不同的时间长度,具体取决于运行的机器和渲染应用程序,您不能假设任何图形代码部分将在所有设备上以最佳方式运行。

因此,这段代码非常可疑,应该可以通过询问有关已部署环境图形系统的详细问题来重现它。

private void CreateWhiteLayerForm()
{
    whiteLayerForm = new Form();

    int titleHeight = SystemInformation.CaptionHeight;
    int borderHeight = SystemInformation.FrameBorderSize.Height;
    int borderWidth = SystemInformation.FrameBorderSize.Width;

    // The white layer should not cover the title bar
    whiteLayerForm.Size = new System.Drawing.Size(Global.MainForm.Size.Width, Global.MainForm.Size.Height - titleHeight);
    whiteLayerForm.Location = new System.Drawing.Point(Global.MainForm.Location.X , Global.MainForm.Location.Y + borderHeight + titleHeight);
    whiteLayerForm.StartPosition = FormStartPosition.Manual;

    whiteLayerForm.AutoScaleMode = AutoScaleMode.None;
    whiteLayerForm.ShowInTaskbar = false;

    whiteLayerForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
    whiteLayerForm.BackColor = System.Drawing.Color.White;
    whiteLayerForm.Opacity = 0.5;
}

您应该能够通过将对此和其他类似方法的任何调用移动到后台线程来恢复对用户操作的响应性,例如点击。