3

ContextMenuStrip に 10 個ほどの項目があります。10 個の項目のうちどれを表示するかを決定する Opening Event ハンドラがあります。アプリケーション ロジックに基づいて、Visible = false および Enabled = false に設定することで、それらの多くを非表示にすることができます。

6/10が表示されている場合です。ストリップを初めてクリックすると、領域 4 メニュー項目の高さが空白になります。右クリックして2回目に表示させると、本来あるべき場所に表示されます。したがって、ストリップは基本的に、実際には 6 アイテムのストリップであるにもかかわらず、10 アイテムのストリップに対して計算された位置を持っています。

ファーストクリック こんな感じ 2回目のクリックは問題ないようです

強制的に再計算するにはどうすればよいですか?

ここに私が試したことのいくつかがあります:

        contextMenuStrip1.Refresh();
        contextMenuStrip1.Update();
        contextMenuStrip1.PerformLayout();
        contextMenuStrip1.AutoSize = true;

        ToolStripItem tempItem = contextMenuStrip1.Items.Add("temp");
        contextMenuStrip1.Items.Remove(tempItem);

        contextMenuStrip1.Refresh();
        contextMenuStrip1.Update(); 

        contextMenuStrip1.Invalidate();
4

2 に答える 2

4

私はそれを見つけました

AutoSize = false;
AutoSize = true;

すべてのアイテム操作が機能した後。他の解決策は見つかりませんでした。

私の場合、開くときにアイテム(ウィンドウの動的リスト)を追加しますが、アイテムのキャプションがメニューよりも長い場合がありました。

于 2013-01-16T14:04:56.943 に答える
0

Invalidate() を使用してみましたか?

MSDN から:

コントロールの表面全体を無効にし、コントロールを再描画します。(Control から継承されます。)

おそらく、WM_PAINT メッセージを使用する必要があります。Winforms で SendMessage (Interop) を使用する必要がある場合があることがわかりました。

http://msdn.microsoft.com/en-us/library/windows/desktop/dd145213(v=vs.85).aspx

于 2012-07-09T06:48:43.820 に答える