从表单

时间:2016-04-23 18:47:07

标签: c# .net wpf winforms xaml

首先,我想提出一些问题: 我们有大型遗留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程序集中任何类型的任何其他代码行。

所以,主要的问题是:什么可能导致描述的行为?如果有人遇到这个问题,或者有任何想法,那么如果你分享你的想法就会很棒。

感谢您阅读这个不那么简短的问题。

1 个答案:

答案 0 :(得分:7)

通过向启动项目添加[DisableDpiAwareness]属性解决了问题。 另外,我发现了有关此问题的更多信息:

Mixed WPF and winforms project DPI awareness

DPI Scaling in .Net 3.5 in Mixed WinForms and WPF Application

希望这会对某人有所帮助。