2013-05-21 31 views
3

在Windows 7中,.NET 4.0我有一個可以通過複製下面的代碼,Visual Studio生成一個空白WPF應用再現了一個問題:ALT-TAB總是激活主窗口中的WPF應用程序與多個擁有的窗口

public MainWindow() 
    { 
     InitializeComponent(); 
     Loaded += new RoutedEventHandler(MainWindow_Loaded); 
    } 

    void MainWindow_Loaded(object sender, RoutedEventArgs e) 
    { 
     new Window() { Title = "Test", ShowInTaskbar = false, Owner = this }.Show(); 
    } 
  1. 運行的應用程序
  2. 激活二級窗口
  3. 使用Alt-Tab到其他正在運行的應用
  4. 使用鼠標來激活我們的WPF應用程序在任務欄

現在,WPF應用程序再次處於活動狀態,同時激活了輔助窗口並關閉了主窗口,這是預期的(和期望的)行爲。

現在做到這一點,而不是(僅第4步不同):

  1. 運行的應用程序
  2. 激活二級窗口
  3. 使用Alt-Tab到其他正在運行的應用程序
  4. 的Alt-Tab切換回我們的WPF應用程序

WPF應用程序再次處於活動狀態,但現在主窗口已激活。 將此代碼添加

private void Application_Activated(object sender, EventArgs e) 
{ 
    Windows[1].Activate(); 
} 

到App.xaml.cs因爲現在在第二種情況下這兩個窗口被激活並不能解決問題。另外,單擊輔助窗口不會禁用主窗口。我必須再次單擊(已激活)主窗口和輔助窗口才能實現此目的。

我該如何避免這種情況(只有輔助窗口在兩種情況下都應該是有效的)?

+0

你需要主窗口被激活(即使聚焦的)?如果不是,那麼'ShowDialog()'而不是'Show()'應該適合你。 – icebat

+0

是的,主窗口必須是獨立的。這只是一個最簡單的例子來說明問題,它將是一個更大的應用程序。這只是我想消除的奇怪行爲。想象一下像Visual Studio這樣的東西 - 如果我將文檔浮出主窗口,然後按Alt-Tab兩次,只有浮動窗口仍然被激活,而不是主窗口。如果主窗口處於活動狀態,即使不應該出現問題,我也會正確處理輸入問題。 – Golvellius

回答

1

CodeProject實際上解決了這個問題here,希望這是你在找什麼。

post from Tamil Khason相結合,理論上講,您可以覆蓋全局級別上的OnFocus事件,以便每次窗口焦點時,該窗口將成爲「主窗口」,然後將成爲ALT + TAB的目標。

+0

不幸的是,我不能將它應用於我的案例,因爲他在談論ShowDialog()。但是,我發現了一個解決方法:如果我激活第二個窗口,而不是Application_Activated,而是響應MainWindow_Activated,則獲得所需的行爲。我之前沒有嘗試過,我覺得有點愚蠢 - 當然,我必須確保這種激活只發生在響應之前的應用程序激活之前,因此跟蹤當前活動窗口非常重要。感謝您的回覆。 – Golvellius

0

基於THIS解決方案下面的代碼也許可以(未測試噴射)也做的伎倆

protected override void OnStartup(StartupEventArgs e) 
      { 
       EventManager.RegisterClassHandler(typeof(Window), Window.LoadedEvent, new RoutedEventHandler(WindowLoaded)); 

       base.OnStartup(e); 
      } 

    void WindowLoaded(object sender, RoutedEventArgs e) 
      { 
       Window w = sender as Window; 
       if (w != null) 
       { 
        // this part works in my case very well 
        w.Owner =Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive); 
       } 
      }