无效操作异常:此可冻结对象无法冻结

本文关键字:冻结 对象 操作 异常 无效 | 更新日期: 2023-09-27 18:34:31

我正在努力为具有多个窗口的WPF应用程序实现全局快捷键(即应用程序范围的快捷键(。为了实现这一目标,我正在做:

CommandManager.RegisterClassInputBinding(typeof(Window), o); // o is just a keybinding

也就是说,我正在尝试向 Window 类注册键绑定,以便我的快捷键工作,无论哪个窗口处于活动状态。但是我的代码在到达此行时会引发以下异常:

System.InvalidOperationException 未由用户代码处理

消息=此可冻结对象无法冻结。

Source=WindowsBase

堆栈跟踪:

at System.Windows.Freezable.Freeze()
at System.Windows.Input.CommandManager.RegisterClassInputBinding(Type type, InputBinding inputBinding)

以下是键绑定o的创建方式:

KeyBinding o = new KeyBinding() 
{ 
  Command = f, 
  CommandParameter = popup, 
  Key = Key.Q, 
  Modifiers = ModifierKeys.Control 
}; 

popup只是一个 WPF 弹出窗口。 f是实现ICommand接口的类的对象。

我在StackOverflow上查找过类似的问题,它们似乎是由可冻结的对象SolidColorBursh引起的。我认为这不适用于我的情况。有谁知道发生了什么?

无效操作异常:此可冻结对象无法冻结

我今天遇到了这个问题并发现了这个问题。如果满足以下任一条件,则无法冻结可冻结对象(来自下面链接的文档(:

  • 它具有动画或数据绑定属性。
  • 它具有由动态资源设置的属性。
  • 它包含无法冻结的可冻结子对象。

我读到的方式基本上是,如果你绑定到对象的任何属性(在你的例子中是窗口(,或者如果它的任何子属性(或子属性等(有任何数据绑定,它不能被冻结,这使得许多操作变得不可能。

就我而言,我尝试使用EventTrigger在另一个对象的属性上设置值。我将该属性绑定到我的视图模型,因此由于上述原因它失败了。(我试图从视图中偷偷删除一些数据,而没有通过创建附加的 DependencyProperty 来更恰当地做事,这是我最终结束做的事情(。

有关此内容Microsoft文档如下:https://learn.microsoft.com/en-us/dotnet/desktop/wpf/advanced/freezable-objects-overview