不确定如何解释,但是:
MyPopup
,由ToolStripDropDown
; MyPopup
控件(称为弹出窗口); Form
; 问题是在子弹出窗口关闭后,即使父窗口Form
获得焦点,父窗口也会停留在屏幕上。关闭那个卡住的父弹出窗口的唯一方法是获得焦点(使用鼠标)并点击 Esc 。
要让弹出窗口能够显示另一个弹出窗口,我必须欺骗Closing
事件:
void Popup_Closing(object sender, ToolStripDropDownClosingEventArgs e)
{
// prevent from closing when stay
if (_stay && e.CloseReason != ToolStripDropDownCloseReason.CloseCalled )
{
e.Cancel = true;
return;
}
}
在关闭子弹出窗口之前,父弹出窗口有:
_stay
的值为False
; Popup.AutoClose
的值为True
; 我试图通过以下方式将鼠标焦点“带回”父弹出窗口:
TopLevel=true
没有运气; Focus();
没有运气; Focused=true;
没有运气; AutoClose=true;
没有运气; Captured=true;
没有运气; 还尝试将上述值设置为False
然后再设置为True
,仍然没有运气。
这里有更多代码,可能有用或无用:
public class MyPopup : UserControl
{
protected bool _stay = false;
private ToolStripDropDown _popup;
private ToolStripControlHost _host;
public MyPopup()
{
// create popup
_popup = new ToolStripDropDown();
_popup.Margin = _popup.Padding = Padding.Empty;
_popup.AutoSize = false;
_popup.Closing += Popup_Closing;
// add host
_host = new ToolStripControlHost(this);
_host.Margin = _host.Padding = Padding.Empty;
_host.AutoSize = false;
_popup.Items.Add(_host);
}
public void Show(Control parent, int x, int y)
{
_popup.Show(parent, x, y);
}
public new void Hide()
{
_popup.Close();
}
private void Popup_Closing(object sender, ToolStripDropDownClosingEventArgs e)
{
// prevent from closing when stay
if (_stay && e.CloseReason != ToolStripDropDownCloseReason.CloseCalled )
{
e.Cancel = true;
return;
}
}
protected void PopupChildClosedDefaultEvent(object sender, EventArgs e)
{
// hide popup if mouse is outside of client region when closing child popup
if (!ClientRectangle.Contains(PointToClient(MousePosition)))
Hide();
else
{
// >> here I am trying different things <<
_popup.AutoClose = false;
_popup.AutoClose = true;
}
}
}
public class PopupParent: MyPopup
{
private void TestChildren()
{
_stay = true;
PopupChild popup = new PopupChild();
popup.Show(button1, 0, 0);
popup.Closed += PopupChildClosedDefaultEvent;
_stay = false;
}
}
public class PopupChild: MyPopup
{
}
问题:有没有办法修复“破损”弹出窗口,因为它已经失去了在鼠标事件上自动关闭的能力(点击客户区域以外的某个地方)?
答案 0 :(得分:0)
好的,早上给大脑带来了一些新鲜感,我设法解决了这个问题:
_popup.Close();
_popup.Show(_parent, _x, _y);
所以我必须重新设置弹出窗口以使其像以前一样运行。它闪烁,但有效。