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

前端之家收集整理的这篇文章主要介绍了为什么XamlReader.Load无法识别我在Silverlight 4中的附加属性?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图弄清楚如何在运行时以编程方式在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:

The attachable property ‘Foo’ was not found in type ‘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时附加属性的引用在“静态”加载时工作得很好?

解决方法

我只是想出了问题的根源.在我们的XAML中,我们声明了我们的命名空间如下:

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

看起来虽然这适用于静态编译的XAML,但它不适用于动态加载的XAML,因为在动态加载时,命名空间的程序集无法解析.一旦我们将名称空间声明更改为此,它就可以工作:

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

猜你在找的Silverlight相关文章