2013-07-10 4 views
2

У меня есть графический интерфейс WPF, который позволяет пользователю открывать меню опций. Меню параметров открывается в новом окне и заполняется флажками. Когда пользователь нажимает кнопку «ok», окно закрывается. Тем не менее, он не помнит, какие флажки были проверены, когда он открывается. Как я могу убедиться, что программа может помнить, какие флажки были отмечены, а какие нет?Сохранение состояния дочерних окон в WPF C#

Просто для указания: мне нужно только помнить, какие поля проверяются во время запуска программы. Программу не нужно запоминать после завершения всей программы.

Спасибо!

Вот мой код под главным окном Window1.XAML.CS:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace CartToolsPrototype1 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
     } 

     //Exit 
     private void Exit_Click(object sender, RoutedEventArgs e) 
     { 
      System.Environment.Exit(0); 
     } 

     //Options 
     private void Options_Click(object sender, RoutedEventArgs e) 
     { 
      var newWindow = new Options(); 
      newWindow.Show(); 
     } 
    } 
} 

Вот мой код под Options.XAML.CS дочернего окна. Это основано на первом ответе. Я прочитал link, который вы опубликовали, и это имеет смысл. У меня есть условия в моем файле настроек, которые я изменяю, когда пользователь проверяет мои флажки. Я тогда условие, определяющее, проверяется ли окно на основе файла параметров, но это, кажется, не отражает каких-либо изменений ...

public partial class Options_Window : Window 
    { 
     public Options_Window() 
     { 
      InitializeComponent(); 

      //Checkbox1 
      if (Properties.Settings.Default.OptionsBox1 == true) 
       checkBox1.IsChecked = true; 
      else 
       checkBox1.IsChecked = false; 
     } 

     //Close Window 
     private void button1_Click(object sender, RoutedEventArgs e) 
     { 
      this.Close(); 
     } 

     //Ask before downloading... - CHECKED 
     private void checkBox1_Checked(object sender, RoutedEventArgs e) 
     { 
      Properties.Settings.Default.OptionsBox1 = true; 
     } 

     //Ask before downloading... - UNCHECKED 
     private void checkBox1_Unchecked(object sender, RoutedEventArgs e) 
     { 
      Properties.Settings.Default.OptionsBox1 = false; 
     } 
+0

Рассматривали ли вы привязку флажков к свойствам bool в ViewModel? Если вы имеете в виду закрытие главного окна, вам нужно будет каким-то образом сохранить эти состояния; возможно, файл xml. – Killingsworth

+1

Чтобы быть понятным, пытаетесь ли вы сохранить это постоянное даже после перезапуска всей вашей программы? Если это так, я бы сохранил его в файле XML в папке APPDATA. – Alex

+0

Только во время запуска программы. Если пользователь снова откроет окно параметров, я бы хотел, чтобы эти же флажки были отмечены. –

ответ

6

Вы можете использовать Settings для обмена данными между различными Windows/Controls и даже сохранять данные приложения при закрытии/запуске приложения.

.NET Framework позволяет создавать и получать доступ к значениям , которые сохраняются между сеансами выполнения приложений. Этими значениями являются , называемые настройками. Настройки могут представлять пользовательские настройки или ценную информацию , которую приложение должно использовать. Например, вы можете создать ряд настроек, которые сохраняют пользовательские настройки для схемы приложения . Или вы можете сохранить строку подключения , которая указывает базу данных, используемую вашим приложением. Настройки позволяют использовать , чтобы вы сохраняли информацию, критическую для приложения вне кода, и для создания профилей, которые сохраняют предпочтения отдельных пользователей.

Вы можете сохранить Настройки в любом окне:

Properties.Settings.Default.mySetting = true; 
Properties.Settings.Default.Save(); 

Вы можете прочитать/использовать установку в любом окне:

this.Property = Properties.Settings.Default.mySetting; 
+0

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

+0

Не забудьте 'Properties.Settings.Default.Save();' – dsfgsho

+0

Где именно это нужно? Я делал это прямо перед 'this.close();' –

0

Если это только во время выполнения, то это довольно легко , Вы можете использовать статический класс:

public static class MyState 
{ 
    public static bool IsChecked1 { get; set; } 
} 

Или одноэлементный экземпляр класса:

public class MyState 
{ 
    private static MyState _instance = new MyState(); 

    public static MyState Instance 
    { 
     get { return _instance; } 
    } 

    private MyState() {} 

    public bool IsChecked1 { get; set; } 

}

Когда окно нагрузки, получить состояние от свойств MyClass. Когда окно закрывается, задайте свойства MyClass.

В Options.xaml.cs:

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    CheckBox1.IsChecked = MyState.IsChecked1; 
} 

private void Window_Closed(object sender, EventArgs e) 
{ 
    MyState.IsChecked1 = CheckBox1.IsChecked; 
} 
+0

Как я могу убедиться, что код посвящен мое окно Options.xaml? На самом деле не похоже, что в этом коде есть что-то, что вызовет окно. –

+0

Это наоборот: окно Options.xaml ссылается на значения в MyState, когда оно загружается и закрывается. – RQDQ

+0

Хорошо, я внедрил код в свое окно Options.xaml.cs и попытался убедиться, что у меня есть все мои флажки. Однако компилятор говорит, что «Получить или установить аксессуар ожидается». Нужно ли добавлять что-то до получения и установки? Спасибо, я написал свой код. –

1

Сначала нам нужен объект настроек, который хранит наши свойства. Не забудьте правильно реализовать INotifyPropertyChanged

class MySettings : INotifyPropertyChanged 
{ 
    public bool IsSettingSet {get;set;} 
} 

то в нашем окне настроек, просто использовать привязки, чтобы связать управление представлением объекта настройки.

<Window 
    x:Class="SettingsWindow" 
    ...> 
    <CheckBox IsChecked="{Binding IsSettingSet}"/> 
</Window> 

и, наконец, где вы на самом деле открыть окно, необходимо назначить параметры объекта к DataContext в окне настроек.

class MainWindow 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 
    void OpenSettingsWindow() 
    { 
     var dlg = new SettingsWindow(); 
     dlg.DataContext = mGlobalSettings; 
     dlg.ShowDialog(); 
    } 

    MySettings mGlobalSettings = new MySettings(); 
} 

теперь каждый раз, когда вы открываете окно, ваши настройки будут такими же, как в прошлый раз. Пока вы не закрываете приложение.

+0

Я реализовал код, единственная ошибка сборки, которую я получаю, связана с окном окна настроек .XAML. В нем указано, что 'Checked =" {Binding IsSettingSet} "недействительно. '{Binding IsSettingSet} "не является допустимым именем метода обработчика событий. Действительны только методы экземпляра в сгенерированном или кодовом классе.' –

+0

'Checked' - это событие. Связывание должно выполняться с использованием свойства IsChecked Я редактировал пример кода @ dowhilefor, чтобы быть немного более полным. – Steve

+0

На мой взгляд, это лучший ответ на вопрос и должен быть принят. – Steve

Смежные вопросы