2013-08-22 5 views
0

У меня есть программа с несколькими кнопками, одна из которых используется для переключения «Темы». Есть две темы: одна - обычная тема Windows, а другая - Style2.WPF: Стили окна переключения

Это, как я попытался переключающий

private bool UsingWindowsStyle = true; 
    private ResourceDictionary Style2= new ResourceDictionary() { Source = new Uri("/...;component/Resources/DefaultStyles.xaml", UriKind.RelativeOrAbsolute) }; 

    private void SwitchButton_Click(object sender, RoutedEventArgs e) 
    { 
     if (UsingWindowsStyle) 
     { 
      Resources.MergedDictionaries.Add(Style2); 
      UsingWindowsStyle = false; 
     } 
     else 
     { 
      Resources.MergedDictionaries.Remove(Style2); 
      UsingWindowsStyle = true; 
     } 
    } 

Моя проблема, когда я использую эту программу, и нажмите на эту Button, это то, что происходит:

Окно Открытый Программа работает нормально с Тема Windows.

SwitchButton First Click Программа меняет визуальные эффекты на тему Style2. Все кнопки программы работают нормально.

SwitchButton Second Click Программа возвращается к теме Windows, но все кнопки в программе захватывают работу.

Очки для рассмотрения

  1. Программа не выбрасывает никаких исключений в этом пункте.
  2. Отладка кода, кажется, что после второго нажатия программа не вводит метод SwitchButton_Click.
  3. Я пробовал читать EventHandler, но без использования.

    SwitchButton.Click += new RoutedEventHandler(SwitchButton_Click); 
    

Заранее спасибо за вашу помощь.

ответ

1

Я бы предположил, что вы слишком стараетесь. Все, что вам нужно сделать, это изменить стиль в самом окне. Оставьте словари в покое. :-)

Вот пример, который изменяет стиль окна при нажатии из списка доступных стилей.

How to style

Моя команда сводится к

   //Here I am changing the style on the window 
      NewWindow.Style = ((StyleDetailsViewModel)x).Style; 
      NewWindow.Show(); 

с различными входными данными

public StylingViewModel(Func<string, Style> findStyle) 
    {  
     Styles = new StyleDetailsViewModel[] 
     { 
      new StyleDetailsViewModel 
      { 
       Name = "None", 
       Description = "Completely remove all styling and show the raw NavigationWindow including default navigation elements", 
       WindowStyleNone = false, 
       Image = "\\Resources\\WindowStyleNone.png" 
      }, 
      new StyleDetailsViewModel 
      { 
       Name = "PlainWindow", 
       Style = findStyle("PlainWindow"), 
       Description = "Hides the navigation elemetns of the NavigationWindow to make it look just like a normal window", 
       WindowStyleNone = false, 
       Image = "\\Resources\\WindowStylePlain.png" 
      }, 
      new StyleDetailsViewModel 
      { 
       Name = "Windows 7", 
       Style = findStyle("Win7NavigationWindow"), 
       Description = "Uses glass effects to create a window that looks almost identical to the control panel from Windows 7.", 
       WindowStyleNone = false, 
       Image = "\\Resources\\WindowStyleWin7Nav.png" 
      }, 

и

this.DataContext = new StylingViewModel(x => (Style)this.FindResource(x)); 

Также остерегайтесь определенного окна свойства, которые могут быть установлены только перед открытием окна, например WindowStyle="None", которые вам нужны, если вы выполняете пользовательский хром.

+0

Хотелось бы, чтобы я мог легко что-то сделать :). Проблема в том, что Style2 не является моим собственным кодом, я просто предоставляю некоторые DLL-файлы, которые я могу использовать, но мне не разрешено просматривать или использовать код внутри. И использование словарей - единственный способ узнать эту тему из ее DLL. – Fa7mY