私はVSTO ExcelツールをC#で書いていますが、私はWPFフォームを使ってデータを表示しています。 WPFフォームは別のプロジェクトにありますが、Excel VSTOプロジェクトと同じソリューションです。 Excelで同じスレッドでWPFフォームを開くと、Excelに何らかの損害が発生し、奇妙なことが起きます。しかし、別のスレッドでWPFフォームを実行すると、すべてが完全に機能します。したがって、以下のコードはOKです。Excel VSTOプロジェクトから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フォームを使用する経験がありますか?
私は、同様のタスクを持っており、それがWPFフォームを表示するための任意のスレッドを使用しなくてもかなりOKだろう。 VSTOアプリでWPFを使って正確に何をしていますか? – PetLahev
私は比較的大きなデータベース(40,000 +レコード)を持っていますので、データのフィルタリングと選択にWPFフォームを使用し、選択したデータをExcel VSTOに送信してカーブフィッティングと分析を行います。ソリューションには、Excel VSTO、WPFデータベースフォーム、Entity Frameworkデータモデル、および異なるスレッドのオブジェクト間の通信を行うためのヘルパーモジュールなど、いくつかのプロジェクトがあります。 – v31