0

C# と WinForms は初めてです。右クリック (コンテキスト メニュー) イベントを持つオブジェクトがいくつかあります。ただし、コンテキストに応じて (たとえば、ユーザーがウィザード画面にいるかメイン画面にいるかによって)、右クリックの動作を変更したいと考えています。少しグーグルで調べたところ、+=and-=演算子を使用できることがわかりましたが、それでもやりたいことを達成できませんでした。たとえば、以下のコードを考えると、

何か案は ?

編集:OnClickCard場所によって異なる動作が必要です。

サンプルコード:

public override ContextMenuStrip GetContextMenuStrip(GoView view)
{
    if (Selectable)
    {

        ContextMenuStrip contextMenu = new ContextMenuStrip();

        if (!Empty)
        {
            // this is just for example so not showing the implementation
            contextMenu.Items.Add(new ToolStripMenuItem(
                "Delete", 
                null, 
                new EventHandler(OnClickDelete))); 
        }

        // Empty
        else
        {
            ToolStripMenuItem addCard = new ToolStripMenuItem("Add");

                foreach (..some data..)
                {
                    ToolStripMenuItem card = new ToolStripMenuItem(
                            data,
                            null,
                            new EventHandler(OnClickCard));

                    addCard.DropDownItems.Add(card);

                }
        }

    }
    else
    {
        return null;
    }
}


private void OnClickCard(object sender, EventArgs e)
{
    ToolStripMenuItem cardItem = (ToolStripMenuItem)sender;
    if (cardItem.Text.Contains("ABC"))
    {
        Common.Forms.FormMMUSettings f = new FormMMUSettings(cardItem.Text,ParentMagazine.NextSite);
        f.Show();
    }
    SetCard(new MagazineCard(2, cardItem.Text));
}
4

3 に答える 3

1

クリックされたときの状況に応じて、コンテキスト メニューの内容を変更したいということですか。その場合、最も簡単な方法は、複数のコンテキスト メニューを作成し、イベントを使用して必要なコンテキスト メニューを設定することです。

ContextMenu menu1 = new ContextMenu();

MenuItem menu1Item1 = new MenuItem();
menu1Item1.Header = "Menu 1 Item 1";
menu1Item1.Click += new RoutedEventHandler(menu1Item1Clicked);
menu1.Items.Add(mnu1Item1);

MenuItem menu1Item2 = new MenuItem();
menu1Item2.Header = "Menu 1 Item 2";
menu1Item2.Click += new RoutedEventHandler(menu1Item2Clicked);
menu1.Items.Add(menu1Item2);

ContextMenu menu2 = new ContextMenu();

MenuItem menu2Item1 = new MenuItem();
menu2Item1.Header = "Menu 2 Item 1";
menu2Item1.Click += new RoutedEventHandler(menu2Item1Clicked);
menu2.Items.Add(menu2Item1);

MenuItem menu2Item2 = new MenuItem();
menu2Item2.Header = "Menu 2 Item 2";
menu2Item2.Click += new RoutedEventHandler(menu2Item2Clicked);
menu2.Items.Add(menu2Item2);

public void menu1Item1Clicked(object sender, EventArgs e)
{

}

etc..

これで、次を使用して必要なメニューを設定できます。

myForm.ContextMenu = menu1;

お役に立てれば。

于 2013-04-11T12:06:22.853 に答える
0

+=正常に-=動作するはずですが、使用するハンドラーを切り替える一種のハンドラーリポジトリを使用することをお勧めします。これは、ウィザードのステップが異なれば戦略も異なる戦略パターンのように機能するはずです。

いくつかのコードを示して、どのコード部分が適切に機能しないかを指摘していただけると、より簡単に解決できます。

于 2013-04-11T11:57:24.320 に答える
0

コンテキストに応じて異なるハンドラーをアタッチすることを提案しているようです:

if(that)
    obj.event += HandleThat;
else
    obj.event += HandleSomethingElse;

それは機能するはずですが、1 つのハンドラーで実行することもできます。

obj.event += HandleAll;

void HandleAll(object sender, EventArgs arg) {
    if(that)
        HandleThat();
    else
        HandleSomethingElse();
}

編集:わかりました、あなたの編集された質問は本当に別のことを意味していました。

最初の明らかな問題はOnClickDelete、ハンドラーとして追加しOnClickCard、例で呼び出されない実装を示すことです。タイプミスの場合は、必要に応じてハンドラー メソッドを実装するだけです。正確にはどの部分が機能していませんか?

于 2013-04-11T12:02:12.040 に答える