c# - 无效操作异常 : This freezable cannot be frozen

标签 c# wpf

<分区>

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

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

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

System.InvalidOperationException was unhandled by user code

Message=This Freezable cannot be frozen.

Source=WindowsBase

堆栈跟踪:

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

这就是键绑定(bind) o 的创建方式:

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

popup 只是一个 wpf 弹出窗口。 f 是实现了 ICommand 接口(interface)的类的对象。

我在 StackOverflow 上查找了类似的问题,它们似乎是由可卡住对象 SolidColorBursh 引起的。我认为这不适用于我的情况。有谁知道这是怎么回事吗?

最佳答案

我今天遇到了这个问题,找到了问题所在。如果满足以下任何条件(来自下面链接的文档),则无法卡住 Freezable 对象:

  • 它具有动画或数据绑定(bind)属性。
  • 它具有由动态资源设置的属性。
  • 它包含无法卡住的 Freezable 子对象。

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

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

关于此的 Microsoft 文档位于:https://learn.microsoft.com/en-us/dotnet/desktop/wpf/advanced/freezable-objects-overview

关于c# - 无效操作异常 : This freezable cannot be frozen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19276977/

相关文章:

c# - 如何启用/禁用按钮?

c# - WPF 在列表框中拖放,带有拖放位置的预览阴影

c# - 使用 DTW 算法跟踪鼠标移动

c# - 在 WPF 的代码隐藏中更改字体样式

c# - 在 Configuration.cs 中播种数据,使用 AddOrUpdate 创建重复数据

wpf - 具有多个 View 的单个 View 模型实例

WPF ListView 设置 SelectedItem

c# - 在 C# 中执行 MD5 并一次下载的有效方法是什么?

c# - 验证服务描述符时出错 'ServiceType: INewsRepository Lifetime: Singleton ImplementationType: NewsRepository' :

c# - wpf-单击按钮时动态创建新文本框和文本 block 并将其添加到网格行