C# WPF中的设计时事件?

C# WPF中的设计时事件?,c#,wpf,C#,Wpf,我在WPF项目中使用Autofac 在设计某些控件时,我将这些控件的数据上下文设置为特定于设计器的视图模型。然后,该视图模型通过其构造函数注入一些服务 没关系。但我如何管理此项的终身范围?设计阶段结束后,有没有办法连接到事件并处理我的Autofac容器?您在评论中说过: 问题是我的一些服务(例如热键服务)正在使用RegisterHotkey API。对于该服务,当VisualStudio完成呈现我的设计时,将其注销是很重要的 通常,当您的组件处于设计时,甚至不应该首先注册这些组件。Designt

我在WPF项目中使用Autofac

在设计某些控件时,我将这些控件的数据上下文设置为特定于设计器的视图模型。然后,该视图模型通过其构造函数注入一些服务


没关系。但我如何管理此项的终身范围?设计阶段结束后,有没有办法连接到事件并处理我的Autofac容器?

您在评论中说过:


问题是我的一些服务(例如热键服务)正在使用RegisterHotkey API。对于该服务,当VisualStudio完成呈现我的设计时,将其注销是很重要的

通常,当您的组件处于设计时,甚至不应该首先注册这些组件。Designtime if用于预览布局和检查视图模式/状态,而不是真正用于测试(尽管有时非常诱人)

在designtime中,应禁用组件的所有交互。VisualStudio尝试这样做时,您会注意到许多交互事件/触发器不会被调用或传递给组件。然而,它有时会失败得很厉害,比如在弹出窗口(以及下拉列表、组合框等)的情况下,您有时可以强制在设计时实际打开,这会产生非常奇怪/不稳定/不安全的结果

这就是为什么您不应该完全信任VS和设计时模式“只工作”。您可能已经很清楚,编写糟糕的组件可以在设计模式下尝试连接到数据库。这不应该发生。通常

我会说,重构热键,将其注册到某个服务中,并在检测到设计时模式时对其进行存根/置零/禁用

我怀疑它们在designtime中是否有效,但是如果您需要这些热键来打开和关闭VM中的某些开关,或者调用某些行为,请将这些开关或行为绑定到一些新属性,而不是按热键,请在designer中或按designtimedata设置它们以检查效果


仅供参考-我从未为WPF/XAML研究过这一点,但对于WinForms,每个组件都可以附带一个特殊的“设计器”组件。VisualStudio使用该“设计器”组件来准备、制作、渲染、编辑和序列化已编辑的组件。实际上,您可以为自定义控件编写设计器,该设计器可以使用自定义编辑器显示额外的窗口,等等。像DevExpress这样的工具包严重依赖于此。我不确定是否有类似的XAML组件框架。我怀疑这是相同的,但可能有一些类似的概念保留下来。不管怎么说,我不会在你的位置上钻研这件事,不是为了这些事情。除非你真的想开始用你的自定义插件扩展设计器,否则这是不值得的。

你所说的
设计阶段完成是什么意思?基本上,它是在关闭VisualStudio XAML编辑器时完成的,这不会对您造成任何影响,因为此时所有组件都将被释放。加载事件不是您要查找的吗?问题是,我的一些服务(例如热键服务)正在使用
RegisterHotkey
API。对于该服务,重要的是在Visual Studio完成呈现我的设计时将其注销。在DesignTime中,这些服务甚至不应该在开始时注册。Designtime如果用于预览布局和检查视图模式/状态,则不用于测试。在designtime中,应禁用组件的所有交互。重构该部分,并在禁用设计时模式时取消/禁用该部分。如果您需要热键来打开和关闭某些开关,或调用某些行为,请将这些开关或行为绑定到几个新的dependencyproperties,并在designer或designtimedata中设置它们,而不是按热键。无论是否加载服务,请使用GetIsInDesignMode()