Сохранение пользовательского местоположения панели инструментов, которая все еще не работает в VS2012

Я много лет боролся с несколькими всплывающими полосками в контейнере toolstripcontainer. У меня есть текущее приложение .NETv3.5, написанное на VS2008, где расположение полосок инструментов случайное. Чтобы исправить это, было сделано много специального кода, но безуспешно.

В настоящее время я работаю в 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);
    }
 }

И все же в VS2102 с .NETv4.5 это не работает. Я могу переупорядочить то, что хочу, после перезапуска приложения, все всплывающие подсказки будут восстановлены в соответствии с временными точками разработки.

Я надеялся, что это будет исправлено в 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 Я создал небольшое приложение VS2012, написанное на C #, чтобы проиллюстрировать мою проблему. Вы можете скачать его здесь: https://mapwindow5.svn.codeplex.com/svn/tmp/ToolstripDemo/ToolstripDemo.zip Когда я запускаю приложение, я вижу:

Начальная загрузка

Когда я переупорядочиваю 3 верхних панели инструментов, я получаю следующее:

После повторного заказа

Теперь я закрываю приложение и снова открываю его, я получаю начальные местоположения:

После повторного открытия

Теперь я перемещаю панель инструментов, которая была закреплена справа, вверх:

Изменить порядок снова

Я снова открываю приложение и вижу, что 4-я панель инструментов все еще находится наверху, и это нормально, но порядок - нет. Посмотрите на две последние панели инструментов:

Открыть снова

Еще одна странность заключается в том, что я не могу снова повернуть полосу масштабирования вправо. Панель инструментов просто исчезнет:

введите описание изображения здесь

Когда я открываю свою форму в VS2012, панели инструментов также меняются местами: Design time

Не знаю почему. Я просто снова открываю форму.

Я провел тестирование и сделал снимки экрана, запустив exe из проводника, а не в режиме отладки VS.

Надеюсь, теперь стало более понятно, что я имею в виду и что мне нужно. Любой совет очень ценится.


person Paul Meems    schedule 18.09.2013    source источник
comment
Трудно представить себе режим отказа, это прекрасно работает. Вы забыли дать панели инструментов имя? Покажите нам содержимое файла user.config.   -  person Hans Passant    schedule 18.09.2013
comment
По запросу я добавил содержимое файла user.config. Чаще всего я говорю, что не совсем понимаю;) Теперь я проверю свой код и удостоверись, что у всех панелей инструментов и кнопок есть имена.   -  person Paul Meems    schedule 20.09.2013
comment
Я внес еще несколько правок: добавил ссылку на свой образец приложения (исходный код) и добавил скриншоты.   -  person Paul Meems    schedule 20.09.2013


Ответы (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
person Jasiek    schedule 22.03.2014