在哪里放置MenuStrip及其项目?

时间:2015-02-08 13:19:53

标签: c# winforms

我习惯于对Windows.Forms的控件组件进行硬编码;例如MenuStrip。但是我不确定这些定义的正确位置:将它放在方法中是否安全,或者它是否必须位于类定义的顶层?我已经尝试了两个,并按预期编译和运行。但是第一个选择(在一个方法中定义)使得菜单项在方法中是局部的 - 虽然我在该方法中添加了控件 - 我害怕内存问题。

请参阅以下代码:

namespace test
{
    class FormTest : Form
    {
        // if placed in the top level of the class —as below— it works fine.
        // MenuStrip menuMain = new MenuStrip();
        // ToolStripMenuItem exit = new ToolStripMenuItem();

        public FormTest()
        {
            this.FormTest_MenuStrip_Setup();
        }

        private void FormTest_MenuStrip_Setup()
        {
            // if placed in a method —like below— it works fine either.
            MenuStrip menuMain = new MenuStrip();
            ToolStripMenuItem exit = new ToolStripMenuItem();

            exit.Text = "Exit";
            exit.Click += FormMain_Exit_Click;
            menuMain.Items.Add(exit);
            this.Controls.Add(menuMain);
        }
    }
}

1 个答案:

答案 0 :(得分:3)

通常开发人员使用WinForms设计器执行该操作,该设计器将所有菜单项(以及您放置在Form上的任何其他控件)的声明作为FormTest.designer.cs中的类级成员(或者您的表单的任何名称) has)并用InitializeComponent()方法初始化它们。你必须确保你的构造函数在做任何其他事情之前调用InitializeComponent()

这种特殊安排不是必需的,如果您不想使用设计器,您可以定义自己的方法来创建菜单或其他控件。只需确保在构造函数中调用此方法。另请注意,在方法中声明这些控件/ menuitems不是问题,因为一旦调用this.Controls.Add(YourControl),就已经保存了对该对象的引用,因此即使对象超出范围,GC也不会擦除此对象方法结束。

我宁愿建议不要重新发明这个轮子。除非您有充分的理由手动编写表单的布局,否则设计师在这方面做得特别好。