7

Próbuję dowiedzieć się, jak programowo zastosować motyw w czasie wykonywania w naszej aplikacji Silverlight 4. Pomyślałem, że powinno to być tak proste, jak załadowanie słownika zasobów z XAML i połączenie go ze słownikami połączonymi z aplikacją. Oto mój kod do tej pory:Dlaczego XamlReader.Load nie może rozpoznać przypisanej mi usługi w 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); 
    } 
} 

Niestety, XamlParseException jest podnoszona podczas rozmowy do XamlReader.Load:

Obiekt mocowany „Foo” nie został odnaleziony w rodzaju „Bar”.

Ten dołączony prawidłowo jest prawidłowo zadeklarowane i deklaracja przestrzeni nazw w XAML prawidłowo odwołuje się do wymaganej przestrzeni nazw. Załączona właściwość XAML działa poprawnie, jeśli jest ładowana do połączonych słowników deklaratywnie poprzez znaczniki App.xaml.

Oto skrócona kopia XAML, który próbuję załadować przy starcie:

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

Dlaczego jest odniesienie do załączonego własności nie działa podczas ładowania XAML w czasie wykonywania, gdy jest on działa dobrze, gdy "ładowane statycznie"?

Odpowiedz

15

Właśnie odkryłem źródło problemu. W naszej XAML, mieliśmy naszą nazw zadeklarowana następująco:

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

Wydaje się, że mimo to pracuje statycznie skompilowany XAML, że nie działa na dynamicznie załadowanego XAML bo gdy załadowane dynamicznie, zespół na przestrzeni nazw nie zostanie rozwiązany. Po zmianie deklaracji przestrzeni nazw na to działało:

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

Właśnie spotkałem się z tym problemem dzisiaj i rozwiązałem go za pomocą zachowania ... to trochę brzydkie, ale działa.

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

Mam nadzieję, że to pomoże! Pozdrawiam! Fer Callejón.-


Cześć Jacob, to dziwne, mam zespół określany jako mówiłeś

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

Ale, tak, to nie działa. Różnica polega na tym, że ładuję płótno, a nie zasób, ale domyślam się, że walidacja xaml powinna być taka sama.

Spróbuję, ustawiając tę ​​wartość ns na tym samym tagu, gdzie zamierzam go użyć.

Pozdrawiam!