2010-09-29 3 views
9

Dies ist wahrscheinlich eine wirklich dumme Frage, aber ich kann das nicht herausfinden.So definieren Sie Ressourcen und ein MergeDictionary mit einem Schlüssel in einer SL4-Seite

Ich habe eine Seite mit einem MergeDictionary definiert:

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

und ich verweisen die Stile in TourneySetupStyles.xaml in meiner XAML wie dies kein Problem:

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

aber jetzt brauche ich

: eine andere Seite Ressource wie folgt hinzufügen

Aber der Designer wirft nun eine Warnung: „Der Designer nicht Lade Wörterbücher unterstützen, die‚Resource‘Artikel ohne Schlüssel und andere Gegenstände in der gleichen Kollektion mischen. Bitte stellen Sie sicher, dass die Eigenschaft 'Ressourcen' keine 'ResourceDictionary' Elemente ohne Schlüssel enthält oder dass das 'ResourceDictionary' Element das einzige Element in der Sammlung ist. "

Also füge ich meinem ResourceDictionary einen Schlüssel wie folgt hinzu: .

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

und die Warnung geht weg, aber jetzt mein Hinweis auf den Stil in TourneySetupStyles nicht mehr funktioniert:

„Kann nicht eine Ressource mit dem Namen/Key TourneySetupTextStyle finden“

Also ich denke, das Suche ion is: Wie kann ich auf den Stil zugreifen, wenn das ResourceDictionary jetzt codiert ist? es funktioniert jetzt

+0

Danke! Ich habe den gleichen Fehler (in WPF) und Ihre Lösung funktioniert. – Noich

Antwort

1

Seufzer es scheint, dass die Reihenfolge der Erklärungen wichtig ist, sobald ich die erste Ressource nach unten bewegen:

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

Wenn jemand erklären kann, warum es für die Zukunft groß sein ...

8

Ich bin gerade in das heute gerannt - ich bin Cross-Compiling zu WPF/Silverlight. Setzen Sie die lokale Ressource in den ResourceDictionary-Knoten, und fügen Sie keinen x: Key in den ResourceDictionary-Knoten ein.

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

Ich kann nicht erklären, warum - aber ich weiß, es funktioniert ...

hth

+1

Hmm, also bekommst du nicht den Entwurfszeitfehler mit diesem Code? – Rodney

+0

Oh nein ... aber ich habe die Designer in VS und Blend etwa zwei Wochen nach dem Schreiben von kompiliertem Code aufgegeben. Sie funktionieren einfach nicht. – chadbr

+0

Wenn ich die Designer verwenden möchte, verwende ich ein separates WPF- oder Silverlight-Only-Projekt, erledige meine Designarbeit, bringe es dann in mein "echtes" Projekt und finde heraus, wie man es zum Cross-Compile bringt. Es ist nahezu unmöglich, das Design danach im Designer zu laden. Ich habe ein offenes Verbindungsproblem geöffnet, das von MS bearbeitet wird, aber es geht wirklich nirgendwohin. – chadbr

0

stieß ich auf das gleiche Problem.

Ich löste das Problem, meine Wörterbuchzusammenführungen innerhalb der XAML-Datei der Anwendung statt der Ansicht selbst zu definieren.

Ex:

<ResourceDictionary> 

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

    </ResourceDictionary> 

</Application.Resources> 

+0

Hallo Scott, hat meine Lösung nicht für dich funktioniert? – Rodney

0

Ja, ich habe gerade von diesem gebissen worden. Sobald Silverlight das zusammengeführte Ressourcenwörterbuch lädt, löscht es alle lokalen Ressourcen, die Sie bereits hinzugefügt haben! In meinem Fall muss ich programmgesteuert eine Ressource vor dem Aufruf von InitalizeComponent() hinzufügen, aber da das UserControl ein zusammengefügte ResourceDictionary enthält, ist diese Ressource verloren. IMHO das ist ein Fehler in Silverlight.

Aber setzen lokale Ressourcen nach dem ResourceDictionary wird für Fälle wie Ihre arbeiten, so habe ich es gewählt.

Verwandte Themen