7

Estoy tratando de averiguar cómo aplicar un tema programáticamente en el tiempo de ejecución en nuestra aplicación Silverlight 4. Pensé que esto debería ser tan simple como cargar un diccionario de recursos de XAML y fusionarlo con los diccionarios fusionados de la aplicación. Aquí está mi código hasta ahora:¿Por qué XamlReader.Load no puede reconocer mi propiedad adjunta en 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); 
    } 
} 

Por desgracia, una XamlParseException se eleva durante la llamada a XamlReader.Load:

La propiedad acoplable 'Foo' no se ha encontrado en el tipo 'Bar'.

Esta conectado correctamente es declarado adecuadamente, y la declaración de espacio de nombres en el XAML hace referencia correctamente el espacio de nombres necesario. La propiedad adjunta XAML funciona bien si se carga en los diccionarios combinados declarativamente a través del marcado App.xaml.

Aquí es una copia abreviada del XAML, que estoy tratando de cargar en tiempo de ejecución:

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

¿Por qué la referencia a los bienes embargados que no trabaja cuando se carga XAML en tiempo de ejecución cuando se está trabajando bien cuando "estáticamente" cargado?

Respuesta

15

Acabo de descubrir el origen del problema. En nuestro XAML, habíamos declarado nuestro espacio de nombres de la siguiente manera:

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

Parece que a pesar de esto funciona para XAML compilado estáticamente, no funciona para XAML carga dinámica porque cuando cargada dinámicamente, la asamblea para el espacio de nombres no se resuelve Una vez que cambiamos la declaración del espacio de nombres a esto, funcionó:

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

Acabo de enfrentar este problema hoy y lo resolví mediante el uso de un Comportamiento ... es un poco feo, pero funciona.

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(); 
    } 

Hope it help! ¡Salud! Fer Callejón.-


Hola Jacob, eso es extraño, tengo el ensamblaje de referencia como bien dice

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

Pero, de todos modos, no funciona. La diferencia es que estoy cargando un lienzo, no un recurso, pero supongo que la validación de xaml debe ser la misma.

Intentaré estableciendo este ns en la misma etiqueta donde lo voy a usar.

¡Salud!

Cuestiones relacionadas