我正在实现一个自定义控件,它提供要从外部类(即主窗体)处理的公共事件。
主窗体可以处理这些事件(在我的例子中,它是一个高级的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上绘制的控件。如何确定何时绘制它?
答案 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