ko444evnik (ko444evnik) wrote,
ko444evnik
ko444evnik

.NET - программные настройки

Из всего спектра вариантов наиболее удобен оказался подход с использованием класса ApplicationSettingsBase. После того как запилил для этого собственный кодогенератор - работа по созданию и подключению всей массы настроек занимает единицы секунд.

По таким вот, например, входным данным:
k4settings     // имя класса
СтрокаНастройки  // имя параметра
String       // тип параметра
ФлажокНастройки  // имя...
Boolean      // тип...



...создается собственный класс настроек:

sealed class k4Settings : ApplicationSettingsBase {

//[ApplicationScopedSetting()]
 [UserScopedSetting()]
 [DefaultSettingValueAttribute( "строка-по-умолчанию" )]
  public String СтрокаНастройки {
   get { return ( ( String )this[ "СтрокаНастройки" ] ); }
   set { this[ "СтрокаНастройки" ] = value; }
  }

// биндинг к свойству изнутри XAML:
// {Binding Source={StaticResource k4settings}, Path=СтрокаНастройки,Mode=TwoWay}

//[ApplicationScopedSetting()]
 [UserScopedSetting()]
 [DefaultSettingValueAttribute( "True" )]
  public Boolean ФлажокНастройки {
   get { return ( ( Boolean )this[ "ФлажокНастройки" ] ); }
   set { this[ "ФлажокНастройки" ] = value; }
  }

// биндинг к свойству изнутри XAML:
// {Binding Source={StaticResource k4settings}, Path=ФлажокНастройки, Mode=TwoWay}

}


( обычно использую UserScopedSetting.
обращение к ApplicationScopedSetting имеет некоторые нюансы. )


Чтобы использовать в ХАМЛе надобно:

1) создать экземпляр класса в ресурсах окна:
<Window.Resources>
  <local:k4Settings x:Key="k4settings" />
</Window.Resources>


2) подключиться в визуальных элементах ( по нескольким причинам - режим связи в биндингах лучше задавать TwoWay):

<TextBox
 Text="{Binding Source={StaticResource k4settings}, Path=СтрокаНастройки, Mode=TwoWay}"
/>

<CheckBox
  IsChecked="{Binding Source={StaticResource k4settings}, Path=ФлажокНастройки, Mode=TwoWay}">
  Флажок Настройки
</CheckBox>


Теперь, чтобы обращаться к объекту (и параметрам) изнутри C#-кода окна - требуется некоторая инфрастуктура:

  // добавить как переменную окна:
  k4Settings k4settings;

  ...

  // добавить в конструкторе окна - поиск ссылки на хамловый-ресурс:
  k4settings = ( k4Settings )this.TryFindResource( "k4settings" );

  ...

  // добавить в обработчик события Loaded окна подключение событий:
  k4settings.SettingChanging
   += new SettingChangingEventHandler( k4settings_SettingChanging );

  k4settings.SettingsSaving
   += new SettingsSavingEventHandler( k4settings_SettingsSaving );

  ...  

  // добавить в обработчик события Closing окна:
  k4settings.Save();  


  // добавить к окну обработчики: 
  //---------------------------------------------
  void k4settings_SettingChanging( object sender, SettingChangingEventArgs e ) {
   // если требуется какая-либо реакция на изменения значений.
   // доступные параметры:
   // e.SettingClass
   // e.SettingKey
   // e.SettingName
   // e.NewValue
   // e.Cancel
  }
  //---------------------------------------------
  void k4settings_SettingsSaving( object sender, CancelEventArgs e ) {
   // тут можно спрашивать о необходимости сохранения измененных значений
   e.Cancel = false; // по умолчанию - изменения => сохранять.
  }
  //---------------------------------------------


Вот собственно и всё...
Tags: .net, .wpf, программизм
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments