2017-05-24 86 views
0

我有一個WPF項目使用大量的資源字典和實體框架連接到本地數據庫。當我在單獨的解決方案中測試項目時,一切工作正常。從Excel中運行WPF應用程序VSTO和Win表格

現在,我試圖將此WPF項目連接到現有的Excel VSTO項目,並通過單擊Excel Ribbon上的按鈕來運行WPF應用程序窗口。 我已經修改App.xaml.cs如下:

public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     base.OnStartup(e); 
     MainWindow view = new MainWindow(); 
     view.Show(); 
    } 
} 

另外,我已經移除的App.xaml中的StartupUri = 「MainWindow.xaml」。在Excel功能區我有應該運行的應用程序的按鈕:

private void button1_Click(object sender, RibbonControlEventArgs e) 
{ 
    App application = new App(); 
    application.Run(); 
} 

現在我有兩個不同的問題:

首先,當我點擊主窗口中的不同部分的按鈕,我得到的例外.xaml像這樣:「在'System.Windows.Baml2006.TypeConverterMarkupExtension'上提供值拋出異常」。很可能缺少與資源的連接。

<ResourceDictionary> 
    <vm:ViewModelLocator x:Key="Locator"/> 
    <ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="Dictionaries\DataGridDictionary.xaml" /> 
    <ResourceDictionary Source="Dictionaries\DarkTheme.xaml" /> 
    <ResourceDictionary Source="Dictionaries\WindowStyle.xaml" /> 
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary> 

我試圖用空的WPF窗口重複相同的過程,它的工作原理,但現在我運行到第二個問題。當我再次點擊按鈕時,我得到異常; 「不能在同一AppDomain中創建多個System.Windows.Application實例。」

我認爲在一個大型項目中,有幾個模塊是正常的,每個模塊都作爲WPF窗口和這些WPF窗口從主應用程序 - Windows窗體或Office功能區。

您能否建議如何解決上述兩個問題? 謝謝!

編輯:我不想使用任務窗格和託管WPF控件。我更喜歡將WPF應用程序作爲獨立於Excel的獨立窗口運行。

+0

你見過[this](https://stackoverflow.com/questions/13419089/launching-wpf-windows-from-an-office-add-in)嗎? –

+0

感謝您的評論。它部分工作,但它不能解決這兩個問題。 – v31

回答

0

我發現了兩個問題的解決方案,但是當我修復第一個問題時,第二個問題不起作用,反之亦然。

首先,VSTO項目應具有對WPFproject.EXE具有的所有庫的引用 - 實體框架和WPF應用程序使用的所有NuGet包。此外,連接字符串也應該複製到Excel App.config中。 Excel項目是獨立於WPFproject.EXE,但它看起來像因爲Excel(或Win窗體應用程序)正在運行該節目,它必須具有所有引用。

當我在應用程序級別上運行WPF項目時,它可以工作,但是當我再次單擊該按鈕時,我得到「無法在同一AppDomain中創建多個System.Windows.Application實例。」。我的目標是每隔一次點擊將WPF窗口置於前面,或者在此期間關閉的情況下再次打開WPF應用程序。

private void button1_Click(object sender, RibbonControlEventArgs e) 
{ 
    var t = new Thread(() => 
    { 
     var app = new App(); 
     App.ResourceAssembly = app.GetType().Assembly; 
     app.InitializeComponent(); 
     System.Windows.Threading.Dispatcher.Run(); 
    }); 

    t.SetApartmentState(ApartmentState.STA); 
    t.Start(); 
} 

我通過調用MainWindow而不是App找到了上述問題的解決方案。它的工作原理,當我測試一個簡單的WPF窗口,但它不會打開我原來的項目:

private void button1_Click(object sender, RibbonControlEventArgs e) 
{ 
    var t = new Thread(() => 
    { 
     MainWindow window = new MainWindow(); 
     window.Closed += (s2, e2) => window.Dispatcher.InvokeShutdown(); 
     window.Show(); 
     System.Windows.Threading.Dispatcher.Run(); 
    }); 

    t.SetApartmentState(ApartmentState.STA); 
    t.Start(); 
} 

這兩種解決方案是由彼得·沙伊德上面提供的鏈接。

這兩種方法有什麼區別?瞭解機制可能會幫助我解決問題。您能否建議我在哪裏可以找到關於此主題的更多信息?

謝謝!