从Excel VSTO项目打开WPF应用程序

时间:2017-09-11 20:56:15

标签: c# wpf excel

我有用C#编写的VSTO Excel工具,我使用WPF表单显示一些数据。 WPF表单位于不同的项目中,但与Excel VSTO项目在同一解决方案中。如果我用Excel在同一个线程中打开WPF表单,它会以某种方式损坏Excel并开始做一些奇怪的事情。但是如果我在不同的线程中运行WPF表单,一切都很完美。所以下面的代码应该没问题:

if (app != null)
{
// When click the button again and WPF form is opened already, bring it on top.
    BringDatabaseToFront();
}
else
{
    t = new Thread(() =>
    {
        app = new App(_synchronizationContext, currentCaller);

        App.ResourceAssembly = app.GetType().Assembly;

        app.InitializeComponent();

        app.ShutdownMode = System.Windows.ShutdownMode.OnMainWindowClose;

        /* Makes the thread support message pumping
        * Dispecher is the Context of the WPF DB form  */
        Dispatcher.Run();
    });

    // WPF MUST be on a single-threaded apartment
    t.SetApartmentState(ApartmentState.STA);
    t.Start();
}

当我关闭工具(Excel)时,问题就开始了。它冻结并永远冻结。我已经尝试了许多不同的方式来关闭WPF表单,但唯一可以工作并关闭所有内容的方法是:

public void ShutDownAttempt()
{
    Environment.Exit(0);
}   

这有效,但现在我有另一个问题。如果用户打开了其他几个Excel工作簿,则此代码会在没有任何警告的情况下关闭所有这些工作簿,即使它们具有未保存的数据。所以这很危险。

如果WPF应用程序在主应用程序的另一个线程上运行,那么看起来并不容易。有没有人有从Excel使用WPF表单的经验?

1 个答案:

答案 0 :(得分:1)

尝试使用其调度程序调用{​​{1}}的{​​{1}}方法:

Shutdown()