如何以编程方式将上下文菜单条添加到 c# 中的 win 窗体上的所有控件

How can I programmatically add a Context Menu Strip to all controls on a win Form in c#

我有一个上下文菜单条 (contextColorOptions),它允许更改访问上下文菜单条的任何源控件的背景颜色和前景色。

    private void backgroundColorToolStripMenuItem_Click(object sender, EventArgs e)
    {
        if (colorDialog1.ShowDialog() == DialogResult.OK)
        {
            contextColorOptions.SourceControl.BackColor = colorDialog1.Color;
        }
    }

    private void textColorToolStripMenuItem_Click(object sender, EventArgs e)
    {
        if (colorDialog1.ShowDialog() == DialogResult.OK)
        {
            contextColorOptions.SourceControl.ForeColor = colorDialog1.Color;
        }
    }

    private void resetColorsToolStripMenuItem_Click(object sender, EventArgs e)
    {
        contextColorOptions.SourceControl.BackColor = DefaultBackColor;
        contextColorOptions.SourceControl.ForeColor = DefaultForeColor;
    }

我希望能够为表单中的每个控件分配相同的上下文菜单条。

我试过这个:

        foreach (Control cntrl in this.Controls)
        {
            cntrl.ContextMenuStrip = contextColorOptions;
        }

但这似乎没有用。有人有什么想法吗? 提前致谢!

注意不是所有的控件都有相同的属性,可以用相同的方式调用。您必须先检查该控件是否有一个名为 backcolor、forecolor 或 contextmenustrip 的 属性 名称。关键是查询控件的类型,改变背景和面板的颜色,并设置所有里面的透明颜色。

还有其他简单的方法,但这个有效:

foreach (Control cntrl in this.Controls)
        {
            if (cntrl.getType() == "System.Windows.Forms.Form")
                  cntrl.ContextMenuStrip = contextColorOptions;
        }

希望对您有所帮助!!如果你想获取控件的属性来检查控件是否有你想要的属性,你必须使用这样的东西:

var controlType = control.GetType();
        var property = controlType.GetProperty("The property you are looking for", BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

if 属性 != null 你明白了:)