2013-09-18 3 views
4

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

В настоящее время я работаю в VS2012 на приложении .NETv4.5, который также имеет несколько панелей инструментов. Я создал очень маленькое тестовое приложение, которое представляет собой форму с док-станцией toolstripcontainer и 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, но, по-видимому, нет. У кого-нибудь есть работа, чтобы заставить это работать?

EDIT: Добавлено содержание 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 Когда я запустить приложение я вижу:

Initial load

Когда я переупорядочить 3 верхних toolstrips я получаю это:

After reorder

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

After reopen

Теперь я перехожу ToolStrip, который был пристыкован справа к началу:

Reorder again

Я вновь открыть приложение, и я вижу четвёртой ToolStrip все еще находится на вершине, которая в порядке, но порядок не. Посмотрите на двух последних toolstrips:

Reopen again

Еще одна странная вещь, что я не могу перестыковке мой трансфокатора-ToolStrip вправо еще раз.ToolStrip просто исчезает:

enter image description here

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

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

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

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

+0

Трудно представить себе режим сбоя, это работает нормально. Забыли ли вы дать подсказкам имя? Покажите нам содержимое файла user.config. –

+0

В соответствии с запросом я добавил содержимое файла user.config. Я больше всего говорю, что я этого не понимаю;) Теперь я проверю свой код и убедитесь, что у всех панелей и кнопок есть имя. –

+0

Я сделал еще несколько изменений: я добавил ссылку на свое примерное приложение (исходный код) и добавил скриншоты. –

ответ

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