2013-08-20 11 views
6

Utilizzo RadControls di Telerik per WPF con stile implicito. Il seguente stile è definito in Themes/Windows8/Telerik.Windows.Controls.RibbonView.xaml:Lo stile basato su StaticResource precedentemente definito non si trova in fase di esecuzione

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

miei propri stili e quelli di default Telerik ottenere fuse come questo nell'assemblea Lib.Windows.Controls nella cartella Themes:

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

E in TelerikCustomizations.xaml io definisco il seguente (vuoto, per scopi di test) stile:

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

Quali risultati nella seguente eccezione in fase di esecuzione:

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

che mi ha portato ai seguenti dichiarazioni di debug in MyView.xaml.cs:

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

Ora la cosa è: L'eccezione viene generata sul secondo FindResource chiamata. Con lo stesso identico messaggio. Tuttavia, lo RadRibbonViewStyle si trova chiaramente nella prima riga del costruttore.

Se è importante, il dizionario unito viene effettivamente unito in App.xaml una seconda volta.

Sono sicuro che mi manca qualcosa di ovvio, ma non riesco a capire cosa.

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 non sovrascrive il costruttore. In realtà non fa nulla.

Aggiornamento

Se unire i dizionari Telerik in TelerikCustomizations.xaml invece di fondere in un altro dizionario (MyTheme.xaml), l'eccezione scompare.

Tuttavia, mi piacerebbe ancora sapere perché questo accade.

+0

penso TelerikCustomizations.xaml non è in grado di trovare RadRibbonViewStyle in BasedOn = "{StaticResource ResourceKey = RadRibbonViewStyle}" – ethicallogics

+0

Sì, ma perché? Temi/Windows8/Telerik.Windows.Controls.RibbonView.xaml vengono uniti a destra prima di TelerikCustomizations.xaml. – cguedel

+0

Non ti mancano i 'temi 'dall'origine del primo dizionario delle risorse? –

risposta

6

è necessario unire nel Windows8/Telerik.Windows.Controls.RibbonView.xaml nel vostro 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> 

e ora è possibile utilizzare/fondere questo dizionario dove vuoi.

Hai bisogno di fare questo perché StaticResource non funziona tra "sorella" MergedDictionaries quindi non è possibile fare riferimento a una risorsa che è stata fusa allo stesso livello perché il StaticResource guarda solo indietro per le diretti genitori:

Da MSDN:

riferimenti delle risorse XAML all'interno di un particolare dizionario risorse deve di riferimento di una risorsa che è già stato definito con una chiave, e quella risorsa deve apparire in modo lessicale prima del riferimento alla risorsa. riferimenti a termine non possono essere risolti da un riferimento risorsa XAML

Ma quando si utilizza MergedDictionaries:

Nella sequenza delle risorse di ricerca, un dizionario MergedDictionaries è controllato solo dopo un controllo di tutti del risorse codificate del ResourceDictionary che ha dichiarato MergedDictionaries.

+0

Quindi, in teoria, funzionerebbe anche se includessi 'Windows8/Telerik.Windows.Controls.RibbonView.xaml' nella tua app.xaml prima di' MyTheme.xaml', ma non lo sono certo. Dalla documentazione non è chiaro se 'StaticResource' non stia lavorando per i" dizionari sorelle "diretti o non funziona anche tra" rami del dizionario sorella "... – nemesv

+0

Grazie mille, questo spiega molto;) – cguedel

Problemi correlati