3

メインメニュー項目に「リンク」されているコントロールのコンテキストメニューを作成しようとしています。常に存在する2つの固定メニュー項目と、メニューに含める必要のある任意の数の追加メニュー項目があります。

固定メニュー項目と動的メニュー項目のリストへのクラスレベルの参照を保持することによって、問題を解決しようとしました。Opening現在のアイテムのリストをクリアしてから、適切なアイテムをメニューに追加することで、両方のメニューのイベントを処理しています。これはメインメニューでは問題なく機能しますが、コンテキストメニューの動作がおかしくなります。

主な問題は、Opening発生するまでに、メニューがどのアイテムを表示するかをすでに決定していることだと思われます。このフォームは次のことを示しています。

using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public class DemoForm : Form
    {
        private List _items;

        public DemoForm()
        {
            var contextMenu = new ContextMenuStrip();
            contextMenu.Opening += contextMenu_Opening;

            _items = new List();
            _items.Add(new ToolStripMenuItem("item 1"));
            _items.Add(new ToolStripMenuItem("item 2"));


            this.ContextMenuStrip = contextMenu;
        }

        void contextMenu_Opening(object sender, CancelEventArgs e)
        {
            var menu = sender as ContextMenuStrip;

            if (menu != null)
            {
                foreach (var item in _items)
                {
                    menu.Items.Add(item);
                }
            }
        }
    }
}

初めてフォームを右クリックすると、何も表示されません。2回目は、メニューが期待どおりに表示されます。アイテムを更新できる別のイベントが発生しますか?メニュー項目を動的に選択するのは悪い習慣ですか?

注:これは、そのような機能を必要としている人のために作成し始めた例であり、それがどれほど難しいかについて興味があったので、なぜこれが行われるのかについての詳細を提供することはできません。この人はメインを「リンク」したいと考えていますメニュー項目をコンテキストメニューに追加します。メニュー項目は単一のメニューの子にしかなり得ないため、これは合理的な方法のように思われます。アプローチの代替案は大歓迎です。

4

1 に答える 1

2

コントロールのMouseDownイベント中にアイテムを処理できます。マウスの右ボタンでもあることを確認してください。

于 2008-09-19T16:38:24.267 に答える