3

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

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

也就是说,我正在尝试使用 Window 类注册一个键绑定,以便我的快捷键可以工作,无论哪个窗口处于活动状态。但是我的代码在到达这一行时抛出了以下异常:

System.InvalidOperationException 未被用户代码处理

Message=这个 Freezable 不能被冻结。

源=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 引起的。我认为这不适用于我的情况。有谁知道发生了什么?

4

1 回答 1

0

我今天遇到了这个问题并找到了问题。如果以下任何一项为真(来自下面链接的文档),则无法冻结 Freezable 对象:

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

我读到的方式基本上是,如果您绑定到任何对象的属性(在您的情况下为 Window),或者如果它的任何子属性(或子子属性等)具有任何数据绑定,它可以' t 被冻结,这使得许多操作变得不可能。

在我的例子中,我试图使用 EventTrigger 在另一个对象的属性上设置一个值。我将该属性绑定到我的视图模型,因此由于上述原因它失败了。(我试图通过创建附加的 DependencyProperty 来将一些数据从视图中偷走,但没有做更合适的事情,这就是我最终结束的工作)。

有关此的 Microsoft 文档在这里:https ://docs.microsoft.com/en-us/dotnet/desktop/wpf/advanced/freezable-objects-overview

于 2021-04-03T21:59:53.760 回答