使用XamlReader.Load失败了我实现的TriggerAction,但是使用内置的一个成功

时间:2012-09-28 20:20:17

标签: c# silverlight windows-phone-7 xaml windows-phone-7.1

我的应用程序动态加载XAML - XAML可以来自我的服务器,因此我不能只是实例化一个控件。

我为此使用了XamlReader.Load(),现在已经有一段时间了。

我现在遇到了一些好奇的问题 - 当我尝试反序列化包含对我的触发器的引用的XAML时,读者会抛出一个异常,说它无法解析xaml:

  

System.Windows.Markup.XamlParseException发生Message = Unknown   解析器错误:扫描仪2147500037. [行:5位置:10]
  LineNumber = 5 LinePosition = 10 StackTrace:          在MS.Internal.XcpImports.CreateFromXaml(String xamlString,Boolean createNamescope,Boolean requireDefaultNamespace,Boolean   allowEventHandlers,Boolean expandTemplatesDuringParse,Boolean   trimDeclaredEncoding)          在System.Windows.Markup.XamlReader.Load(String xaml)          在LoadXamlFail.MainPage.myTrigger_Clicked(Object sender,RoutedEventArgs e)

现在,当我尝试反序列化包含对Blend触发器的引用的XAML时,一切正常。这是包含Blend触发器的XAML:

<Grid x:Name="LayoutRoot">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Tap">
            <eim:PlaySoundAction/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Grid>

这是包含我的触发器的XAML:

<Grid x:Name="LayoutRoot">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Tap">
            <local:MyTrigger/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Grid>

我的触发器就像我能做到的那样简单 - 它本质上没有做任何事情:

public class MyTrigger  : TriggerAction<FrameworkElement>
{
    public MyTrigger()
    {
    }

    protected override void Invoke(object parameter)
    {
    }
}

加载XAML的代码(两种情况下的代码相同 - 另一种情况不起作用)如下所示:

using (var stream = App.GetResourceStream(new System.Uri("/LoadXamlFail;component/OtherTriggerControl.xaml", UriKind.Relative)).Stream)
using (var reader = new StreamReader(stream))
{
    var xaml = reader.ReadToEnd();
    xaml = FixXaml(xaml);
    XamlReader.Load(xaml);
}

最后,通过删除支持XAML的控件来加载XAML就可以了。

有没有人知道可能导致这种情况的原因,或者如何解决这个问题?

(如果有人想看一个有效的例子,请下载代码here

1 个答案:

答案 0 :(得分:0)

好的,想通了(通过想出来,我的意思是在另一个论坛上有人给了我答案)。

基本上,在使用XamlReader时,您不能依赖常规XAML的行为,其中位于程序集内的名称空间不需要使用assembly =元素进行修饰。

http://socialeboladev.wordpress.com/2012/09/30/xamlreader-and-xamlparseexception-occurred-messageunknown-parser-error-scanner-2147500037/