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

不幸的XamlParseException是,在调用 a 期间引发了XamlReader.Load

在“Bar”类型中找不到可附加属性“Foo”。

正确附加的这个正确声明,并且 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 时对附加属性的引用不起作用,而在“静态”加载时它工作得很好?

4

2 回答 2

15

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

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

似乎虽然这适用于静态编译的 XAML,但它不适用于动态加载的 XAML,因为动态加载时,命名空间的程序集不会得到解析。一旦我们将命名空间声明更改为此,它就起作用了:

xmlns:u="clr-namespace:Company.Product.Utils;assembly=OurAssembly"
于 2010-09-21T21:14:20.170 回答
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();
    }

希望对您有所帮助!干杯! Fer Callejón.-


嗨雅各布,这很奇怪,我有你所说的引用的程序集

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

但是,无论如何,它不起作用。不同之处在于我加载的是画布而不是资源,但我想,xaml 验证应该是相同的。

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

干杯!!

于 2010-09-21T21:04:59.880 回答