これを説明する方法はわかりませんが、次のとおりです。
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
{
}
質問:マウス イベント (クライアント領域の外のどこかをクリック) で自動的に閉じる機能を失った後、「壊れた」ポップアップを修正する方法はありますか?