2017-04-11 32 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> 

アイデアは私のアプリケーションでは、単一の要素のための辞書で外部のスタイルを有効にすることです。

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

をしかし、このアプローチは、デザイナで動作しているようだ、ではなく、実行時に:たとえば、「HamburgerMenu」という要素にスタイル「MahappsStyle」を適用することにより、動作するはずです。私は何が欠けていますか? 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のさらに優れたソリューション(Laithの答えに基づく)。

+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}" /> 

は、あなたはそれ以外の場合は、(そうWindow.Resources = new ResourceDictionary() ...にアナログ)あなたMahappsResourcesWindow.Resourcesとして扱い、その上にキーを設定すると、実際には意味がありませんので、1つの以上ResourceDictionary定義を追加する必要があります。あなたがResourceDictionaryをもう1つ追加すると、実際には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

関連する問題