繁体   English   中英

当可以从 WPF 和 WinForm 应用程序打开相同的对话框时,为对话框设置父级

[英]Set Parent for the dialog box when the same dialog box can be opened from both WPF and WinForm application

我有一个应用程序,它有 2 个模块(一个由 WinForms 制成,另一个由 WPF 制成)。 我在两个模块上都有一个导出按钮。

导出按钮用于将网格导出到 Excel 文件并保存在我的本地。

单击“导出”按钮时,我有一个通用方法(ExportToExcel())将网格导出到 excel。

现在正如我所说,我的应用程序同时使用了 WPF 和 WinForms,现在当用户单击第一个模块(WinForms)上的导出按钮时,导出对话框打开,现在如果用户单击第二个模块(WPF)的导出按钮问题在进行 OLE 调用之前,必须将当前线程设置为单线程单元 (STA) 模式。 确保您的 Main 函数上标记了 STAThreadAttribute。 仅当调试器附加到进程时才会引发此异常。 我已经使用thread.SetApartmentState(ApartmentState.STA)更正了应用线程,如下面的代码所示。

现在使用线程并将 ApartmentState 设置为 STA 后的问题是父级已从“导出”对话框中删除,该对话框应该是单击“导出”按钮并打开对话框的特定模块(第一个或第二个),现在对话框的父级是窗口而不是应用程序模块(第一个或第二个)。

另一个问题是,由于没有为导出对话框设置父级,如果用户多次单击导出按钮,则会打开多个导出对话框,这是不正确的,一旦单击导出按钮并打开对话框,除非用户完成对对话框的操作或将其关闭,否则用户不应再次单击导出框。

我的要求是,对话框的父级应该是打开对话框的一个模块,并且用户在对话框操作完成之前不能对应用程序执行任何操作。

导出按钮单击的代码

public void ExportToExcel(UltraGrid gridToExport, UltraGridExcelExporter ultraGridExcelExporter, string name)
{
    Thread thread = new Thread((ThreadStart)(() =>
    {
     // code to open dialog box and perform operation on it.
    }));
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
}

我不确定你说的是什么,但试试这个:


   //You need to enable (IsMdiContainer)
   //Example, in your WindowsForms set:
   this.IsMdiContainer = true;

   WpfMenu formMenu = new WpfMenu();
   formMenu.MdiParent = this;
   formMenu.Show();

这使得“表单菜单”成为正在执行的表单的子项,我相信它也适用于 WPF

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM