环境:VS2005 C# WinForm菜单里项目太多时,比如导入IE收藏夹。即使全屏也不够长度。C#菜单的下拉框虽然能显示上下箭头但这种办法难看且操作不便。我看一些软件比如TT、糖果遇到这种情况都是用两列并排的下拉框来显示。请问C#菜单本身是否具有这种功能,如何设置?是不是必需通过自绘的菜单过能实现?

解决方案 »

  1.   

    ListBox是控件,我要的是菜单啊,不明白,请楼上介绍的稍详细些。
      

  2.   

    将下拉控件的布局方式设置为表格就可以了。ToolStripDropDown dd = toolStripMenuItem1.DropDown;dd.LayoutStyle = ToolStripLayoutStyle.Table;TableLayoutSettings tls = (TableLayoutSettings)dd.LayoutSettings;
    tls.ColumnCount = 2;
      

  3.   


    在窗体上拖一个Panel,把控件都放进去,设计的美观点,想多少列都行,将Panel的Visible设置为false
    然后将菜单按钮的点击设置为panel1.Visible=true;即点击按钮时显示Panel,然后将Panel的MouseLeave事件设置为panel1.Visible=false;即当鼠标离开panel控件使自动隐藏该控件
    也可以使用ListView或者ListBox控件代替或者一起使用,使用方法同上,这两个控件怎么用就不用说了吧呵呵
      

  4.   

    或者使用WPF,更强大原文地址:
    http://www.codeproject.com/KB/WPF/ribboncontrol.aspxWPF菜单详解:
    http://www.codeproject.com/Articles/55599/Windows-Ribbon-for-WinForms-Part-0-Table-of-Conten.aspx
      

  5.   

    非常感谢各位的回复!一风的办法更为简单直接。yalan的办法可用来解决一些更为复杂的应用。还想请教下一风:设了双列显示后,我的菜单项被轮流显示在两列里。而我希望是先在一列中放,放满了后再放到另一列。因为收藏夹中有文件夹和文件,还有我的控制菜单项。我不希望它们被交替显示在两列中。请问如何做?
      

  6.   

    我在回帖的时候也想到过这个问题,不过这个问题的确不是太好回答。
    如果要控件本身来实现一列列的放,至少我目前不知道有没有这样的方法,不过我想这里可以变通一下,在数据源上下功夫,看例子。
    比如有这样的数据源:
    A1, A2, A3, B1, B2, B3
    如果直接加载到控件里就是这样的形式:
    A1 A2
    A3 B1
    B2 B3
    这可能并不是我们想要的结果,但假如把数据源的排列改变一下:
    A1, B1, A2, B2, A3, B3
    那生成的菜单就是我们想要的了:
    A1 B1
    A2 B2
    A3 B3
    但到此为止,问题并没有完全解决,每一列菜单的行数是否要控制呢?怎么控制呢?呵呵,因为没有从事这样开发的经验,我暂时没有解决办法,期待达人。
      

  7.   

    感谢一风哥再次回贴,我正是用调整数据源排列次序的方法来变通的:
                ToolStripDropDown dd = this.M_Favorites.DropDown;
                dd.LayoutStyle = ToolStripLayoutStyle.Table;
                TableLayoutSettings tls = (TableLayoutSettings)dd.LayoutSettings;
                tls.RowCount = 20;
                tls.GrowStyle = TableLayoutPanelGrowStyle.AddColumns;            ToolStripDropDown newdown = new ToolStripDropDown();
                ArrayList down = new ArrayList();             int n = M_Favorites.DropDownItems.Count / 2;
               int m = 1;            //Table布局方式下是一行行显示菜单项,我需要它一列列来显示,找不到改变C#显示方式的办法
                //只好改变我菜单项的顺序了
                for (int i = 0; i < this.M_Favorites.DropDownItems.Count;++i )
                {
                    if (i == 0)
                    { down.Add(this.M_Favorites.DropDownItems[i]); }
                    else
                    {
                        if (IsOdd(i) && n < this.M_Favorites.DropDownItems.Count)
                        { 
                            down.Add(this.M_Favorites.DropDownItems[n]);
                            n ++;
                        }
                        else if( m < this.M_Favorites.DropDownItems.Count)
                        {                         
                            down.Add(this.M_Favorites.DropDownItems[m]);
                            m ++;
                        }
                    }
                }            for (int i = 0; i < down.Count;++i )
                {
                    newdown.Items.Add((ToolStripItem)down[i]);
                }            this.M_Favorites.DropDown = newdown;            //------------------------------------------        /// <summary>
            /// 判断一个数是否是奇数
            /// </summary>
            /// <param name="n"></param>
            /// <returns></returns>
            public static bool IsOdd(int n)
            {
                if (n % 2 != 0)
                {
                    return true;
                }
                else
                {
                    return false;
                } 
            }