我的应用程序动态加载 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 工作正常。
有谁知道可能是什么原因造成的,或者如何解决它?
(如果有人想看一个工作示例,请在此处下载代码)