4

ToolStripMenu以下に示すように、ユーザーがアイテム「XML」および「非 XML」をフォーム上の通常のチェック ボックスであるかのように操作できるようにするものを作成しています。ただし、1 つの項目をオンまたはオフにすると、メニューが閉じます。メニューを閉じずに項目をチェック/チェック解除できるようにするにはどうすればよいですか? または、同じ動作を実現する別の標準的な方法はありますか?

ここに画像の説明を入力

だから私が欲しいのは、「非XML」をクリックしてチェックボックスを表示し、メニューを開いたままにすることです。最後のメニュー項目が「完了」になり、クリックすると「G2S」サブ項目は開いたままになりますが、「表示」サブ項目 ( XML、非 XML ) は閉じます。

何か案は?

注: これが最適なユーザー インターフェイス設計ではない可能性が高いことは承知しています。ただし、メニューの処理に関する技術的な知識を得るために、これをどのように達成できるかを知りたいです。

4

6 に答える 6

4

興味深い概念は、Stackoverflow のこのスレッドで説明されています。

受け入れられた答えの本質は次のとおりです。

ParentMenu.DropDown.AutoClose = false;

それはあなたが求めていることを正確に行います-サブアイテムがクリックされたときにメニューが閉じないようにします。

于 2012-11-13T01:18:31.363 に答える
3

これは、ユーザーがメニュー項目とドロップダウンの外側をクリックして閉じる必要がある便利な拡張機能です。

    public static void KeepOpenOnDropdownCheck (this ToolStripMenuItem ctl)
    {
        foreach (var item in ctl.DropDownItems.OfType<ToolStripMenuItem>())
        {
            item.MouseEnter += (o, e) => ctl.DropDown.AutoClose = false;
            item.MouseLeave += (o, e) => ctl.DropDown.AutoClose = true;
        }

    }
于 2018-05-17T10:33:13.020 に答える
1

元のソリューションは、マウス イベントを使用して機能します。

マウス入力イベント:

parent.dropdown.autoclose = false;

マウスを離すイベント:

parent.dropdown.autoclose = true;

唯一の問題は、ユーザーがマウス以外の方法でメニュー項目にアクセスした場合です。

于 2012-11-27T10:01:36.857 に答える
1

誰かが役に立つと思った場合に投稿します。

当初意図していたことを正確に実行しようとする代わりに、次のことを思いつきました。

1- を使用します2- ユーザーが項目をContextMenuStrip
クリックすると、以下に示すように、メニュー項目の近くの場所に が表示されます: (配置にはまだ調整が必要であることに注意してください)ToolStripMenuContextMenuStrip

ここに画像の説明を入力

これを機能ContextMenuStripさせるために、実行時にコード内をビルドContextMenuStripして、状況に応じて動的にアイテムをビルドできるようにします。

コード スニペット:

ContextMenuStripメニュー項目がクリックされたときに表示:

private void filterToolStripMenuItem_Click(object sender, EventArgs e)
{
    contextMenuStrip1.Show(this, 180, 20);
}

以下を構築しContextMenuStripます。

    if (protInfo.Name == "QCOM" )
    {
        BroadCast = new CheckBox();
        BroadCast.Text = "Date/Time Broadcast";
        BroadCast.Checked = FlagSet(CurrentFilter, (Byte)Filter.DateTimeBC);
        ToolStripControlHost Ch1 = new ToolStripControlHost(BroadCast);

        GenPoll = new CheckBox();
        GenPoll.Text = "Status Poll";
        GenPoll.Checked = FlagSet(CurrentFilter, (Byte)Filter.GenStatusPoll);
        ToolStripControlHost Ch2 = new ToolStripControlHost(GenPoll);

        GenPollResp = new CheckBox();
        GenPollResp.Text = "Status Poll Response";
        GenPollResp.Checked = FlagSet(CurrentFilter, (Byte)Filter.GenStatusResponse);
        ToolStripControlHost Ch3 = new ToolStripControlHost(GenPollResp);

        Button btnDone = new Button();
        btnDone.Text = "Done";
        ToolStripControlHost Ch4 = new ToolStripControlHost(btnDone);
        btnDone.Click += new EventHandler(btnDone_Click);

        contextMenuStrip1.Items.Clear();
        contextMenuStrip1.Items.Add(Ch1);
        contextMenuStrip1.Items.Add(Ch2);
        contextMenuStrip1.Items.Add(Ch3);
        contextMenuStrip1.Items.Add(Ch4);
        contextMenuStrip1.Enabled = true;
        filterToolStripMenuItem.Enabled = true;
    }
    else
    {
        filterToolStripMenuItem.Enabled = false;
    }

これは最適なユーザー インターフェイス デザインではないかもしれませんが、機能しているようです。

于 2012-11-13T00:31:59.657 に答える
1

ツリービューから複数のリーフ項目を削除できるように、Neolisk と Chimera の回答を組み合わせて使用​​しました。私の解決策は以下です

注: 設計時に作成された次の項目が使用されます。 TreePromotions (TreeView) menuVendorSection (コンテキスト メニュー ストリップ) removeMultipleItemsToolStripMenuItem (menuVendorSection のドロップダウン)

 private void removeMultipleItemsToolStripMenuItem_MouseHover(object sender, EventArgs e)
    {
        removeMultipleItemsToolStripMenuItem.DropDownItems.Clear();  
        ToolStripMenuItem detailMenuItem;
        TreeNode vendorSectionNode = treePromotions.SelectedNode;
        for (int vsn = 0; vsn < vendorSectionNode.Nodes.Count; vsn++)
        {
            //add checkbox item
            detailMenuItem = new ToolStripMenuItem(vendorSectionNode.Nodes[vsn].Text);
            detailMenuItem.Tag = vendorSectionNode.Nodes[vsn].Tag;
            detailMenuItem.CheckOnClick = true;
            removeMultipleItemsToolStripMenuItem.DropDownItems.Add(detailMenuItem);

        }
        //add action buttons
        Button buttonDeleteMultiple = new Button();
        buttonDeleteMultiple.Text = "Remove Checked Items";
        ToolStripControlHost buttonHost = new ToolStripControlHost(buttonDeleteMultiple);
        buttonDeleteMultiple.Click += new EventHandler(buttonDeleteMultiple_Click);
        removeMultipleItemsToolStripMenuItem.DropDownItems.Add(buttonHost);

        Button buttonCancelMultipleDelete = new Button();
        buttonCancelMultipleDelete.Text = "CANCEL";
        buttonHost = new ToolStripControlHost(buttonCancelMultipleDelete);
        buttonCancelMultipleDelete.Click += new EventHandler(buttonCancelMultipleDelete_Click);
        removeMultipleItemsToolStripMenuItem.DropDownItems.Add(buttonHost);



        removeMultipleItemsToolStripMenuItem.DropDown.AutoClose = false;
        menuVendorSection.AutoClose = false;





    }

    private void buttonDeleteMultiple_Click(object sender, EventArgs e)
    {

        //delete items
        for (int dmi = 0; dmi < removeAllItemsToolStripMenuItem.DropDownItems.Count - 2; dmi++) //do not include buttons
        {
            ((Detail)removeAllItemsToolStripMenuItem.DropDownItems[dmi].Tag).Delete(); //deletes item from database
        }
        //rebuild leaf
        treePromotions.SelectedNode.Nodes.Clear();
        addItemNodes(treePromotions.SelectedNode);  //builds leaf nodes from database

        //close menus
        removeMultipleItemsToolStripMenuItem.DropDown.Close();
        menuVendorSection.AutoClose = true;
        menuVendorSection.Close();
    }

    private void buttonCancelMultipleDelete_Click(object sender, EventArgs e)
    {
        //just close menus
        removeMultipleItemsToolStripMenuItem.DropDown.Close();
        menuVendorSection.AutoClose = true;
        menuVendorSection.Close();
    }

そして、これはそれがどのように見えるかです

于 2015-10-17T01:32:31.667 に答える