我已经实现了一个附加属性,保留了一个System.Type值,该值在WPF中正常工作但是抛出了
Windows.UI.Xaml.Markup.XamlParseException
在WinRT应用程序中使用时。我猜测指定的类型无法解析。
以下是附加属性的实现:
using System;
using System.Diagnostics;
#if NETFX_CORE
using Windows.UI.Xaml;
#else
using System.Windows;
#endif
namespace Test
{
public class AttachedClass
{
}
public static class PropaClass
{
public static Type GetAttachedType(DependencyObject obj)
{
return (Type)obj.GetValue(AttachedTypeProperty);
}
public static void SetAttachedType(DependencyObject obj, Type value)
{
obj.SetValue(AttachedTypeProperty, value);
}
public static readonly DependencyProperty AttachedTypeProperty =
DependencyProperty.RegisterAttached("AttachedType",
typeof(Type), typeof(PropaClass), new PropertyMetadata(null, OnAttachedTypeChanged));
private static void OnAttachedTypeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Debug.WriteLine("Set value : {0}", e.NewValue.ToString(), null);
}
}
}
以下是它在WPF应用程序中的使用方式:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:test="clr-namespace:Test"
Title="MainWindow" Height="350" Width="525"
test:PropaClass.AttachedType="{x:Type test:AttachedClass}">
<Grid>
</Grid>
</Window>
WinRT App页面:
<Page
x:Class="App1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App1"
xmlns:test="using:Test"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
test:PropaClass.AttachedType="test:AttachedClass">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
</Grid>
</Page>
我在WinRT应用程序中遇到的例外是:
Exception:Thrown: "Det gick inte att hitta texten som associeras med den här felkoden.
Failed to create a '%1' from the text '%0'. [Line: 10 Position: 5]" (Windows.UI.Xaml.Markup.XamlParseException)
A Windows.UI.Xaml.Markup.XamlParseException was thrown: "Det gick inte att hitta texten som associeras med den här felkoden.
Failed to create a '%1' from the text '%0'. [Line: 10 Position: 5]"
WinRT information: Failed to create a '%1' from the text '%0'. [Line: 10 Position: 5]
Time: 2015-03-19 12:05:00
Thread:<No Name>[396]
所以我的问题是:我做错了什么?如果我在WinRT页面XAML中用test:PropaClass.AttachedType="test:AttachedClass">
替换test:PropaClass.AttachedType="test:PropaClass">
,它就像一个魅力!
有没有办法让XAML解析器识别AttachedClass?
P.S。这是使用针对.NET framework 4.5和Windows8.1的VS2013
将此添加到WinRT XAML页面中删除了异常。
<Page.Resources>
<test:AttachedClass x:Key="test"/>
</Page.Resources>
因此,将“类型”引入解析器似乎可以解决问题。但是,这不是一个有效的解决方法,因为我希望能够使用不可实例化的类型。
我开始倾向于解析器错误......
我终于找到了一个可行的解决方法;添加一个空样式,以指向要放入附加属性的类型。
添加以下资源可以消除异常。
<Page.Resources>
<Style TargetType="test:AttachedClass"/>
</Page.Resources>
这个解决方案允许我将接口或抽象基类指定为类型,以便进入附加属性。
答案 0 :(得分:0)
我已经尝试了上面“另一个编辑”中定义的解决方法,但效果很好。我会将其作为答案发布,因为它解决了我的问题并且没有发布其他答案。
此问题很可能是由于XAML解析器中的错误导致它无法使用提供的名称解析类型。如果以另一种方式将类型引入解析器,则可以很好地识别它。我用来介绍类型的方法是定义一个空的,未使用的样式,其目标是要在附加属性中存储的类型。
<Page.Resources>
<Style TargetType="test:AttachedClass"/>
</Page.Resources>
这样任何类型都可以存储在属性中。