0

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

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

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

System.Windows.Markup.XamlParseException 发生 Message=Unknown parser error: Scanner 2147500037. [Line: 5 Position: 10]
LineNumber=5 LinePosition=10 StackTrace: at MS.Internal.XcpImports.CreateFromXaml(String xamlString, Boolean createNamescope, Boolean requireDefaultNamespace , Boolean allowEventHandlers, Boolean expandTemplatesDuringParse, Boolean trimDeclaredEncoding) at System.Windows.Markup.XamlReader.Load(String xaml) at 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 工作正常。

有谁知道可能是什么原因造成的,或者如何解决它?

(如果有人想看一个工作示例,请在此处下载代码)

4

1 回答 1

0

好的,想通了(想通了,我的意思是另一个论坛上的某个人给了我答案)。

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

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

于 2012-09-30T08:41:25.143 回答