2010-09-29 4 views
9

Questa è probabilmente una domanda davvero stupida ma non riesco a capirlo.Come definire le risorse E un MergeDictionary con una chiave in una pagina SL4

Ho una pagina con un MergeDictionary definito:

<navigation:Page.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="../Assets/TourneySetupStyles.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </navigation:Page.Resources> 

e mi riferisco gli stili in TourneySetupStyles.xaml nel mio XAML come questo senza alcun problema:

<TextBlock Text="Tourney Name:" Style="{StaticResource TourneySetupTextStyle}" /> 

Tuttavia, ora ho bisogno per aggiungere un'altra risorsa pagina come questa:

Ma il designer ora lancia un avvertimento: "Il progettista non supporta dizionari di carico che mescolano elementi 'ResourceDictionary' senza una chiave e altri elementi della stessa collezione. Assicurati che la proprietà 'Risorse' non contenga elementi 'ResourceDictionary' senza una chiave, o che l'elemento 'ResourceDictionary' sia l'unico elemento della collezione. "

Quindi aggiungo una chiave al mio ResourceDictionary come questo: .

<navigation:Page.Resources> 
     <local:Tournament x:Key="tournament" /> 
     <ResourceDictionary x:Key="whatever"> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="../Assets/TourneySetupStyles.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 

    </navigation:Page.Resources> 

e l'avviso va via, ma ora il mio riferimento allo stile in TourneySetupStyles non funziona più:

"non riesco a trovare una risorsa con il nome/chiave TourneySetupTextStyle"

Quindi credo che la ricerca ion is: Come posso accedere allo stile ora che il ResourceDictionary è digitato?

+0

Grazie! Ho lo stesso errore (in WPF) e la tua soluzione funziona. – Noich

risposta

1

sospiro sembra che l'ordine delle dichiarazioni è importante, non appena mi muovo la prima risorsa giù ora funziona:

<navigation:Page.Resources> 
    <ResourceDictionary x:Key="TourneySetupStyles"> 
      <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="../Assets/TourneySetupStyles.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    <local:Tournament x:Key="tourneySetupViewModel" /> 
</navigation:Page.Resources> 

Se qualcuno può spiegare perché sarebbe bello per riferimento futuro ...

8

Mi sono imbattuto in questo oggi - sto cross compilando a WPF/Silverlight. Inserire la risorsa locale nel nodo ResourceDictionary, non inserire una chiave x: nel nodo ResourceDictionary.

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/mydll;component/folder/MyResDict.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 

     <LinearGradientBrush x:Key="OrangeGradient" 
          EndPoint="0.5,1" 
          MappingMode="RelativeToBoundingBox" 
          StartPoint="0.5,0"> 
      <LinearGradientBrush.RelativeTransform> 
       <RotateTransform CenterY="0.5" 
            CenterX="0.5" /> 
      </LinearGradientBrush.RelativeTransform> 
      <GradientStop Color="#FFF3801E" /> 
      <GradientStop Color="#FFEDB17E" 
          Offset="0.5" /> 
      <GradientStop Color="#FFF3801E" 
          Offset="1" /> 
     </LinearGradientBrush> 
    </ResourceDictionary> 
</UserControl.Resources> 

Non riesco a spiegare perché - ma so che funziona ...

hth

+1

Hmm, quindi non si ottiene l'errore di progettazione con quel codice? – Rodney

+0

Oh no ... ma ho rinunciato ai designer di VS e Blend circa 2 settimane dopo aver iniziato a scrivere codice cross-compilato. Semplicemente non funzionano. – chadbr

+0

Se voglio utilizzare i designer, utilizzo un progetto WPF o Silverlight separato, eseguo il mio lavoro di progettazione, quindi lo inserisco nel mio progetto "reale" e capisco come ottenerlo per eseguire la compilazione incrociata. Ottenere il design da caricare nel designer dopo è quasi impossibile. Ho aperto un problema di connessione aperta che viene utilizzato da MS, ma in realtà non sta andando da nessuna parte. – chadbr

0

mi sono imbattuto lo stesso problema.

Ho risolto il problema definendo il mio dizionario unito nel file xaml dell'applicazione anziché nella vista stessa.

Es:

<ResourceDictionary> 

     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Resources\Brushes\Brushes_Dictionary.xaml" /> 
      <ResourceDictionary Source="Resources\Storyboards\Storyboard_Dictionary.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 

    </ResourceDictionary> 

</Application.Resources> 

+0

Ciao Scott, la mia soluzione non funzionava per te? – Rodney

0

Sì, ho appena stato morso da questo. Non appena Silverlight carica il dizionario delle risorse unite, elimina tutte le risorse locali che hai già aggiunto! Nel mio caso ho bisogno di aggiungere una risorsa prima della chiamata InitalizeComponent(), ma poiché UserControl include un ResourceDictionary unito, la risorsa viene persa. IMHO questo è un bug in Silverlight.

Ma mettere risorse locali dopo che ResourceDictionary funzionerà per casi come il tuo, quindi ho votato.