2013-11-15 6 views
2

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

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

Тогда я понял, что мне нужно привязать переменные относительно шаблона моего класса HandledWindow, который будет включать в себя все изменяемые настройки как общедоступные статические свойства &. Но потом я столкнулся с проблемой статической привязки свойств, поскольку я не могу поднять событие PropertyChanged, которое работает только для экземпляра. И окно не будет обновлять его стиль самостоятельно.

Кроме того, я стараюсь, чтобы стиль реагировал и обновлялся сразу на лету без перезапуска.

+1

Опубликуйте соответствующий код и XAML. BTW WPF имеет [встроенную поддержку тем] (http://stackoverflow.com/a/11139598/643085), которая совершенно отсутствует в winforms динозавров, поэтому вы были вынуждены разного рода ужасные хаки в winforms, тогда как в WPF все красиво и счастливо. –

+0

Трюк темы выполняется путем замены ресурсов текущего экземпляра «HandledWindow», я тоже думал об этом. Но мне нужно что-то, что изменит тему для других окон в тот же момент, как привязка данных, даже не загружая любые страницы XAML только с помощью кода C#, установка нового значения для свойства и визуальный интерфейс должны быть обновлены в тот же момент. Я отправлю свой код за несколько минут. Обратите внимание, что эти статические общедоступные свойства также должны редактироваться с помощью интерфейса. Это означает, что для его установки из пользовательского интерфейса должна быть другая привязка данных. – Lispwave

+1

Нет. Если вы хотите, чтобы темы, связанные с приложением, загружали ваши ресурсные словари в 'System.Windows.Application.Current.Resources'. –

ответ

1

WPF является «ресурсо-ориентированным». Вы определяете все свои стили пользовательского интерфейса, кисти и шаблоны в своих ресурсах, а во время выполнения очень легко включить изменение темы приложения, которое будет охватывать все указанные вами свойства. Вот как я это делаю в моем MainViewModel после того, как он получает сообщение от моего окна настройки через его SettingsViewModel:

private void ApplyTheme() 
{   
    Application.Current.Resources.MergedDictionaries.Clear(); 

    var rd = new ResourceDictionary { { "Locator", locator } }; 
    Application.Current.Resources.MergedDictionaries.Add(rd); 

    switch (theme) 
    { 
     case "Blue": 
      Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("/Telerik.Windows.Themes.Office_Blue;component/Themes/System.Windows.xaml", UriKind.RelativeOrAbsolute) }); 
      Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("/Telerik.Windows.Themes.Office_Blue;component/Themes/Telerik.Windows.Controls.GridView.xaml", UriKind.RelativeOrAbsolute) }); 
      Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("/Telerik.Windows.Themes.Office_Blue;component/Themes/Telerik.Windows.Controls.Input.xaml", UriKind.RelativeOrAbsolute) }); 
      Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("/Telerik.Windows.Themes.Office_Blue;component/Themes/Telerik.Windows.Controls.Navigation.xaml", UriKind.RelativeOrAbsolute) }); 
      Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("/Telerik.Windows.Themes.Office_Blue;component/Themes/Telerik.Windows.Controls.xaml", UriKind.RelativeOrAbsolute) }); 
      break; 
     case "Summer": 
      Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("/Telerik.Windows.Themes.Summer;component/Themes/System.Windows.xaml", UriKind.RelativeOrAbsolute) }); 
      Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("/Telerik.Windows.Themes.Summer;component/Themes/Telerik.Windows.Controls.GridView.xaml", UriKind.RelativeOrAbsolute) }); 
      Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("/Telerik.Windows.Themes.Summer;component/Themes/Telerik.Windows.Controls.Input.xaml", UriKind.RelativeOrAbsolute) }); 
      Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("/Telerik.Windows.Themes.Summer;component/Themes/Telerik.Windows.Controls.Navigation.xaml", UriKind.RelativeOrAbsolute) }); 
      Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("/Telerik.Windows.Themes.Summer;component/Themes/Telerik.Windows.Controls.xaml", UriKind.RelativeOrAbsolute) }); 
      break; 
     } 
     Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("Resources/Brushes.xaml", UriKind.RelativeOrAbsolute) }); 
     Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("Resources/ControlTemplates.xaml", UriKind.RelativeOrAbsolute) }); 
     Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("Resources/DataTemplates.xaml", UriKind.RelativeOrAbsolute) }); 
     Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("Resources/Styles.xaml", UriKind.RelativeOrAbsolute) }); 
    } 

Очевидно, я использую Telerik элементов управления, поэтому я загрузить свои словари, но в нижней части методы вы будете обратите внимание, что я загружаю свои собственные ресурсы, такие как кисти, стили и т. д.

В заключение, изменение темы приложения в WPF не может быть проще.

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