在附加属性中指定存储类型的正确方法?

时间:2015-03-19 12:40:46

标签: c# xaml windows-runtime winrt-xaml attached-properties

我已经实现了一个附加属性,保留了一个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>

这个解决方案允许我将接口或抽象基类指定为类型,以便进入附加属性。

1 个答案:

答案 0 :(得分:0)

我已经尝试了上面“另一个编辑”中定义的解决方法,但效果很好。我会将其作为答案发布,因为它解决了我的问题并且没有发布其他答案。

此问题很可能是由于XAML解析器中的错误导致它无法使用提供的名称解析类型。如果以另一种方式将类型引入解析器,则可以很好地识别它。我用来介绍类型的方法是定义一个空的,未使用的样式,其目标是要在附加属性中存储的类型。

<Page.Resources>
    <Style TargetType="test:AttachedClass"/>
</Page.Resources>

这样任何类型都可以存储在属性中。