保存工具条的用户位置仍然无法在VS2012中运行

Pau*_*ems 6 c# toolstrip visual-studio-2012

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

目前我在VS2012上使用.NETv4.5应用程序,该应用程序也有多个工具条.我创建了一个非常小的测试应用程序,它是一个带有docked tooltripcontainer和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);
    }
 }
Run Code Online (Sandbox Code Playgroud)

而且在使用.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>
Run Code Online (Sandbox Code Playgroud)

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

初始加载

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

重新订购后

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

重新开放后

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

再次重新排序

我重新打开应用程序,我看到第4个工具条仍然在顶部,这是可以的,但顺序不是.看看最后两个工具条:

再次重新开放

另一个奇怪的事情是我无法再次向右移动我的zoom-toolstrip.工具条刚刚消失:

在此输入图像描述

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

我不知道为什么.我只是重新打开表格.

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

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

小智 1

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

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

2) 调用 ToolStripManager.SaveSettings() 和 ToolStripManager.LoadSettings() 非常重要,不要在 FormLoad 和 FormClosing 事件运行子例程中在运行时以编程方式更改工具栏布局的其他内容前置。因此,最安全的方法是首先调用 FormClosing 和 FormLoad 子函数中的方法,如下所示:

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
Run Code Online (Sandbox Code Playgroud)