2013-08-20 9 views
6

私は暗黙のスタイリングでTelerikのRadControls for WPFを使用しています。前に定義したStaticResourceに基づくスタイルは実行時に見つかりません

<Style TargetType="telerikRibbonView:RadRibbonView" x:Key="RadRibbonViewStyle"> 
... 
</Style> 

私自身のスタイルをしてTelerikデフォルトのものがフォルダThemesに組み立てLib.Windows.Controlsで、次のようにマージされます:次のスタイルはThemes/Windows8/Telerik.Windows.Controls.RibbonView.xamlで定義されている

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="Windows8/Telerik.Windows.Controls.RibbonView.xaml" />   
     <ResourceDictionary Source="MyTheme/TelerikCustomizations.xaml" /> 

     <ResourceDictionary> 
      <!-- avoid optimization --> 
      <Style TargetType="{x:Type Rectangle}" /> 
     </ResourceDictionary> 
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary> 

そしてTelerikCustomizations.xamlに、私は次のように定義します(空のテスト用)style:

<Style x:Key="MyThemeRadRibbonViewStyle" TargetType="{x:Type telerik:RadRibbonView}" BasedOn="{StaticResource ResourceKey=RadRibbonViewStyle}" /> 

実行時に次の例外が発生します。

MyView.xaml.csで、次のデバッグ文に私を導いた

'Provide value on 'System.Windows.Markup.StaticResourceHolder' threw an exception.' Line number '4' and line position '42'. {"Cannot find resource named 'RadRibbonViewStyle'. Resource names are case sensitive."}

public ShellView() 
{ 
    var baseStyle = FindResource("RadRibbonViewStyle"); 
    var inherited = FindResource("MyThemeRadRibbonViewStyle"); 
    InitializeComponent(); 
} 

今の事は次のとおりです。例外は、第二FindResource呼び出しでスローされます。まったく同じメッセージです。しかし、RadRibbonViewStyleはコンストラクタの最初の行にはっきりと見られます。

実際には、マージされた辞書は実際にはApp.xamlで2度目にマージされます。

私は明らかに何かが不足していると確信していますが、何が分かりません。

App.xaml

<Application x:Class="TestClient.App" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    StartupUri="Views/ShellView.xaml"> 
    <Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="pack://application:,,,/Lib.Windows.Controls;component/Themes/MyTheme.xaml" /> 

       <ResourceDictionary> 
        <!-- added to avoid optimization --> 
        <Style TargetType="{x:Type Rectangle}" /> 
       </ResourceDictionary> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 

App.xaml.csは、コンストラクタを上書きしません。実際には何もしません。私はまだ別の辞書(MyTheme.xaml)でそれらをマージするのではなく、TelerikCustomizations.xamlでTelerik辞書をマージした場合

更新

、例外が消えます。

しかし、私はまだこれがどうして起こるのか知りたいです。

+0

私は "{StaticResourceたResourceKey = RadRibbonViewStyle}" – ethicallogics

+0

うん、なぜ= TelerikCustomizations.xamlがBASEDONでRadRibbonViewStyleを見つけることができないと思いますか? Themes/Windows8/Telerik.Windows.Controls.RibbonView.xamlは、TelerikCustomizations.xamlの直前にマージされます。 – cguedel

+0

最初のリソース辞書のソースから 'Themes'が欠けていませんか? –

答えて

6

はあなたのMyTheme/TelerikCustomizations.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="Windows8/Telerik.Windows.Controls.RibbonView.xaml" /> 
     <ResourceDictionary> 
      <Style x:Key="MyThemeRadRibbonViewStyle" TargetType="{x:Type telerik:RadRibbonView}" BasedOn="{StaticResource ResourceKey=RadRibbonViewStyle}" /> 
     </ResourceDictionary> 
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary> 

Windows8/Telerik.Windows.Controls.RibbonView.xamlにマージする必要がありそして今、あなたはあなたが好きな場所、この辞書をマージ/使用することができます。から

:あなたはStaticResourceは「姉妹」MergedDictionariesの間で動作していないので、そうあなたはStaticResource直接両親にだけ後方に見えるので、同じレベルにマージされたリソースを参照することはできませんこれを実行する必要が

MSDN:特定のリソースディクショナリ内の

XAMLリソース参照する必要があり すでにキーで定義されているリソース参照、および そのリソースは、リソース参照の前に字句的に現れる必要があります。 前方参照はXAMLリソース参照によって

を解決することはできません。しかしMergedDictionariesを使用している場合:

をリソースルックアップ・シーケンスでは、MergedDictionaries辞書は すべての確認後にのみチェックされていますMergedDictionariesを宣言した ResourceDictionaryのキー付きリソース。

+0

理論上、App.xamlに 'MyTheme.xaml'の前に' Windows8/Telerik.Windows.Controls.RibbonView.xaml'をインクルードしても動作しますが、私はそうではありませんそれは確かです。 "StaticResource"が直接 "姉妹辞書"のために働いていないのか、それとも "姉妹辞書の枝"の間でも働いていないのかどうかは明らかではありません。 – nemesv

+0

大変ありがとうございます; – cguedel

関連する問題