2013-08-22 169 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首先點擊程序將視覺效果更改爲Style2主題。所有程序的按鈕都正常運行。

SwitchButton第二次點擊程序恢復到Windows主題,但程序中的所有按鈕都可以工作。

要考慮的問題

  1. 程序在這一點上並沒有引發任何異常。
  2. 調試代碼,似乎在第二次點擊後,程序不會輸入SwitchButton_Click方法。
  3. 我試着讀了Click的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