2013-08-20 13 views
6

Ich verwende Teleriks RadControls für WPF mit impliziten Styling. Der folgende Stil ist in Themes/Windows8/Telerik.Windows.Controls.RibbonView.xaml definiert:Stil basierend auf StaticResource zuvor definiert wurde zur Laufzeit nicht gefunden

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

Meine eigenen Stile und die auch keine Telerik erhalten, wie dies in der Versammlung Lib.Windows.Controls im Ordner Themes verschmolzen:

<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> 

Und in TelerikCustomizations.xaml definiere ich die folgende (leer, zu Testzwecken) style:

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

Das führt zur Laufzeit zur folgenden Ausnahme:

'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."}

Welche der folgenden Debugging-Anweisungen in MyView.xaml.cs führte mich:

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

Jetzt ist die Sache: Die Ausnahme auf dem zweiten FindResource Anruf ausgelöst wird. Mit der exakt gleichen Nachricht. Allerdings ist die RadRibbonViewStyle eindeutig in der ersten Zeile des Konstruktors gefunden.

Wenn es darauf ankommt, wird das zusammengeführte Wörterbuch tatsächlich in App.xaml ein zweites Mal zusammengeführt.

Ich bin sicher, ich vermisse etwas offensichtlich, aber ich kann nicht herausfinden, was.

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 nicht den Konstruktor überschreiben. Tatsächlich macht es nichts.

aktualisieren

Wenn ich die Telerik Wörterbücher in TelerikCustomizations.xaml statt sie noch in einem anderen Wörterbuch Verschmelzung (MyTheme.xaml) fusionieren, verschwindet die Ausnahme.

Allerdings würde ich immer noch gerne wissen, warum das passiert.

+0

Ich denke TelerikCustomizations.xaml nicht in der Lage ist RadRibbonViewStyle in BasedOn = "{Static ResourceKey = RadRibbonViewStyle}" – ethicallogics

+0

Ja, aber warum zu finden? Designs/Windows8/Telerik.Windows.Controls.RibbonView.xaml wird direkt vor TelerikCustomizations.xaml zusammengeführt. – cguedel

+0

Vermissen Sie nicht 'Themes' aus der Quelle des ersten Ressourcenwörterbuchs? –

Antwort

6

Sie müssen in der Windows8/Telerik.Windows.Controls.RibbonView.xaml in Ihrem 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> 

fusionieren Und jetzt können Sie/fusionieren dieses Wörterbuch, wo immer Sie wollen.

Sie müssen dies tun, weil StaticResource nicht zwischen „Schwester“ MergedDictionaries arbeiten, so dass Sie nicht eine Ressource verweisen, die auf der gleichen Ebene verschmolzen wurde, weil die StaticResource nur rückwärts an die direkten Eltern aussieht:

Aus MSDN:

XAML Ressourcenreferenzen innerhalb eines bestimmten Ressourcenverzeichnisses muss Referenz eine Ressource, die bereits mit einem Schlüssel definiert wurde, und Diese Ressource muss lexikalisch vor der Ressourcenreferenz erscheinen. Vorwärtsreferenzen kann nicht durch eine XAML-Ressource-Referenz-

aber gelöst werden, wenn MergedDictionaries mit:

In der Ressource-Lookup-Sequenz, eine MergedDictionaries Wörterbuch ist erst nach einer Überprüfung aller überprüft der Schlüsselressourcen des ResourceDictionary, das MergedDictionaries deklarierte.

+0

Also in der Theorie würde das auch funktionieren, wenn Sie "Windows8/Telerik.Windows.Controls.RibbonView.xaml" in Ihrer App.xaml vor der 'MyTheme.xaml' enthalten, aber ich bin nicht sicher darin. Aus der Dokumentation ist nicht ersichtlich, ob 'StaticResource' nicht für direkte" Schwesterwörterbücher "funktioniert oder auch nicht zwischen" Schwesterwörterbuchzweigen "funktioniert ... – nemesv

+0

Vielen Dank, das erklärt einiges;) – cguedel