2016-01-23 9 views
11

Ho scritto il seguente codice, ma XamlParseException ha generato il bean. ("StaticResource non trovato per CustomColor chiave")Xamarin.Forms: come posso caricare ResourceDictionary da un altro file?

MyPage.xaml

<?xml version="1.0" encoding="UTF-8"?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      x:Class="XFApp11.MyPage"> 
    <ContentPage.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="CustomResource.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </ContentPage.Resources> 

    <ContentPage.Content> 
     <BoxView Color="{StaticResource CustomColor}" /> 
    </ContentPage.Content> 
</ContentPage> 

CustomResource.xaml (build action = EmbeddedResource)

<?xml version="1.0" encoding="UTF-8" ?> 
<ResourceDictionary xmlns="http://xamarin.com/schemas/2014/forms" 
        xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"> 
    <Color x:Key="CustomColor">#004B86</Color> 
</ResourceDictionary> 

risposta

9

Dizionari uniti non sono supportati in Xamarin Moduli XAML in basso 2.1.0

L'unico modo per farlo è quello di inserirlo in un'altra pagina e quindi caricarlo nel codice dietro e fare riferimento a DynamicResource anziché Statico Risorsa.

spiego questo di più qui: http://www.xamarinhelp.com/styling-uiux-day-11/

Tuttavia, come di 2.1.0-pre1 (pubblicato questa settimana), ora è possibile farlo di template, che è un altro modo per fare questo. Jason Smith ha bloggato su di esso: http://xfcomplete.net/general/2016/01/20/control-templates/

Aggiornamento: Come di 2.3.0 si può fare un dizionario unito con un attributo chiamato MergedWith.

Creare un nuovo file XAML

<?xml version="1.0" encoding="utf-8" ?> 
<ResourceDictionary xmlns="http://xamarin.com/schemas/2014/forms" 
        xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
        x:Class="UIDemo.Style.NewStyle"> 
    <Style TargetType="Label"> 
     <Setter Property="TextColor" Value="Blue" /> 
    </Style> 
</ResourceDictionary> 

Ora nel tuo ContentPage usare l'attributo MergedWith sul ResourceDictionary.

<?xml version="1.0" encoding="utf-8" ?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      xmlns:theme="clr-namespace:UIDemo.Style" 
      x:Class="UIDemo.MainPage"> 
    <ContentPage.Resources> 
     <ResourceDictionary MergedWith="theme:NewStyle" /> 
    </ContentPage.Resources> 
    <Grid> 
     <Label Text="Hello" /> 
    </Grid> 
</ContentPage> 
+0

Grazie per la risposta, anche la proprietà ResourceDictionary.Source non è supportata? – P3PPP

+0

Non che io sappia. Ricordo vagamente di averlo guardato un po 'indietro. Non è possibile fare riferimento a un altro file XAML per il dizionario delle risorse in XF. Ma non sono andato a provarlo proprio ora, quindi se puoi, qualcuno per favore correggimi :) –

+0

Ho seguito le tue risposte, quando eseguo il debug vedo la lista delle risorse, la proprietà Count include tutte le mie risorse (il mio codice è 54) ma le chiavi e i valori non lo sono (il mio codice è solo 1 chiave e valore). Inoltre, errore di runtime per Impossibile trovare la chiave di risorsa XXX. Sembra che conosca la risorsa unita ma non è applicata – zquanghoangz

13

A partire dal 2.3.0 può ufficialmente fondersi dizionari risorsa in XAML osservare il seguente esempio

BlueTheme.xaml

<?xml version="1.0" encoding="utf-8" ?> 
<ResourceDictionary xmlns="http://xamarin.com/schemas/2014/forms" 
        xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
        x:Class="UI.Themes.BlueTheme"> 
    <Style TargetType="Label"> 
     <Setter Property="TextColor" Value="Blue" /> 
    </Style> 
</ResourceDictionary> 

App.xaml

<?xml version="1.0" encoding="utf-8" ?> 
<Application xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      xmlns:theme="clr-namespace:UI.Themes" 
      x:Class="UI.App"> 
    <Application.Resources> 
     <ResourceDictionary MergedWith="themes:BlueTheme" /> 
    </Application.Resources> 
    <Label Text="Hello" /> 
</Application> 
+0

Che tipo hai usato per ereditare BlueTheme.xaml. Puoi condividere il codice BlueTheme.xaml.cs –

+2

Questo dovrebbe essere chiaro da Xaml: *** ResourceDictionary *** se avesse una classe base diversa avrei bisogno di scrivere qualcosa di simile a *** local: ResourceDictionary *** –

+0

Questo dovrebbe essere chiaro da Xaml : *** ResourceDictionary *** se avesse una diversa classe base personalizzata avrei bisogno di scrivere qualcosa di simile a *** namespace personalizzato: ResourceDictionary *** Inoltre *** ResourceDictionary *** è 'public 'dal *** 2.3.0 *** –