WPF使用XamlReader加载DataTemplate时Interaction.Triggers报错如何解决
报错根因
XamlReader.Load/Parse方法动态解析XAML时,不会自动继承当前项目的程序集引用和命名空间映射规则,找不到Microsoft.Xaml.Behaviors.Wpf包中对应的Interaction.Triggers类型定义,所以抛出解析异常。
可行解决方法
方法1:拼接XAML字符串时补充完整命名空间的程序集绑定信息
不要只写缩写版的行为命名空间,需要明确指定命名空间对应的程序集名称,示例XAML结构如下:<DataTemplate xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:i="clr-namespace:Microsoft.Xaml.Behaviors;assembly=Microsoft.Xaml.Behaviors.Wpf"> <!-- 你的Header内容 --> <TextBlock Text="自定义列标题"> <i:Interaction.Triggers> <!-- 你的触发器逻辑 --> </i:Interaction.Triggers> </TextBlock> </DataTemplate>如果你用的是旧版Interactivity包,对应命名空间改为:
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"方法2:提前加载行为程序集到当前应用域
调用XamlReader之前手动加载目标程序集,避免解析时找不到程序集:// 针对Microsoft.Xaml.Behaviors.Wpf 1.1.39版本 System.Reflection.Assembly.Load("Microsoft.Xaml.Behaviors.Wpf, Version=1.1.39.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"); // 拼接XAML后解析 string xamlContent = "你的完整XAML字符串"; DataTemplate headerTemplate = (DataTemplate)System.Windows.Markup.XamlReader.Parse(xamlContent);方法3:规避动态XAML拼接逻辑
直接在项目的资源字典中预先定义好需要的HeaderTemplate,用x:Key标记,后台直接通过FindResource("模板Key")获取使用,完全避开动态XAML解析的兼容性问题,稳定性最高。
内容的提问来源于stack exchange,提问作者Manu
相关产品推荐
相关产品推荐

