2010-08-05 23 views
20

Non riesco a essere in grado di aggiungere un dizionario unito a una raccolta di dizionari uniti in XAML.Aggiunta di un dizionario unito a un dizionario unito

Theme.xaml

<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="/Mine;component/Themes/Palette.Blue.xaml"/> 
    <ResourceDictionary Source="/Mine;component/Themes/Template.xaml"/> 
</ResourceDictionary.MergedDictionaries> 

delle risorse delle applicazioni

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/Mine;component/Themes/Theme.xaml"/> 
      <!-- 
      <ResourceDictionary Source=="/Mine;component/Themes/Palette.Blue.xaml"/> 
      <ResourceDictionary Source="/Mine;component/Themes/Template.xaml"/> 
      --> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

Nota: se ho messo entrambe le ResourceDictionaries nel Appication.Resources MergedDictionary (commentare il tema .xaml e decommenta l'altra r due dizionari) caricano entrambi correttamente. Tuttavia, il modo in cui sono definite le nostre risorse, questo potrebbe significare che verranno caricate un bel po 'di risorse, e per il caricamento dinamico mi piacerebbe essere in grado di definire i modelli.

+0

è il codice completo di theme.xaml? perché penso che sia necessario solo avviarlo e terminarlo con il tag ResourceDictionary per farlo funzionare – dnr3

+0

No, è già in un dizionario unito. Semplicemente non sembra ereditare. –

risposta

34

Si tratta di un bug di ottimizzazione, vedere this collegamento

sulla creazione di ogni oggetto in XAML, se uno stile di default è presente (cioè stile w/una chiave di tipo) che stile dovrebbe essere applicato. Come è possibile immaginare ci sono diverse ottimizzazioni prestazioni per rendere la ricerca (implicita) il più leggero possibile. Uno di questi è che non guardiamo dentro Dizionari di risorse a meno che non siano contrassegnati come "contenenti stili predefiniti ".C'è un bug: se tutti i tuoi stili predefiniti sono nidificati nei dizionari unificati in profondità (o più in profondità) il dizionario principale non viene contrassegnato come così la ricerca lo salta. La soluzione è mettere uno stile predefinito in qualcosa, qualsiasi cosa, nel dizionario root .

Quindi, l'aggiunta di uno stile fittizio al dizionario radice corregge questo problema. Esempio

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/Mine;component/Themes/Theme.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
     <!-- Dummy Style, anything you won't use goes --> 
     <Style TargetType="{x:Type Rectangle}" /> 
    </ResourceDictionary> 
</Application.Resources> 
+0

ULTIMO !!!! Grazie per questa risposta! – Vaccano

+0

Ho incontrato questo esatto problema in .NET 4 e questo lo risolve. – dex3703

+4

Per qualche motivo, questo non funziona per me. All'avvio genera un'eccezione (DependencyProperty.UnsetValue non è valido per "Primo piano") che indica che i dizionari delle risorse non vengono aggiunti. Il mio è impostato in modo identico al codice sopra su .NET 4.5. – erodewald

0

Il codice di esempio ha un doppio segno di uguale nell'origine del dizionario di risorse unito App.xaml per Palette.Blue.xaml. Presumo che questo sia un errore di battitura per il tuo esempio pubblicato qui, e non il tuo vero problema però.

Può essere difficile capire come collegare tutte le risorse direttamente in XAML. Il modo più semplice per farlo è dal pannello Risorse in Blend. Ho creato un'applicazione Silverlight con file di risorse denominati come il tuo esempio, quindi ho aperto il progetto in Blend e li ho collegati molto rapidamente.

App.xaml

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="SilverlightApplication1.App"> 
    <Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="Theme.xaml" /> 
       <!-- 
       <ResourceDictionary Source="Palette.Blue.xaml"/> 
       <ResourceDictionary Source="Template.xaml"/> 
       --> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 

Theme.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="Palette.Blue.xaml"/> 
     <ResourceDictionary Source="Template.xaml"/> 
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary> 

Template.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Style TargetType="TextBox"> 
     <Setter Property="Margin" Value="10" /> 
     <Setter Property="Width" Value="250" /> 
    </Style> 
    <Style x:Key="ReadOnlyTextBoxStyle" TargetType="TextBox"> 
     <Setter Property="IsReadOnly" Value="True" /> 
     <Setter Property="Foreground" Value="Black" /> 
     <Setter Property="IsTabStop" Value="False" /> 
     <Setter Property="Margin" Value="10" /> 
     <Setter Property="Width" Value="250" /> 
    </Style> 
</ResourceDictionary> 

Palette.Blue.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <SolidColorBrush x:Key="BlueSolidColorBrush" Color="SkyBlue" /> 
</ResourceDictionary> 

MainPage.xaml

<UserControl x:Class="SilverlightApplication1.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel x:Name="LayoutRoot" Background="Honeydew"> 
     <TextBox Text="Read Only Textbox" 
       Style="{StaticResource ReadOnlyTextBoxStyle}" /> 
     <TextBox Text="Blue Textbox" 
       Background="{StaticResource BlueSolidColorBrush}" /> 
     <TextBox Text="Read Only, Blue Textbox" 
       Style="{StaticResource ReadOnlyTextBoxStyle}" 
       Background="{StaticResource BlueSolidColorBrush}" /> 
    </StackPanel> 
</UserControl> 

Naturalmente, se si sta collegando le risorse provenienti da diverse assemblee che avrà un aspetto diverso. In realtà, in questo caso, suggerirei di cercare di unire i tuoi dizionari nel codice sottostante.

+1

Apparentemente si trattava di un errore di trascrizione (non nel file effettivo). So come aggiungere ciascuna risorsa singolarmente (tramite codice dietro o creando un nuovo MergedDictionary) ma il problema sembra essere qualcosa da fare con l'aggiunta di un mergedDictionary a un ResourceDictionary come fonte o parte di un dizionario unito separato. –

+0

Verifica l'azione di compilazione dei file xaml del dizionario. Potrebbe essere necessario cambiarlo dalla pagina predefinita alla risorsa. –

0

Se questo sta accadendo su uno dei propri controlli che ho scoperto che un'altra soluzione è impostare la proprietà DefaultStyleKey su null:

DefaultStyleKeyProperty.OverrideMetadata(typeof(MyControl), new FrameworkPropertyMetadata(null)); 

Non ho idea del perché questo funziona, ma sembra!

Problemi correlati