MessageBox保持隐藏,直到父窗体重新聚焦

时间:2012-01-26 12:57:27

标签: c# .net winforms messagebox

我正在实现一个自定义控件,它提供要从外部类(即主窗体)处理的公共事件。

主窗体可以处理这些事件(在我的例子中,它是一个高级的TabControl)。

我的自定义控件的摘录:

public class FlatTabControlEx : TabControl {
  public delegate void OnTabCloseQueryDelegate(int tabIndex, TabPage tabPage);
  public event OnTabCloseQueryDelegate TabCloseQuery;

  protected override void OnPaint(PaintEventArgs e) {
    DrawControl(e.Graphics);
    base.OnPaint(e);
  }

  protected override void OnClick(EventArgs e) {
    var imageRect = GetImageRectangle()
    bool mouseOver = imageRect.Contains(GetMousePos());         
    if (mouseOver) {
      if (TabCloseQuery != null) {
        TabCloseQuery(i, TabPages[i]);
      }
    }
  }
}

以下是我处理该事件的方式:

public partial class TestForm : Form {
  public TestForm() {
    InitializeComponent();

    _flatTabControlEx.TabCloseQuery += (index, tabPage) => {
      if (MessageBox.Show("Close tab with title " + tabPage.Text, "Question", MessageBoxButtons.YesNo) == DialogResult.Yes) {
        _flatTabControlEx.TabPages.Remove(tabPage);
      }
    };
  }
}

不知何故,消息框被隐藏(通过其主要形式?)并且仅在主窗体丢失并重新获得焦点时显示。提供不同的所有者似乎没有帮助。

我该如何处理这种情况以及该行为是如何引起的?

修改1 :在上面添加了一些最小化代码。

编辑2 :我注意到它实际上是我在MessageBox上绘制的控件。如何确定何时绘制它?

1 个答案:

答案 0 :(得分:0)

我遇到了与datagridview cellpainting事件相同的问题。 该怎么做才能避免重复。

当您离开控件时,会触发一些事件,例如验证,绘画等。

对于这种情况,当打开消息框时,控件会检查他的任务并开始执行。如果有一个数据格式错误停止过程,如果有一个绘制任务保持父表单在顶部,所以消息框留在后面。

这是我的解决方案(Winforms但它应该是相同的)

Public Class HybridDataGridView
Inherits DataGridView
WithEvents NewDataGridViewTextBox As New TextBox
Private NoFocus As Integer = 0

 Private Sub HybridDataGridView_LostFocus(sender As Object, e As EventArgs) Handles Me.LostFocus
    NoFocus = 1
 End Sub
 Private Sub HybridDataGridView_GotFocus(sender As Object, e As EventArgs) Handles Me.GotFocus
    NoFocus = 0
  End Sub
 Private Sub HybridDataGridView_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles Me.CellPainting
    If Me.CurrentCell Is Nothing Then
        Exit Sub
    End If
    Dim Kalem As Pen
    If e.ColumnIndex = Me.CurrentCell.ColumnIndex And e.RowIndex = Me.CurrentCell.RowIndex Then
        If NoFocus = 0 Then
           Kalem = New Pen(Color.Black, 1)
           e.PaintBackground(e.ClipBounds, True)
           e.PaintContent(e.ClipBounds)
         End if
      End if

  End sub
End Class