7

Sto cercando di capire come applicare a livello di codice un tema in fase di esecuzione nella nostra applicazione Silverlight 4. Ho pensato che questo dovrebbe essere semplice come caricare un dizionario di risorse da XAML e fonderlo con i dizionari uniti dell'applicazione. Ecco il mio codice finora:Perché XamlReader.Load non è in grado di riconoscere la proprietà associata in Silverlight 4?

var themeUri = new Uri(
    "OurApp;component/Themes/Classic/Theme.xaml", UriKind.Relative); 
var resourceInfo = GetResourceStream(themeUri); 
using (var stream = resourceInfo.Stream) 
{ 
    using (var reader = new StreamReader(stream)) 
    { 
     var xamlText = reader.ReadToEnd(); 
     var dict = XamlReader.Load(xamlText) as ResourceDictionary; 
     Resources.MergedDictionaries.Add(dict); 
    } 
} 

Purtroppo, un XamlParseException è sollevato durante la chiamata a XamlReader.Load:

La proprietà attaccabile 'Foo' non è stato trovato nel tipo 'Bar'.

Questa fissato correttamente è correttamente dichiarato, e la dichiarazione dello spazio dei nomi in XAML fa riferimento correttamente il namespace richiesto. La proprietà allegata XAML funziona bene se caricata in modo dichiarativo nei dizionari uniti tramite il markup App.xaml.

Ecco una copia abbreviato del XAML, che sto cercando di caricare in fase di esecuzione:

<ResourceDictionary xmlns:u="clr-namespace:Company.Product.Utils" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Style x:Key="ControlPanelStyle" TargetType="ContentControl"> 
    <Setter Property="Template"> 
     <Setter.Value> 
     <ControlTemplate TargetType="ContentControl"> 
      <Grid Margin="0" u:Bar.Foo="True"> 
      <!-- Stuff and things --> 
      <ContentPresenter Content="{TemplateBinding Content}" /> 
      </Grid> 
     </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    </Style> 
</ResourceDictionary> 

Perché il riferimento alla proprietà associata non funziona durante il caricamento XAML in fase di runtime quando si sta lavorando bene quando "staticamente" caricato?

risposta

15

Ho appena scoperto la fonte del problema. Nel nostro XAML, avevamo dichiarato il nostro namespace come segue:

xmlns:u="clr-namespace:Company.Product.Utils" 

Sembra che, anche se questo funziona per XAML staticamente compilato, non funziona per XAML caricata in modo dinamico, perché quando caricate dinamicamente, l'assemblea per lo spazio dei nomi non viene risolto. Dopo aver modificato la dichiarazione dello spazio dei nomi, ha funzionato:

xmlns:u="clr-namespace:Company.Product.Utils;assembly=OurAssembly" 
0

Ho appena affrontato questo problema oggi e l'ho risolto usando un comportamento ... è un po 'brutto ma fa il trucco.

public string Title 
    { 
     get { return (string)GetValue(TitleProperty); } 
     set { SetValue(TitleProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty TitleProperty = 
     DependencyProperty.Register("Title", typeof(string), typeof(AddressableObjectBehavior), new PropertyMetadata(null, OnTitleChanged)); 

    protected override void OnAttached() 
    { 
     AddressableObject.SetTitle(this.AssociatedObject, this.Title); 
     base.OnAttached(); 
    } 

Spero che sia d'aiuto! Cheers! Fer Callejón.-


Ciao Jacob, questo è strano, ho il montaggio riferimento come hai detto

xmlns:bsic="clr-namespace:Bsi.Ipp.Eurocodes.UI.Controls;assembly=Bsi.Ipp.Eurocodes.UI.Controls" 

Ma, in ogni caso, non funziona. La differenza è che sto caricando una tela non una risorsa, ma suppongo che la validazione di xaml dovrebbe essere la stessa.

Proverò impostando questo ns sullo stesso tag dove lo userò.

Saluti !!

Problemi correlati