首先,我想提出一些问题: 我们有大型遗留WinForms应用程序,我们决定转向WPF。但是从头开始完全重写应用程序是不可能的(包括业务在内的很多原因),我们将逐步完成这种迁移(一种接一种形式)。所以现在我们需要在WinForms应用程序中使用WPF窗口和控件。
今天我在迁移过程中迈出了第一步:我在WPF上重新创建了一些简单的表单(它变成了一个Window)。我刚刚在WPF上重新创建的新窗口是通过按下其他窗体上的按钮打开的(这是标准的WindowsForms格式)。 重要提示:我的Windows设置为120 DPI ,而不是默认值96。 一切都很好,直到我启动应用程序才能看到新的窗口。
所以,这就是我所看到的: 应用程序正常启动,并一如既往地看着。我打开“父”窗体并按下按钮打开新的WPF窗口。在按下按钮WPF窗口按预期打开后,但所有可见的应用程序元素(主窗口,“父”窗体,按钮,工具栏等),包括新的WPF窗口,增加了它们的大小,它们开始看起来更大。 并非全部。当我关闭WPF窗口时,没有任何规模发生 - 所有应用程序元素仍然很大。然后我关闭了“父”表单,从中我打开了WPF窗口。这就是魔术 - 所有应用程序元素都重新调整为原始大小。 然后我再次打开“父”窗体和WPF窗口 - 但是缩放没有改变,所有应用程序元素都保持了它们的大小。我多次重复“打开 - 关闭”“父”窗体和WPF窗口(在同一个应用程序运行期间,我没有重新启动应用程序) - 没有重新调整元素大小。
在此之后我做了一些调查,然后来到这里: 如果我在主应用程序初始化之前在Program.cs文件中放置任何使用WPF程序集中的任何类型的代码,那么应用程序将始终绘制比以前更大的所有元素,但是在打开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();
}
}
}
我添加了标有****的行(抱歉,无法弄清楚如何在代码段中使行变粗)。在我理解的几个测试中,我添加的代码并不重要 - 它可以创建新的System.Windows.Window对象,即使没有显示它,也可以使用WPF程序集中任何类型的任何其他代码行。
所以,主要的问题是:什么可能导致描述的行为?如果有人遇到这个问题,或者有任何想法,那么如果你分享你的想法就会很棒。
感谢您阅读这个不那么简短的问题。
答案 0 :(得分:7)
通过向启动项目添加[DisableDpiAwareness]属性解决了问题。 另外,我发现了有关此问题的更多信息:
Mixed WPF and winforms project DPI awareness
DPI Scaling in .Net 3.5 in Mixed WinForms and WPF Application
希望这会对某人有所帮助。