【问题标题】:Using XamlReader.Load fails with my implemented TriggerAction, but succeeds with built-in one使用 XamlReader.Load 在我实现的 TriggerAction 中失败,但在内置触发器中成功
【发布时间】:2012-09-30 16:41:25
【问题描述】:

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

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

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

System.Windows.Markup.XamlParseException 发生 Message=Unknown 解析器错误:扫描仪 2147500037。[行:5 位置:10]
LineNumber=5 LinePosition=10 StackTrace: 在 MS.Internal.XcpImports.CreateFromXaml(字符串 xamlString,布尔值 createNamescope,布尔值 requireDefaultNamespace,布尔值 allowEventHandlers, Boolean expandTemplatesDuringParse, Boolean trimDeclaredEncoding) 在 System.Windows.Markup.XamlReader.Load(字符串 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

【问题讨论】:

  • 我在访问示例时收到一条错误消息:“您尝试访问的项目已被删除或对您不可用”

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


【解决方案1】:

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

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

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

【讨论】:

  • 缺少命名空间声明... xmlns:local="clr-assembly ..."
  • 是的,但是对于“普通”XAML,即应用程序默认加载的 XAML,您无需为默认命名空间(程序集所在的命名空间)指定命名空间。使用 XamlReader,您可以做到。
猜你喜欢
  • 1970-01-01
  • 2013-06-13
  • 2021-06-04
  • 2021-02-10
  • 2021-08-06
  • 2015-09-26
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
相关资源
最近更新 更多