6

多年来,我一直在为工具条容器中的多个工具条苦苦挣扎。我有一个用 VS2008 编写的当前 .NETv3.5 应用程序,其中工具条的位置是随机的。已经制作了很多自定义代码来解决这个问题,但没有任何运气。

目前,我正在 VS2012 上开发一个 .NETv4.5 应用程序,该应用程序也有多个工具条。我创建了一个非常小的测试应用程序,它是一个带有停靠工具条容器和 4 个工具条的表单。在设计时,我在底部添加了 3 个工具条,在右侧添加了 1 个。

在不添加任何代码并启动此应用程序的情况下,我的工具条位于与设计时相同的位置。现在我重新排序 3 个顶部工具条并重新启动应用程序。我的重新排序更改未保存,工具条再次与设计时一样。

现在我添加这些代码行:

  public partial class Toolstrips : Form
  {
    private string keyName;

    public Toolstrips()
    {
      this.InitializeComponent();
      this.keyName = Application.ProductName + this.Name + "xyz";
      ToolStripManager.LoadSettings(this, this.keyName);
    }

    private void Toolstrips_FormClosing(object sender, FormClosingEventArgs e)
    {
      ToolStripManager.SaveSettings(this, this.keyName);
    }
 }

并且仍然在带有 .NETv4.5 的 VS2102 中,这不起作用。我可以在重新启动应用程序后重新排序我想要的所有工具条都恢复到设计时位置。

我曾希望这将在 VS2012 中修复,但显然不是。有没有人可以解决这个问题?

编辑:添加内容 user.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="System.Windows.Forms.ToolStripSettings.GUI-prototypeToolstripsxyz.toolStripTable" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
            <section name="System.Windows.Forms.ToolStripSettings.GUI-prototypeToolstripsxyz.toolStripPan" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
            <section name="System.Windows.Forms.ToolStripSettings.GUI-prototypeToolstripsxyz.toolStripStandard" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
            <section name="System.Windows.Forms.ToolStripSettings.GUI-prototypeToolstripsxyz.toolStripZoom" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <userSettings>
        <System.Windows.Forms.ToolStripSettings.GUI-prototypeToolstripsxyz.toolStripTable>
            <setting name="ItemOrder" serializeAs="String">
                <value>toolStripButton4</value>
            </setting>
            <setting name="IsDefault" serializeAs="String">
                <value>False</value>
            </setting>
            <setting name="Size" serializeAs="String">
                <value>29, 42</value>
            </setting>
            <setting name="ToolStripPanelName" serializeAs="String">
                <value>toolStripContainer1.Right</value>
            </setting>
            <setting name="Visible" serializeAs="String">
                <value>True</value>
            </setting>
            <setting name="Location" serializeAs="String">
                <value>0, 336</value>
            </setting>
            <setting name="Name" serializeAs="String">
                <value>toolStripTable</value>
            </setting>
        </System.Windows.Forms.ToolStripSettings.GUI-prototypeToolstripsxyz.toolStripTable>
        <System.Windows.Forms.ToolStripSettings.GUI-prototypeToolstripsxyz.toolStripPan>
            <setting name="ItemOrder" serializeAs="String">
                <value>toolStripButton3</value>
            </setting>
            <setting name="IsDefault" serializeAs="String">
                <value>False</value>
            </setting>
            <setting name="Size" serializeAs="String">
                <value>40, 31</value>
            </setting>
            <setting name="ToolStripPanelName" serializeAs="String">
                <value>toolStripContainer2.Top</value>
            </setting>
            <setting name="Visible" serializeAs="String">
                <value>False</value>
            </setting>
            <setting name="Location" serializeAs="String">
                <value>288, 0</value>
            </setting>
            <setting name="Name" serializeAs="String">
                <value>toolStripPan</value>
            </setting>
        </System.Windows.Forms.ToolStripSettings.GUI-prototypeToolstripsxyz.toolStripPan>
        <System.Windows.Forms.ToolStripSettings.GUI-prototypeToolstripsxyz.toolStripStandard>
            <setting name="ItemOrder" serializeAs="String">
                <value>newToolStripButton,openToolStripButton,saveToolStripButton,printToolStripButton,toolStripSeparator,cutToolStripButton,copyToolStripButton,pasteToolStripButton,toolStripSeparator1,helpToolStripButton</value>
            </setting>
            <setting name="IsDefault" serializeAs="String">
                <value>False</value>
            </setting>
            <setting name="Size" serializeAs="String">
                <value>248, 31</value>
            </setting>
            <setting name="ToolStripPanelName" serializeAs="String">
                <value>toolStripContainer2.Top</value>
            </setting>
            <setting name="Visible" serializeAs="String">
                <value>False</value>
            </setting>
            <setting name="Location" serializeAs="String">
                <value>6, 0</value>
            </setting>
            <setting name="Name" serializeAs="String">
                <value>toolStripStandard</value>
            </setting>
        </System.Windows.Forms.ToolStripSettings.GUI-prototypeToolstripsxyz.toolStripStandard>
        <System.Windows.Forms.ToolStripSettings.GUI-prototypeToolstripsxyz.toolStripZoom>
            <setting name="ItemOrder" serializeAs="String">
                <value>toolStripButton1,toolStripButton2</value>
            </setting>
            <setting name="IsDefault" serializeAs="String">
                <value>False</value>
            </setting>
            <setting name="Size" serializeAs="String">
                <value>29, 73</value>
            </setting>
            <setting name="ToolStripPanelName" serializeAs="String">
                <value>toolStripContainer2.Right</value>
            </setting>
            <setting name="Visible" serializeAs="String">
                <value>False</value>
            </setting>
            <setting name="Location" serializeAs="String">
                <value>0, 71</value>
            </setting>
            <setting name="Name" serializeAs="String">
                <value>toolStripZoom</value>
            </setting>
        </System.Windows.Forms.ToolStripSettings.GUI-prototypeToolstripsxyz.toolStripZoom>
    </userSettings>
</configuration>

EDIT2 我创建了一个用 C# 编写的小型 VS2012 应用程序来说明我的问题。您可以在此处下载:https ://mapwindow5.svn.codeplex.com/svn/tmp/ToolstripDemo/ToolstripDemo.zip 当我启动应用程序时,我看到:

初始负载

当我重新排序 3 个顶级工具条时,我得到了这个:

重新排序后

现在我关闭应用程序并再次打开它,我得到了初始位置:

重新打开后

现在我将停靠在右侧的工具条移动到顶部:

重新排序

我重新打开应用程序,我看到第四个工具条仍然在顶部,这没关系,但顺序不是。查看最后两个工具条:

重新打开

另一个奇怪的事情是,我无法再次将缩放工具条重新停靠到右侧。工具条就消失了:

在此处输入图像描述

当我在 VS2012 中打开表单时,工具条也会重新排列: 设计时间

我不确定为什么。我只是重新打开表格。

我通过在资源管理器中运行 exe 进行了测试并制作了屏幕截图,而不是在 VS 的调试模式下。

我希望现在更清楚我的意思和我需要什么。非常感谢任何建议。

4

1 回答 1

1

我使用vb.net 2010,所以我使用vb的语法,但我希望我的回答有帮助:

1) 使用 ToolStripManager,您可以保存和加载设置,而无需单独指定所有工具栏的键。指定表单就足够了 - 将使用表单名称作为键为表单保存设置。

2) 调用 ToolStripManager.SaveSettings() 和 ToolStripManager.LoadSettings() 很重要,而不是在运行时在 FormLoad 和 FormClosing 事件运行子例程中以编程方式更改工具栏布局。所以最安全的方法就是调用 FormClosing 和 FormLoad subs 中的方法,如下所示:

Private Sub Explorer1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    ToolStripManager.LoadSettings(Me)'Me is the form, for which we save the toolbars settings

    'further code in this subroutine

End Sub

Private Sub Explorer1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    ToolStripManager.SaveSettings(Me)
    My.Settings.Save()

    'further code in this subroutine
End Sub
于 2014-03-22T09:20:04.920 回答