我正在尝试弄清楚如何在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
期间提出了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时附加属性的引用在“静态”加载时工作得很好?
答案 0 :(得分:15)
我刚刚想出问题的根源。在我们的XAML中,我们声明了我们的命名空间如下:
xmlns:u="clr-namespace:Company.Product.Utils"
虽然这适用于静态编译的XAML,但它不适用于动态加载的XAML,因为在动态加载时,命名空间的程序集无法解析。一旦我们将名称空间声明更改为此,它就可以工作:
xmlns:u="clr-namespace:Company.Product.Utils;assembly=OurAssembly"
答案 1 :(得分: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();
}
希望有所帮助! 干杯! FerCallejón.-
嗨,雅各布,这很奇怪,我按照你的说法引用了大会
xmlns:bsic="clr-namespace:Bsi.Ipp.Eurocodes.UI.Controls;assembly=Bsi.Ipp.Eurocodes.UI.Controls"
但是,无论如何,它不起作用。不同之处在于我正在加载Canvas而不是资源,但我想,xaml验证应该是相同的。
我会尝试将此ns设置在我将要使用它的同一个标签上。
干杯!!