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