2010-06-11 12 views
7

Opracowałem aplikację, która pozwala użytkownikowi przełączać się między tematami. Robię to poprzez włączenie pliku XAML jako zasób w moim projekcie i przy użyciu następującego kodu:Skorzystaj ze słownika zasobów jako motywu w Silverlight

MainTheme.ThemeUri = new Uri("SilverlightApplication1;component/Themes/[ThemeName]/Theme.xaml", UriKind.Relative); 

To działało dobrze, aż znalazłem te tematy: http://timheuer.com/blog/archive/2010/05/17/silverlight-4-tools-released-and-new-application-templates.aspx

Różnica polega na tym, że te tematy składają się z wielu plików. Zrobiłem więc plik Theme.xaml, który zawiera tylko MergedDictionaries, więc nadal mógłbym użyć powyższego kodu. To jest plik Theme.xaml dla kompozycji Cosmopolitan.

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="CoreStyles.xaml"/> 
     <ResourceDictionary Source="SDKStyles.xaml"/> 
     <ResourceDictionary Source="Styles.xaml"/> 
     <ResourceDictionary Source="ToolkitStyles.xaml"/> 
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary> 

Jednak, kiedy uruchomić kod C# powyżej pojawia się następujący wyjątek:

System.Windows.Markup.XamlParseException: Failed to assign to property 'System.Windows.ResourceDictionary.Source'. 

żeby była jasność, stosując metodę MergedDictionaries działa kiedy ustawić go w moim App.xaml:

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Themes/Cosmopolitan/Theme.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

Co robię źle?

Dzięki!

+0

Ustawianie ścieżki bezwzględne w moim pliku Theme.xaml też nie działa :( – SaphuA

+0

miałem podobny problem a przyczyną było użycie odwrotnego ukośnika (\) zamiast ukośnika (/) podczas odwoływania się do pliku. Analizator składni xaml w VS był w stanie rozwiązać lokalizację, ale w czasie wykonywania generowany był błąd. Mam nadzieję, że to pomoże komuś innemu –

Odpowiedz

10

Podczas korzystania z MergedDictionary należy użyć w pełni kwalifikowanej nazwy, jak poniżej.

<ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="/SilverlightApplication1;component/Themes/Cosmopolitan/Theme.xaml"/> 

Należy również pamiętać, że nie wolno pominąć ukośnika przed nazwą zespołu. Innymi słowy, powinien on być jak

Source="/SilverlightApplication1; 
nie

podoba

Source="SilverlightApplication1; 

HTH

+5

Nie musisz wkładać "komponentu" do rufy er nazwa zespołu "/SilverlightApplication1;component/Themes/Cosmopolitan/Theme.xaml" – user20358

+0

Tak, powinieneś umieścić komponent. To jest poprawne. – Lance

+1

@ Prince: Części składowe są niezbędne. Rozważ zaktualizowanie swojej odpowiedzi. To będzie świetna odpowiedź po tej aktualizacji. –

Powiązane problemy