如何在WPF后台代码中设置Interaction交互行为
问题原因与解决方案
崩溃问题的根源
你之前在Notify.cs的Loaded事件中写的代码本身逻辑定位就有问题:
- 你最初的XAML代码中,
RebuildBehavior是附加到Window对象上的,而你在Notify的Loaded事件里调用Interaction.GetBehaviors(this)时,this指代的是Notify控件实例,相当于把行为附加到了错误的宿主对象上。 - 你遇到的
System.Resources.MissingManifestResourceException不是真的缺少资源文件,本质是RebuildBehavior内部限制了宿主必须为Window类型,或者行为内部逻辑不支持附加到Notify控件,底层抛出异常时找不到对应本地化资源字符串才触发了这个报错。
移到Window.Loaded后行为不生效的解决
你迁移后的代码赋值逻辑错误:你的XAML中RebuildBehavior的Element属性绑定的是名为Not的Notify控件,而你后台代码写的是behavior.Element = this;,这里的this是Window实例,和XAML的逻辑不一致,自然不会生效。
正确的后台实现代码
在Window的Loaded事件中编写如下代码即可:
RebuildBehavior behavior = new RebuildBehavior(); // Element属性赋值为Notify控件实例,此处直接用你XAML里定义的x:Name="Not"的控件对象 behavior.Element = this.Not; // 行为附加到Window对象上,和XAML逻辑一致 Interaction.GetBehaviors(this).Add(behavior);
额外排查点
如果修改后还是不生效,可以按以下顺序排查:
- 打断点确认
RebuildBehavior的OnAttached方法被正常触发 - 确认你引用的Interaction类来自
Microsoft.Xaml.Behaviors命名空间,旧的System.Windows.Interactivity在.NET Core/.NET 5+环境下存在兼容性问题 - 如果你是自定义的
RebuildBehavior,确认Element是依赖属性,普通CLR属性赋值后不会触发属性变更回调,行为内部的初始化逻辑不会执行,需要把Element改为依赖属性,或者赋值后手动调用行为的初始化方法。
内容的提问来源于stack exchange,提问作者user16474396
相关产品推荐
相关产品推荐

