Почему XamlReader.Load не может распознать мое присоединенное свойство в Silverlight 4? - PullRequest
7 голосов
/ 20 сентября 2010

Я пытаюсь понять, как программно применить тему во время выполнения в нашем приложении Silverlight 4.Я подумал, что это должно быть так же просто, как загрузить словарь ресурсов из XAML и объединить его со слитными словарями приложения.Вот мой код:

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

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

Присоединяемое свойство 'Foo' не найдено ввведите 'Bar'.

Это прикреплено правильно правильно объявлено , и объявление пространства имен в 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 во время выполнения, когда оно просто отлично работает при "статической" загрузке?

Ответы [ 2 ]

15 голосов
/ 22 сентября 2010

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

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

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

xmlns:u="clr-namespace:Company.Product.Utils;assembly=OurAssembly"
0 голосов
/ 22 сентября 2010

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

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

Надеюсь, это поможет!Ура!Fer Callejón .-


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

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

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

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

Ура !!

...