首页 文章

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

提问于
浏览
1

我有用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 回答

  • 1

    尝试使用其调度程序调用 AppShutdown() 方法:

    app.Dispatcher.Invoke(()=> { app.Shutdown(); });
    

相关问题