MessageBox остается скрытым, пока родительская форма не перефокусируется - PullRequest
0 голосов
/ 26 января 2012

Я реализую пользовательский элемент управления, который предоставляет общедоступные события для обработки из внешнего класса, то есть основной формы.

Основная форма может обрабатывать эти события (в моем случае это расширенный 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 голосов
/ 04 апреля 2016

У меня была такая же проблема с событием рисования сетки данных.Что делать, это избегать повторений.

когда вы покидаете элемент управления, запускаются некоторые события, такие как проверка, рисование и т. Д.

Для случая, когда окно сообщения открыто, элемент управления просматривает егозадачи и начать делать.Если есть ошибка остановки процесса форматирования данных, если есть задача рисования, держите родительскую форму сверху, поэтому окно сообщения остается позади.

Это было мое решение (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
...