关于ToolStrip设置Location无效的问题

问题现象

当多个ToolStrip使用ToolStripContainer布局时,可以让用户自己拖动工具栏,所以在程序关闭时必须保存用户拖动工具栏的位置,但是在再次打开程序后,还原回来的工具栏位置会有问题,虽然设置的与原来一致,但是起不了效果,每次位置都不确定

问题原因

产生问题的原因是在设置ToolStrip.Location时,没有没有挂起容器的布局,导致位置不确定

解决方法

在设置Location前要添加

            container.SuspendLayout();
            container.TopToolStripPanel.SuspendLayout();
            container.LeftToolStripPanel.SuspendLayout();
            container.RightToolStripPanel.SuspendLayout();
            container.BottomToolStripPanel.SuspendLayout();

完成之后添加

            container.TopToolStripPanel.ResumeLayout();
            container.LeftToolStripPanel.ResumeLayout();
            container.RightToolStripPanel.ResumeLayout();
            container.BottomToolStripPanel.ResumeLayout();
            container.ResumeLayout();

附赠代码

    [Serializable]
    public class ToolStripLayoutCollection
    {
        private List<ToolStripLayout> _Items = new List<ToolStripLayout>();
        public List<ToolStripLayout> Items
        {
            get
            {
                return _Items;
            }
        }
        //
        public ToolStripLayout GetItemByName(string name)
        {
            foreach (ToolStripLayout item in _Items)
            {
                if (item.Name == name)
                {
                    return item;
                }
            }
            return null;
        }
        public void From(ToolStripContainer container)
        {
            _Items.Clear();
            foreach (Control control in container.TopToolStripPanel.Controls)
            {
                if (control is ToolStrip)
                {
                    ToolStripLayout item = new ToolStripLayout();
                    item.Name = control.Name;
                    item.Type = LocationTypes.Top;
                    item.Location = control.Location;
                    _Items.Add(item);
                }
            }
            foreach (Control control in container.LeftToolStripPanel.Controls)
            {
                if (control is ToolStrip)
                {
                    ToolStripLayout item = new ToolStripLayout();
                    item.Name = control.Name;
                    item.Type = LocationTypes.Left;
                    item.Location = control.Location;
                    _Items.Add(item);
                }
            }
            foreach (Control control in container.BottomToolStripPanel.Controls)
            {
                if (control is ToolStrip)
                {
                    ToolStripLayout item = new ToolStripLayout();
                    item.Name = control.Name;
                    item.Type = LocationTypes.Bottom;
                    item.Location = control.Location;
                    _Items.Add(item);
                }
            }
            foreach (Control control in container.RightToolStripPanel.Controls)
            {
                if (control is ToolStrip)
                {
                    ToolStripLayout item = new ToolStripLayout();
                    item.Name = control.Name;
                    item.Type = LocationTypes.Right;
                    item.Location = control.Location;
                    _Items.Add(item);
                }
            }

        }
        public void To(ToolStripContainer container)
        {
            container.SuspendLayout();
            container.TopToolStripPanel.SuspendLayout();
            container.LeftToolStripPanel.SuspendLayout();
            container.RightToolStripPanel.SuspendLayout();
            container.BottomToolStripPanel.SuspendLayout();
            List<ToolStrip> tools = new List<ToolStrip>();
            foreach (Control control in container.TopToolStripPanel.Controls)
            {
                if (control is ToolStrip)
                {
                    tools.Add(control as ToolStrip);
                }
            }
            container.TopToolStripPanel.Controls.Clear();
            //
            foreach (Control control in container.LeftToolStripPanel.Controls)
            {
                if (control is ToolStrip)
                {
                    tools.Add(control as ToolStrip);
                }
            }
            container.LeftToolStripPanel.Controls.Clear();
            foreach (Control control in container.BottomToolStripPanel.Controls)
            {
                if (control is ToolStrip)
                {
                    tools.Add(control as ToolStrip);
                }
            }
            container.BottomToolStripPanel.Controls.Clear();
            foreach (Control control in container.RightToolStripPanel.Controls)
            {
                if (control is ToolStrip)
                {
                    tools.Add(control as ToolStrip);
                }
            }
            container.RightToolStripPanel.Controls.Clear();
            for (int j = 0; j <= _Items.Count - 1; j++)
            {
                ToolStripLayout item = _Items[j];
                for (int i = 0; i < tools.Count; i++)
                {
                    ToolStrip tool = tools[i];
                    if (tool.Name == item.Name)
                    {
                        tool.Location = item.Location;
                        if (item.Type == LocationTypes.Top)
                        {
                            container.TopToolStripPanel.Controls.Add(tool);
                        }
                        else if (item.Type == LocationTypes.Bottom)
                        {
                            container.BottomToolStripPanel.Controls.Add(tool);
                        }
                        else if (item.Type == LocationTypes.Left)
                        {
                            container.LeftToolStripPanel.Controls.Add(tool);
                        }
                        else if (item.Type == LocationTypes.Right)
                        {
                            container.RightToolStripPanel.Controls.Add(tool);
                        }
                        tool.Location = item.Location;
                        tools.RemoveAt(i);
                        break;
                    }
                }
            }
            if (tools.Count > 0)
            {
                container.TopToolStripPanel.Controls.AddRange(tools.ToArray());
            }
            container.TopToolStripPanel.ResumeLayout();
            container.LeftToolStripPanel.ResumeLayout();
            container.RightToolStripPanel.ResumeLayout();
            container.BottomToolStripPanel.ResumeLayout();
            container.ResumeLayout();
        }
    }
    [Serializable]
    public class ToolStripLayout
    {
        private string _Name = null;
        public string Name
        {
            get
            {
                return _Name;
            }
            set
            {
                _Name = value;
            }
        }
        private Point _Location = new Point();
        public Point Location
        {
            get
            {
                return _Location;
            }
            set
            {
                _Location = value;
            }
        }
        private LocationTypes _Type = LocationTypes.Top;
        public LocationTypes Type
        {
            get
            {
                return _Type;
            }
            set
            {
                _Type = value;
            }
        }
        //
        public void From(ToolStripContainer container, ToolStrip toolstrip)
        {
            if (container.TopToolStripPanel.Controls.Contains(toolstrip))
            {
                _Type = LocationTypes.Top;
            }
            else if (container.LeftToolStripPanel.Controls.Contains(toolstrip))
            {
                _Type = LocationTypes.Left;
            }
            else if (container.BottomToolStripPanel.Controls.Contains(toolstrip))
            {
                _Type = LocationTypes.Bottom;
            }
            else if (container.RightToolStripPanel.Controls.Contains(toolstrip))
            {
                _Type = LocationTypes.Right;
            }
            _Location = toolstrip.Location;
        }
        public void To(ToolStripContainer container, ToolStrip toolstrip)
        {
            toolstrip.Location = _Location;
            if (_Type == LocationTypes.Top)
            {
                if (container.LeftToolStripPanel.Controls.Contains(toolstrip))
                {
                    container.LeftToolStripPanel.Controls.Remove(toolstrip);
                }
                else if (container.BottomToolStripPanel.Controls.Contains(toolstrip))
                {
                    container.BottomToolStripPanel.Controls.Remove(toolstrip);
                }
                else if (container.RightToolStripPanel.Controls.Contains(toolstrip))
                {
                    container.RightToolStripPanel.Controls.Remove(toolstrip);
                }
                container.TopToolStripPanel.Controls.Add(toolstrip);
            }
            else if (_Type == LocationTypes.Left)
            {
                if (container.BottomToolStripPanel.Controls.Contains(toolstrip))
                {
                    container.BottomToolStripPanel.Controls.Remove(toolstrip);
                }
                else if (container.RightToolStripPanel.Controls.Contains(toolstrip))
                {
                    container.RightToolStripPanel.Controls.Remove(toolstrip);
                }
                else if (container.TopToolStripPanel.Controls.Contains(toolstrip))
                {
                    container.TopToolStripPanel.Controls.Remove(toolstrip);
                }
                container.LeftToolStripPanel.Controls.Add(toolstrip);
            }
            else if (_Type == LocationTypes.Bottom)
            {
                if (container.LeftToolStripPanel.Controls.Contains(toolstrip))
                {
                    container.LeftToolStripPanel.Controls.Remove(toolstrip);
                }
                else if (container.TopToolStripPanel.Controls.Contains(toolstrip))
                {
                    container.TopToolStripPanel.Controls.Remove(toolstrip);
                }
                else if (container.RightToolStripPanel.Controls.Contains(toolstrip))
                {
                    container.RightToolStripPanel.Controls.Remove(toolstrip);
                }
                container.BottomToolStripPanel.Controls.Add(toolstrip);
            }
            else if (_Type == LocationTypes.Right)
            {
                if (container.LeftToolStripPanel.Controls.Contains(toolstrip))
                {
                    container.LeftToolStripPanel.Controls.Remove(toolstrip);
                }
                else if (container.BottomToolStripPanel.Controls.Contains(toolstrip))
                {
                    container.BottomToolStripPanel.Controls.Remove(toolstrip);
                }
                else if (container.TopToolStripPanel.Controls.Contains(toolstrip))
                {
                    container.TopToolStripPanel.Controls.Remove(toolstrip);
                }
                container.RightToolStripPanel.Controls.Add(toolstrip);
            }
            toolstrip.Location = _Location;
        }
    }
    public enum LocationTypes
    {
        Top = 0,
        Left,
        Bottom,
        Right
    }

ToolStripLayoutCollection.From

保存工具栏布局

ToolStripLayoutCollection.To

还原工具栏布局

### 回答1: 以下是使用C#代码设置工具栏ToolStrip的示例: 1. 创建一个WinForm窗体,将一个ToolStrip控件拖放到窗体上。 2. 在窗体的Load事件中添加以下代码: ``` private void Form1_Load(object sender, EventArgs e) { // 添加工具栏按钮 ToolStripButton btnNew = new ToolStripButton("新建"); btnNew.Image = Properties.Resources.New; btnNew.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText; btnNew.Click += new EventHandler(btnNew_Click); toolStrip1.Items.Add(btnNew); ToolStripButton btnOpen = new ToolStripButton("打开"); btnOpen.Image = Properties.Resources.Open; btnOpen.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText; btnOpen.Click += new EventHandler(btnOpen_Click); toolStrip1.Items.Add(btnOpen); ToolStripButton btnSave = new ToolStripButton("保存"); btnSave.Image = Properties.Resources.Save; btnSave.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText; btnSave.Click += new EventHandler(btnSave_Click); toolStrip1.Items.Add(btnSave); // 添加分隔符 toolStrip1.Items.Add(new ToolStripSeparator()); // 添加下拉框 ToolStripComboBox cmbFontSize = new ToolStripComboBox(); cmbFontSize.Items.AddRange(new object[] { "12", "14", "16", "18", "20" }); cmbFontSize.SelectedIndex = ; cmbFontSize.SelectedIndexChanged += new EventHandler(cmbFontSize_SelectedIndexChanged); toolStrip1.Items.Add(cmbFontSize); } // 工具栏按钮的事件处理方法 private void btnNew_Click(object sender, EventArgs e) { // 新建文件 } private void btnOpen_Click(object sender, EventArgs e) { // 打开文件 } private void btnSave_Click(object sender, EventArgs e) { // 保存文件 } // 下拉框的事件处理方法 private void cmbFontSize_SelectedIndexChanged(object sender, EventArgs e) { // 更改字体大小 } ``` 3. 运行程序,可以看到工具栏上已经添加了三个按钮和一个下拉框。单击按钮或选择下拉框中的选项,可以触发相应的事件处理方法。 ### 回答2: 题目不明确,请您提供更多信息或者指定要回答的题目并且再次提问。谢谢! ### 回答3: C是计算机科学中一种非常重要的编程语言,它由于其简洁明了的语法、高效性以及可移植性,已经成为计算机科学领域中最受欢迎的语言之一。 首先,C语言的语法简洁明了,这让C成为了学习编程的理想语言。C语言有一些基本的语法结构,比如数据类型、变量定义和控制结构等,这些都很容易理解,因此可以快速入门。同时,许多编程语言都从C语言借鉴了语法和风格,因此学会C语言也可以更加方便地学习其他编程语言。 其次,C语言是一种高效的语言。它不像其他编程语言那样需要大量的运行时支持,而是直接映射到了机器语言中,这使得C语言的执行速度非常快。这让C语言在编写操作系统、嵌入式系统和网络应用等需要高性能的应用中表现出色。 最后,C语言是可移植的。由于C语言不依赖于特定的操作系统或硬件平台,因此可以轻松移植到各种系统上。这使得C语言在跨平台应用程序编写领域拥有广泛的应用。 总而言之,C语言是一种非常有用的编程语言,它具有简洁明了的语法、高效性以及可移植性,已经成为计算机科学领域中最受欢迎的语言之一,学会C语言能够帮助我们更好地理解计算机科学原理、编写高效的应用程序以及提高编程技能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值