【发布时间】:2016-08-17 08:00:06
【问题描述】:
首先我想给出一些问题的背景: 我们有大型遗留 WinForms 应用程序,我们决定将其转移到 WPF。但是从头开始完全重写一个应用程序是不可能的(由于许多原因,包括业务),我们将逐步进行此迁移(一种又一种形式)。所以现在我们需要在 WinForms 应用中使用 WPF 窗口和控件。
今天我迈出了迁移过程的第一步:我在 WPF 上重新创建了一些简单的表单(它变成了一个窗口)。我刚刚在 WPF 上重新创建的新窗口是通过按下其他表单(这是标准的 WindowsForms 表单)上的按钮打开的。 重要提示:我的 Windows 设置为 120 DPI,而不是默认的 96。 在我启动应用程序以查看新窗口的外观之前,一切都很好。
所以,这就是我所看到的: 应用程序正常启动,看起来一如既往。我打开“父”表单并按下按钮打开新的 WPF 窗口。按下按钮 WPF 窗口按预期打开后,但所有可见的应用程序元素(主窗口、“父”表单、按钮、工具栏等),包括新的 WPF 窗口,都增加了它们的大小,它们开始看起来更大了强>。 这还不是全部。当我关闭 WPF 窗口时,规模没有发生任何事情 - 所有应用程序元素仍然很大。然后我关闭了“父”表单,从中打开了 WPF 窗口。这就是神奇之处 - 所有应用程序元素都调整回原来的大小。 然后我再次打开“父”表单和 WPF 窗口 - 但比例没有改变,所有应用程序元素都保持它们的大小。我多次重复“父”表单和 WPF 窗口的“打开-关闭”(在同一应用程序运行期间,我没有重新启动应用程序) - 没有调整元素大小。
在此之后,我进行了一些调查,得出了以下结论: 如果我在主应用程序初始化之前将任何使用 WPF 程序集中任何类型的代码放在 Program.cs 文件中,那么应用程序将始终绘制比以前更大的所有元素,但是在打开 WPF 窗口时不会有比例变化。 Program.cs 文件示例(在我的例子中,它称为 EntryPoint):
internal sealed class EntryPoint
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
try
{
Application.SetCompatibleTextRenderingDefault(false);
Application.EnableVisualStyles();
****System.Windows.Application wpfApp = new System.Windows.Application();****
App.Start(args);
if(App.Context != null)
App.Show();
}
catch(Exception ex)
{
App.ShowError(Properties.Resources.UnexpectedError, ex);
Application.Exit();
}
}
}
我添加了标有 **** 的行(抱歉,无法弄清楚如何在代码 sn-p 中使行加粗)。在几次测试中,我了解到,添加什么代码并不重要——它可以创建新的 System.Windows.Window 对象,即使没有显示它,也可以创建任何其他代码行,它使用 WPF 程序集中的任何类型。
所以,主要问题是:什么会导致所描述的行为?如果有人遇到这个问题,或者有任何想法,如果你能分享你的想法,那就太好了。
感谢您阅读这个不那么简短的问题。
【问题讨论】:
-
如果有人在使用 VB.NET,这个reply to another similar question 可以帮助你