2017-04-11 35 views
3

我有這樣的代碼在WPF窗口:WPF的風格不適用(但在設計師作品)

<Window.Resources> 
    <Style x:Key="MahappsStyle"> 
     <Style.Resources> 
      <ResourceDictionary> 
       <ResourceDictionary.MergedDictionaries> 
        <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" /> 
        <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" /> 
        <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" /> 
        <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" /> 
        <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" /> 
       </ResourceDictionary.MergedDictionaries> 
      </ResourceDictionary> 
     </Style.Resources> 
    </Style> 
</Window.Resources> 

的想法是能夠在字典中的外部樣式在我的應用單一的元素。例如,它應該通過應用式「MahappsStyle」,以所謂的「HamburgerMenu」的單元工作:

<mahapps:HamburgerMenu x:Name="hamburgerMenu" Style="{StaticResource MahappsStyle}" 
        DisplayMode="CompactOverlay"> 
</mahapps:HamburgerMenu> 

但是這種做法似乎是工作只有在設計師,而不是在運行時。我錯過了什麼?有沒有其他方法可以將MergedDictionaries設置爲單個元素?

UPDATE。找到了做到這一點的方法。首先需要在應用程序中創建Mahapps.xaml有以下內容:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls" 
        xmlns:local="clr-namespace:Promt.Desktop"> 

    <ResourceDictionary.MergedDictionaries > 
     <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml"/> 
     <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" /> 
     <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" /> 
     <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" /> 
     <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" /> 
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary> 

然後可以通過適用於單個元素:

<mahapps:HamburgerMenu> 
      <mahapps:HamburgerMenu.Resources> 
       <ResourceDictionary Source="pack://application:,,,/Promt.Desktop;component/Styles/Mahapps.xaml"/> 
      </mahapps:HamburgerMenu.Resources> 
</mahapps:HamburgerMenu> 

我真的很失望的ResourceDictionary不能舉行x:關鍵屬性。如果有人知道另一種方法 - 請發佈。

UPDATE2。 Evk甚至更好的解決方案(基於賴斯答案)。

+0

從'HamburgerMenu'中刪除樣式'tag'併合並app.xaml文件 –

+0

@DarshanPatel中的樣式文件,這不是我想要的 - 在這種情況下,樣式將應用於所有應用程序元素,包括按鈕,複選框等等。這是如何避免這個問題的要點 –

回答

1

Laith答案是接近,但不是完全沒有,你需要做的這方法:

<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary x:Key="MahappsResources"> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" /> 
       <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" /> 
       <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" /> 
       <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" /> 
       <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </ResourceDictionary> 
</Window.Resources> 

然後您就可以通過鑰匙確實參考:

<mahapps:HamburgerMenu Resources="{StaticResource MahappsResources}" /> 

您需要添加多一個ResourceDictionary定義,因爲否則就處理您的MahappsResourcesWindow.Resources(所以模擬到Window.Resources = new ResourceDictionary() ...),並在其上設置鍵的確是沒有意義的。當你再添加一個ResourceDictionary - 現在你的確是你的MahappsResourcesWindow.Resources字典,與給定的密鑰,所以可以通過該密鑰引用它。

+0

好的一個:簡單,但機器人明顯 –

1

你可以檢查,如果這個工程:

<Window.Resources> 
    <ResourceDictionary x:Key="MahappsResources"> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" /> 
      <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" /> 
      <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" /> 
      <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" /> 
      <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Window.Resources> 

和你的控件可以使用鍵引用它:

<mahapps:HamburgerMenu Resources="{StaticResource MahappsResources}" /> 
+0

它導致在運行時發現異常「找不到資源MahappsResources」。除此之外,在設計師我有消息「的關鍵屬性只能用於包含在」IDictionary「的元素 –

+0

這是一個艱難的...後來主演它 – Laith