为什么Silverlight 4中的XamlReader.Load无法识别我的附加属性?

7
我正在尝试在我们的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中的命名空间声明也正确地引用了所需的命名空间。如果通过App.xaml标记声明式地加载附加属性的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

我刚刚找到了问题的根源。在我们的XAML中,我们将命名空间声明如下:

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

看起来虽然这对于静态编译的XAML有效,但对于动态加载的XAML却无效,因为在动态加载时,命名空间所对应的程序集并没有被解析。一旦我们将命名空间声明更改为这样,它就可以工作了:

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

0

今天我刚遇到这个问题,通过使用一个行为Behavior解决了它...虽然有点丑但是管用。

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


你好 Jacob,很奇怪,我已经按照你说的引用了这个程序集

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

但是,无论如何,它都不起作用。区别在于我正在加载画布而不是资源,但我猜想,XAML验证应该是相同的。

我将尝试在我要使用它的同一标记上设置此ns。

干杯!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接