1

これを説明する方法はわかりませんが、次のとおりです。

  • 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;
        }
    }

子ポップアップを閉じる前に、親ポップアップには次のものがあります。

  • の値_stayFalse;
  • の値Popup.AutoCloseTrue;

次のようにして、マウスのフォーカスを親ポップアップに「戻す」ことを試みました。

  • 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
{
}

質問:マウス イベント (クライアント領域の外のどこかをクリック) で自動的に閉じる機能を失った後、「壊れた」ポップアップを修正する方法はありますか?

4

1 に答える 1