不同右键单击窗口项目的相同工具条下拉项目WindowsForm C#

问题描述 投票:0回答:1

我在下拉列表中有 2 个右键单击窗口项目,它们具有相同的名称/功能项目。我怎样才能做到这一点? Win 表单似乎不允许我在不同的右键单击窗口项目中拥有完全相同的项目。 代码:

.
.
RightClickWindow.Items.AddRange(new ToolStripItem[] { InsertAbove, InsertBelow });
.
.
InsertAbove.DropDownItems.AddRange(new ToolStripItem[] { AddName, AddSSN, AddHeight, AddWeight });
.
.
InsertBelow.DropDownItems.AddRange(new ToolStripItem[] { AddName, AddSSN, AddJob, AddHobby });
.
.

结果:AddName 和 AddSSN 只显示在 InsertBelow 中,不显示在 InsertAbove 中。如果我在 InsertBelow 中删除它们,它们只会显示在 InsertAbove 中。

我尝试复制并粘贴,然后更改项目的名称(AddNameAbove、AddNameBelow、AddSSNAbove、AddSSNBelow,...),但它在我的 Designer.cs 中看起来一团糟,因为我有许多相同的项目需要位于不同的右侧单击窗口项目。

c# winforms drop-down-menu right-click toolstrip
1个回答
0
投票

这可能比听起来更棘手。最简单的部分是制作

ToolStripItem
:

的单例集合
ToolStripItem[] CommonItems
{
    get
    {
        if (_commonItemsSingleton is null)
        {
            var clickableItem = new ToolStripMenuItem
            {
                Text = "Simple click"
            };
            clickableItem.Click += SimpleClick_Clicked;

            var comboBoxItem = new ToolStripComboBox
            {
                DropDownStyle = ComboBoxStyle.DropDownList,
            };

            comboBoxItem.Items.AddRange(new[]
            {
                "Select",
                "Item A",
                "Item B",
                "Item C",
            });

            comboBoxItem.SelectedIndex = 0;
            comboBoxItem.SelectedIndexChanged += ComboBox_SelectedIndexChanged;
            comboBoxItem.SelectedIndexChanged += async (sender, e) =>{ await Task.Delay(10); ContextMenuStrip?.Close(); }; 
            _commonItemsSingleton = new ToolStripItem[]
            {
                clickableItem,
                new ToolStripSeparator(),
                comboBoxItem,
            };
        }
        return _commonItemsSingleton;
    }
}
ToolStripItem[]? _commonItemsSingleton = default;

但正如您所观察到的:

Win 表单似乎不允许我在不同的右键单击窗口项目中拥有完全相同的项目。

由于每个项目一次只能有 一个

Parent
,因此您不能同时 AddRange
InsertAbove
 
InsertBelow
。当 
InsertAbove
 
InsertBelow
 动态引发 
DropDownOpening
 事件时,您必须通过按需加载它们来对系统进行一点游戏。

public MainForm() { InitializeComponent(); ContextMenuStrip = RightClickWindow; var InsertAbove = new ToolStripMenuItem { Text = "InsertAbove", AutoSize = true }; var InsertBelow = new ToolStripMenuItem { Text = "InsertBelow", AutoSize = true }; foreach (var tsmi in new[] { InsertAbove, InsertBelow }) { tsmi.DropDownItems.Add(new ToolStripMenuItem()); // Placeholder ensures ► visible tsmi.DropDownOpening += (sender, e) => { tsmi.DropDownItems.Clear(); tsmi.DropDownItems.AddRange(CommonItems); }; tsmi.DropDownClosed += (sender, e) => { tsmi.DropDownItems.Clear(); tsmi.DropDownItems.Add(new ToolStripMenuItem()); // Again, Placeholder ensures ► visible }; RightClickWindow.Items.Add(tsmi); } }

showing identical item collections

© www.soinside.com 2019 - 2024. All rights reserved.