WPF窗口与windowsForm窗体之间的问题,怎么调用close()

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF窗口与windowsForm窗体之间的问题,怎么调用close()相关的知识,希望对你有一定的参考价值。

如果我做了一个wpf窗口,需要按按钮 show一个windows窗体Form,
然后怎么关闭wpf窗口啊。用this.close() 会整个都关掉。
那怎么样在form里面调用wpf的 this.close()? 只显示Form

常规做法如下:
前提:
1.WPF 窗口有一个按钮btnA,后台对应一个事件btnA_click(参数略)
2.有一个Windows窗体FormB
要求:
1.按下按钮btnA,显示窗口B,同时WPF窗口不显示(或称伪关闭)
2.当窗口B关闭的场合(例如:单击右上角的X),应用程序完全终止。

解决方案:
private void btnA_click(参数略)


// WPF窗口隐藏
this.hide();

// 窗口B以Dialog(有模)的方式打开
FormB form = new FormB();
form.showDialog();

//当窗口B关闭的场合,将会执行下面的代码
this.close();// WPF窗口关闭


以上的代码,只提供了一种解决方案的代码示意图。
参考技术A 如果是main窗口的话,建议隐藏,因为main窗口关闭会关闭整个程序,一般都用this.hide()来隐藏掉,关闭的话,因为form2是它的一个变量,如果主窗口关闭了,你说变量会不会释放?

当我创建 WPF 窗口时,Windows 窗体窗口会更改其大小

【中文标题】当我创建 WPF 窗口时,Windows 窗体窗口会更改其大小【英文标题】:Windows Forms window changes its size when I create a WPF window 【发布时间】:2015-11-21 10:58:39 【问题描述】:

我有一个System.Window.Forms.Form 来处理每个按钮的点击。当我收到第一个事件时,我会创建一个新的 WPF System.Windows.Window 对象。

class WPF_Window : Window




public partial class Form1 : Form

    WPF_Window wnd = null;

    public Form1()
    
        InitializeComponent();
    

    private void Form1_MouseClick(object sender, MouseEventArgs e)
    
        if (wnd == null)
        
            wnd = new WPF_Window();
        
    

在我的计算机上,此代码按预期工作,但如果我在另一台计算机(均为 Windows 10)上运行它,当我单击 Windows 窗体窗口时会更改其大小(减小其尺寸)。

这怎么可能?如何避免这种行为?

【问题讨论】:

两台电脑的 DPI 一样吗? 这与 DPI 有关。当您第一次使用 WPF 中的程序集时,Windows 窗体应用程序会随机调整大小。我的猜测是您需要在清单中声明应用程序不支持 DPI。 @AnkurTripathi 实际上这些计算具有不同的 DPI,将两者都设置为 100% 可以使应用程序正常工作。但是如何在不更改 DPI 的情况下避免这种行为? @ghord 该应用程序是一个 WinForms 应用程序,我在哪里设置它不是 DPI 感知的精确度?怎么样? 你必须根据 DPI 设置每个宽度和高度等我写一些代码给你.. 【参考方案1】:

您发现 WPF 调用 SetProcessDPIAware()。它发生在 PresentationCore 的模块初始化程序中。这在形式上是非法的,必须始终在应用程序创建任何可能缓存 DPI 值的窗口或加载 DLL 之前调用它。或者换句话说,这可能会出错的很多方法,你还只是发现了它的温和版本。在纯 WPF 应用程序中通常不会出现问题,因为在创建任何窗口之前总是需要加载 PresentationCore。

他们确实留下了一个后门来禁用这种行为。复制/粘贴此代码,最好在您的 EXE 项目的 AssemblyInfo.cs 源文件中:

   [assembly: System.Windows.Media.DisableDpiAwareness]

但这当然不是真正的解决方案,DPI 虚拟化现在始终为您的所有窗口启用。通过在其清单中声明您的应用程序 dpi-aware 来取得成功,这样 PresentationCore 就不会搞砸了。但是由于不可避免的副作用,您现在会发现需要修复 Winforms UI。只有当您更改 Form.AutoScaleMode 属性或执行一些不明智的操作(如硬编码窗口大小)时,它才会变小。该属性是 Q&D 修复。

【讨论】:

【参考方案2】:

正如其他回复中所述,这是由于DPI 意识。为使用 VB.NET 的用户关闭它的快速修复:

打开app.manifest

然后取消注释这部分并将DPI感知设置为false

请注意,这可能会导致您的应用程序的字体在更高 DPI 设备上看起来更模糊。

【讨论】:

【参考方案3】:

这些是您可以使用的一些方法。设置窗口的宽高:

public static Graphics graphics = Graphics.FromHwnd(IntPtr.Zero);
public static double GetDIPIndependent(double value, double DPI)

    value = value * (graphics.DpiX / DPI);
    return value;

public static double GetDIPDependent(double value, double DPI)

    value = value * (DPI / graphics.DpiX);
    return value;

public static double GetDIPIndependent(double value)

    value = value * (graphics.DpiX / 96.0);
    return value;


public static double GetDIPDependent(double value)

    value = value * (96.0 / graphics.DpiX);
    return value;

示例:

如果 DPI 独立

this.Width = GetDIPIndependent(this.Width)
this.Height = GetDIPIndependent(this.Height)

如果依赖 DPI

this.Width = GetDIPDependent(this.Width)
this.Height = GetDIPDependent(this.Height)

它对我有用...

【讨论】:

宽高是Form属性吗?我应该什么时候设置它们?一旦启动? 是的,宽度和高度是表单属性..,,,, 并且可以在窗口的加载方法 this.Loaded += Window_Loaded(); 它对我不起作用,无论是使用 GetDIPIndependent 还是 GetDIPDependent... DPI 设置为 150% 的计算机上的窗口仍会自行调整大小。 如果计算机是 100% 并且您想设置宽度 800 而不是看起来像 800 ...但是如果计算机是 150% 您想设置宽度 800 而不是看起来像 512 (DIPDependent) 告诉我您设置宽度和高度的代码,并可以显示图像发生了什么.. 我在 InitializeComponent() 之后设置了宽度和高度(代码与我的问题相同)

以上是关于WPF窗口与windowsForm窗体之间的问题,怎么调用close()的主要内容,如果未能解决你的问题,请参考以下文章

WindowsForm窗体位置

WindowsForm 窗体属性和控件

WPF 窗口位置绑定

WPF 等效于 Application.AddMessageFilter(Windows 窗体)

windform是什么?

适用于 .NET Core 的 Windows 窗体设计器和 WPF 设计器