2

システム トレイのコンテキスト メニューに 26 の項目と追加のToolStripTextBoxメニュー項目があります。ユーザーがフィルター テキスト ボックスにテキストを入力すると、ユーザーの入力に応じてメニュー項目が継続的にフィルター処理され、 を に設定することでその場でカテゴリが非表示になりToolStripMenuItem Visible propertyますfalse

それは働いている!

問題は、フィルタリングされると、コンテキスト メニューの高さが下から上に向かって短くなることです。メニューの原点は右上隅であるため、上に向かって縮小します。システムトレイ関連のコンテキストメニューなので、下に縮む(下重心)と予想。

これを実現する方法は?

4

1 に答える 1

1

これを行うための「適切な」組み込みメソッドがあるかどうかはまだわかりません...

それまでの間、サイズが変わるたびに ContextMenuStrip の Bounds() を変更するハックがあります。高さがどれだけ変化しても、ContextMenuStrip を上下にシフトするだけです。ContextMenuStrip の Opened() および SizeChanged() イベントを接続し、最後の Bounds() をクラス レベルの「lastBounds」変数に格納しました。

    private Rectangle lastBounds;

    private void contextMenuStrip1_Opened(object sender, EventArgs e)
    {
        lastBounds = contextMenuStrip1.Bounds;
    }

    private void contextMenuStrip1_SizeChanged(object sender, EventArgs e)
    {
        Rectangle rc = contextMenuStrip1.Bounds;
        int diff = lastBounds.Height - rc.Height;
        if (diff > 0)
        {
            contextMenuStrip1.Bounds = new Rectangle(new Point(rc.X, rc.Y + diff), rc.Size);
            lastBounds = contextMenuStrip1.Bounds;
        }
        else
        {
            contextMenuStrip1.Bounds = new Rectangle(new Point(rc.X, rc.Y - diff), rc.Size);
            lastBounds = contextMenuStrip1.Bounds;
        }
    }
于 2013-05-01T21:05:06.910 に答える