2016-02-10 42 views
1

我有一個MetroWindow。它有Flyout。 Flyout有一個按鈕。按Flyout按鈕時,會顯示一個新的MetroWindow,並且彈出窗口被取消。防止焦點切換到飛出的主窗體IsOpen = false;

什麼發生是:

  1. 用戶在按下彈出按鈕。
  2. 按鈕按鈕打開一個新的非模態窗體並將Flyout的IsOpen設置爲false。
  3. 非模態窗體打開所有內容。
  4. 彈出關閉。
  5. 彈出關閉後,主窗體獲得焦點 - 隱藏非模態窗體。

我希望焦點更改爲主窗體在彈出關閉時不會發生。

我有一個方法可行,但它有點遲緩,因爲它必須等待彈出動畫完成。

有沒有更好的方法?我不想讓新窗口成爲模式或AlwaysOnTop。

private void SearchResultClose(object sender, RoutedEventArgs e) 
    { 
     m_EvtResultClosed.Set(); 
    } 

    private void SearchResultOpenChange(object sender, RoutedEventArgs e) 
    { 
     if (foSearchResult.IsOpen) 
     { 
      m_EvtResultClosed.Reset(); 
     } 
    } 

<controls:Flyout Position="Top" Header="" x:Name="foSearchResult" 
Height="275" ClosingFinished="SearchResultClose" IsOpenChanged="SearchResultOpenChange"> 

private void OpenPersonCard(object sender, RoutedEventArgs e) 
    { 
     var selected_person = SearchPersonResultsVM.View.CurrentItem as Editable<Person>; 

     if (selected_person != null) 
     { 
      var card = new PersonFileWindow(); 
      card.Person = selected_person; 
      foSearchResult.IsOpen = false; 

      // Wait for it to close, and then show the form. 
      Dispatcher.BeginInvoke(new Action(async() => 
      { 
       await Task.Run(() => 
       { 
        m_EvtResultClosed.WaitOne(); 
       }); 
       card.Show(); 
      }), null); 

     } 
    } 

其中

private AutoResetEvent m_EvtResultClosed = new AutoResetEvent(false); 

回答

1

查看功能IsOpenedChanged在MahApps' Flyout.cs,我們看到它在調用焦點()關閉它的animat編輯或不編輯。這也是評論:

// focus the Flyout itself to avoid nasty FocusVisual painting (it's visible until the Flyout is closed) 

但我不知道它是什麼試圖完全解決。

https://github.com/MahApps/MahApps.Metro/blob/1.2.4/MahApps.Metro/Controls/Flyout.cs

最簡單的黑客是增加調焦=「假」您彈出如下:

<controls:Flyout Focusable="False" Position="Top" Header="" x:Name="foSearchResult"Height="275" ClosingFinished="SearchResultClose" IsOpenChanged="SearchResultOpenChange"> 

它工作正常,在這裏,我不能告訴任何討厭FocusVisual畫在源評論。

+0

太棒了!謝謝。 我已經刪除了所有我難看的信號量代碼。 –