我有用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表单的经验?
答案 0 :(得分:1)
尝试使用其调度程序调用{{1}}的{{1}}方法:
Shutdown()