如何在C#中使用ActiveForm屬性在WinForms中引用WPF應用程序的活動窗口?請參閱WPF中的活動窗口?
回答
一種可能的方式是掃描應用程序中打開的窗口的列表,並檢查它們中一個具有IsActive = true
:
Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive);
不知道是否有可能不止一個活動窗口,如果,例如,會出現一個模式對話框,在這種情況下,對話框的所有者和對話框本身可能處於活動狀態。
有更好的方法來使用PInvoke來做到這一點。答案答案不是一直在工作(有一些邊界案例與對話框)。
IntPtr active = GetActiveWindow();
ActiveWindow = Application.Current.Windows.OfType<Window>()
.SingleOrDefault(window => new WindowInteropHelper(window).Handle == active);
一個必須包括以下導入第一:
[DllImport("user32.dll")]
static extern IntPtr GetActiveWindow();
呵呵。我花了幾個小時才發現這一點。我實際上寫了與你完全相同的東西並來這裏分享,但你是第一個,所以這是我的投票:P – 2013-01-15 15:04:53
你能否詳細說明邊緣案例? – nchaud 2013-04-24 15:06:01
@nchaud我使用AvalonDock,它允許您將工作區拖出主窗口並進入新窗口。但是,這些窗口也被標記爲「IsActive」。使用其他解決方案拋出一個異常(如果有多個匹配的謂詞,則拋出SingleOrDefault),或者在使用'FirstOrDefault'時沒有給我實際的活動窗口 – clcto 2014-08-07 21:06:16
我有問題有了這種方式 「Application.Current.Windows.OfType()的SingleOrDefault(X => x.IsActive);」因爲我正在用主窗口構建應用程序,所以在選擇主窗口時遇到了問題。我解決這個問題創造這樣的:
在一些基礎類或App.xaml.cs創建此:
public static Window ActivatedWindow {get;set;}
然後把你的基類派生窗口或全部窗口的激活事件:
第一個選項 - 個人窗口的基類:
public class MetroToolWindowBase
{
public MetroToolWindowBase()
{
Activated += new EventHandler(MakeActive);
}
private void MakeActive(object sender, EventArgs e)
{
App.ActivatedWindow= this;
}
}
第二選項 - 在Windows的激活事件:
private void XWindow_Activated(object sender,EventArgs e)
{
App.ActivatedWindow= this;
}
我知道這是一個有點老的問題,但我認爲我的答案可以幫助某人。
我的問題是這樣的:我有一個WPF MVVM應用程序,我需要在第二個視圖(即第二個視圖模型)中獲得我的MainWindow
實例,以便將標題欄按鈕的可見性設置爲visible
。
這是我的解決方案:
MainWindow window = (MyApp.MainWindow)App.Current.MainWindow;
window.btnSearch.Visibility = System.Windows.Visibility.Visible;
希望這會幫助別人。
- 1. WPF關閉除活動的子窗口和主窗口
- 2. 從窗口中拖動窗口WPF
- 3. wpf窗口未激活
- 4. 確定活動窗口是否爲WPF窗口
- 5. 當我在wpf中關閉窗口時,是否必須取消訂閱活動?
- 6. 請參閱窗口函數中的當前行
- 7. 「請稍等」WPF中的窗口
- 8. WPF滑動窗口
- 9. wpf動態窗口
- 10. 啓動窗口 - WPF
- 11. 如何在iOS中顯示彈出窗口(請參閱圖片)
- 12. 更改WPF中的一個/活動窗口的系統語言
- 13. 多窗口活動 - Jquery的
- 14. 主窗口中的WPF窗口
- 15. 從服務中的活動更改窗口參數
- 16. wpf窗口啓動圖像
- 17. 自動定位窗口 - WPF
- 18. WPF禁用窗口移動
- 19. C#WPF移動窗口
- 20. 僅打印C中的活動窗口#
- 21. PyQt4中的不活動子窗口
- 22. 獲取活動子窗口
- 23. 設置活動窗口
- 24. 窗口不活動警報
- 25. 哪個窗口是活動
- 26. 活動有泄漏窗口
- 27. 活動窗口檢測
- 28. 識別活動窗口c#
- 29. 活動已泄露窗口
- 30. QMainWindow不再活動窗口
再看看我的舊答案,使用'OfType()'操作符而不是'Cast ()'可能更好 - –
2012-06-20 08:00:53
真棒!這使我不必傳遞一個引用到窗口,這使我的數據結構免於UI引用。謝謝! – BrokeMyLegBiking 2013-03-07 22:19:46
爲了使它更健壯,你可以使用'FirstOrDefault'而不是'SingleOrDefault',如果有多個匹配的項目會引發異常。另外它應該快一點,因爲它接受第一個結果,並且不需要檢查它是唯一的結果。 – ygoe 2013-10-25 15:04:01