7

Я пытаюсь понять, как программно применять тему во время выполнения в нашем приложении Silverlight 4. Я полагал, что это должно быть так же просто, как загрузить словарь ресурсов из XAML и слить его с объединенными словарями приложения. Вот мой код до сих пор:Почему XamlReader.Load не может распознать мое прикрепленное свойство в 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); 
    } 
} 

К сожалению, XamlParseException поднят во время вызова XamlReader.Load:

Присоединяемый свойство «Foo» не был найден в тип «Бар».

Это прикрепленная является правильно объявлена, и объявление пространства имен в XAML правильно ссылается на требуемое пространство имен. Вложенное свойство XAML работает просто отлично, если декларативно загружается в объединенные словари через разметку App.xaml.

Вот сокращенная копия XAML, которую я пытаюсь загрузить во время выполнения:

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

Почему ссылка на прикрепленную собственность не работает при загрузке XAML во время выполнения, когда она работает просто отлично, когда «статически» загружен?

ответ

15

Я просто вычислил источник проблемы. В нашем XAML, мы объявили наше пространство имен следующим образом:

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

кажется, что, хотя это работает для статически скомпилированный XAML, он не работает для динамически загружаемой XAML, потому что, когда загружается динамически узел пространства имен не разрешается. Как только мы изменили декларацию пространства имен на это, она сработала:

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

Сегодня я столкнулся с этой проблемой, и решил ее с помощью Поведения ... это отвратительно, но это трюк.

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

Надеюсь, что это поможет! Приветствия! Фер Callejón.-


Привет Джейкоб, это странно, у меня есть сборка ссылки, как вы сказали

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

Но, во всяком случае, она не работает. Разница в том, что я загружаю Canvas, а не ресурс, но я думаю, что проверка xaml должна быть такой же.

Я попробую, установив этот нс на тот же тег, где я его буду использовать.

Cheers !!

 Смежные вопросы

  • Нет связанных вопросов^_^