我正在编写一个将使用 WPF 或 WinForm 运行的应用程序。这个想法是,如果 Windows Presentation Foundation 不在系统上(例如旧服务器),我希望 WPF 故障转移到 Winform。
我不希望将它们“组合”起来,而是将它们与 WinForm 分开设计一个 WPF 表单。
这可能吗?
这没有意义。
如果开发面向 .Net Framework 3.0 或更高版本的 .Net 应用程序,则 WPF 将存在(它是 .Net Framework 的一部分)。
如果您没有安装该版本,则如果它的目标是不存在的框架版本,winforms 应用程序也不会运行。
任何给定的 .Net 应用程序都必须针对特定版本的框架,当然,该特定版本必须存在于它将运行的机器中。
如果您想要一些“回退”机制,您将必须构建同一应用程序的 2 个不同版本,一个针对 .Net 2.0,另一个针对 3.0 或更高版本,它们将是彼此无关的独立应用程序。
澄清:
如果说 .Net Framework 4.0 安装在给定的机器上,那么 WPF 就会安装在该机器上。WPF 是 .Net 框架的一部分,从 .Net 3.0 开始。
您是否打算为您的应用程序安装安装程序?如果是这样,您可以检查系统上安装了哪个版本的 .NET 框架,然后确定要安装哪个版本的应用程序。
为了重用您的一些代码,您可以拥有一个库,您的应用程序的两个版本都可以将其用于与演示无关的业务逻辑。
我认为这在大量工作中是不可能的。通常,如果缺少依赖项,Windows 会在启动时将所有依赖项加载到内存中,您的应用程序将崩溃。可以选择让它延迟加载,但这是一项安静的艰苦工作。
您可以使用用于 Windows 窗体的 dll 和用于 WPF 的第二个 dll 来实现它。您可以在启动和加载时检查系统,而不是当前系统的 GUI。
但是,我建议只编写一个 Windows 窗体 UI。实施每一个思考双重并不是很有效。
我实际上已经实现了一个同时具有 WinForms 和 WPF 用户界面的程序。我首先实现了 WinForms,然后当人们抱怨 WinForms 看起来“太 90 年代”时添加了 WPF。目前,旧 UI 仍可通过“-winforms”命令行选项使用。我使用 MVVM 并严格禁止在视图模型中使用 WPF 类;因此,大部分代码在两个版本之间共享。WinForms 本身并不能很好地支持 MVVM 模式,但我使用了Update Controls框架,它提供了自己独特的 MVVM 方法,作为位于 WinForms 之上的库(并与 WPF 无缝集成)。
然而,你想做的事情是相当具有挑战性的。WPF 附带 .NET 3.5(3.0?),因此您可能需要单独的可执行文件,一个用于 .NET 3.5,一个用于 2.0。(我对此不是 100% 确定的,因为 .NET 3.5 实际上仍然使用相同的 2.0 CLR 二进制文件;所以它可能以某种方式在一个可执行文件中完成。)
但是为什么要这么麻烦呢?现在几乎所有的计算机都安装了 .NET 3.5,没有的计算机可以升级。