簡體   English   中英

如何控制單獨的WPF應用程序?

[英]How to control a separate WPF application?

我正在開發執行一些冗長任務的Revit插件。 在此過程中,我想顯示一個帶有不確定進度條的簡單WPF窗口,一個用於通知當前過程的標簽以及一個用於中止操作的按鈕。 我已經嘗試了最明顯的方法來實現:在附加組件內創建WPF窗口並顯示它,但是問題是無論我如何實現,UI都被凍結。 在某些過程中,整個Revit UI會凍結/變白,因此我真的不希望我的嵌入式WPF窗口在這些情況下仍能正常工作。

我發現的解決方法是讓WPF窗口作為一個單獨的應用程序(EXE文件),可以從加載項中運行。 我的實現基於此示例 好處是無論Revit發生什么情況,它都不會掛起。 糟糕的是,Windows如何對我單獨的WPF應用程序的調用進行排隊的順序有時與我的加載項中的這些調用順序不同。 有時會導致Revit進程結束但仍顯示WPF窗口的情況(等待顯然已經執行的最終關閉調用,但隨后又被另一個延遲的調用重新激活了應用程序)。

最好,我想以與您可以使用的相同方式來處理WPF應用程序,即從.NET處理Excel應用程序。 您創建一個ExcelApp對象,對其進行所需的處理,最后進行處理。 問題是我不知道如何執行此操作。

  • 如何將WPF應用程序的API公開給我的附加組件?
  • 是否可以同時使WPF應用程序響應並由Revit加載項進行控制? (用戶仍然可以單擊中止按鈕,不確定的進度條不會凍結)

首先要了解的是兩個流程之間的交互。 有一些標准方法:

  • 通過套接字進行交互(套接字編程)
  • 使用命名管道(在消息不太長時間時很有用)

還有一些其他基於上述技術的預定義庫。 使用基於文件系統的方法不是驗證輸出的可靠方法。

這是您解決方案的一部分。 下一步是在WPF應用程序中使用線程 我對Revit並不熟悉,也不知道它是如何工作的。 在長時間運行的過程中,UI凍結是正常的。 因為UI很忙,無法回答您的請求(例如,鼠標移動,單擊等)。 因此,使用線程,您可以將長時間運行的進程放在單獨的位置,並在進程結束時等待響應。

使用線程時出現問題。 因為您離開了UI並在單獨的線程上開始了長期運行的進程,所以您無法直接訪問ProgressBar。 在這種情況下,您必須使用ThreadDispacher 這不是一個可怕的概念,它只是三行代碼,將增加您的調用。 例如:

    Dispatcher.Invoke(() =>
        {
            ProgressBar.Value++;
        });

搜索一個庫以進行IPC(進程間通信)以更快地獲得結果(或者您可以通過自己的方法了解上述技術),然后在WPF應用程序中添加一個簡單線程,從而可以開始,根據情況暫停並恢復正在運行的作業。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM