【问题标题】:Are there pitfalls when adding a WPF Window to a Winforms app?将 WPF 窗口添加到 Winforms 应用程序时是否存在陷阱?
【发布时间】:2020-04-27 22:24:52
【问题描述】:

我在我的解决方案中添加了一个 WPF 项目,其中包含一个项目 - 一个 Winforms 项目。然后我从 Winforms 一中引用了 WPF 项目并添加了适当的引用。然后,我在原始 Winforms 项目中创建了一个新的 WPF 窗口,并从按钮事件处理程序中打开它。效果很好。

然而,

过去在搜索类似解决方案时,我不记得提到过这个解决方案(只是向解决方案中添加另一个项目),所以我想知道:将 WPF 窗口添加到 Winforms 应用程序时是否存在陷阱?

编辑

我不是指将其嵌入到表单中。只是一个单独的窗口(可能 而不是 的主窗体)。而且我也不是指明显的挑战,例如需要将位图转换为其 WPF 等效项。我只是指没有注意到的陷阱,应用程序编译并似乎可以运行,但是,例如,稍后在具有不同 DPI 的机器上执行时 - 显示不正确。

【问题讨论】:

  • WinForms 项目变为 DpiAware (SystemAware)。如果它还不是 DpiAware,那就是。除此之外,不多。除非您说 添加 WPF 窗口 您的意思是 嵌入 它。如果是这样,我不知道,我从来没有这样做过。
  • @Jimi 谢谢。 (我的意思不是嵌入。这可能会产生更多问题。)
  • 该评论当然与简单的共存有关。合作/互动可能需要特殊处理,具体取决于角色。 DataBinding 的工作方式不同,ObservableCollection 虽然可以在 WinForms 中使用,但没有来自框架的相同支持,通常使用 BindingList 和 BindingSource,因此如果需要,您可能需要一个代理来启用双向数据绑定。基本图形对象(Image、Bitmap vs. BitmapSource、BitmapImage、WriteableBitmap)虽然易于转换,但并不直接兼容等。
  • 关于 DataBindings,实现 INotifyPropertyChanged 的对象在两个框架中都是兼容的并且功能齐全。当 DataTable 不可用时,BindingSource 类可以很好地处理此类对象。

标签: c# .net wpf winforms


【解决方案1】:

唯一明显的缺陷是 WPF 窗口不会获得任何键盘输入,除非您在 Windows 窗体应用程序中打开它之前调用 ElementHost.EnableModelessKeyboard

Window1 window = new Window1();
System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(window);
window.Show();

【讨论】:

  • 我刚刚在我的测试程序上尝试过,我添加的一个文本框在没有您的代码的情况下接收键盘输入。什么情况下需要该代码?好的,我现在看到,当它使用 Show 而不是 ShowDialog 打开时,它将需要它。
  • @ispiro:是的,它适用于我链接到的文档中所述的无模式打开的窗口。
猜你喜欢
  • 2011-03-09
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多