2013-07-17 3 views
1

단일 응용 프로그램에서 여러 인스턴스를 열 수있는 일부 창이 있습니다. 정적 인 사전에서 모두 추적합니다.문제 : 닫힌 이벤트에서 다른 창 활성화

창이 활성화되어있는 경우 escape을 누르면 창이 닫힙니다. 그리고 창이 닫힌 경우 escape 다른 창이 활성화되어 있어야합니다. 사전이 있으면 사전에 저장해야합니다. 나는 또한 현재 윈도우 z- 순서를 고려해야하고 그들의 대부분을 활성화해야하지만 지금은 문제가되지 않는다.

그래서 내가 열어 두었다가 나중에 닫으려고하면 escape을 누르면 어떤 순간에 모든 창 왼쪽이 동시에 닫힙니다. 여기

코드의 예는 다음과 같습니다

내가 찾은 해결책은에 있었다 :

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private int _count; 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      Window1.Run(this, ++_count); 
     } 
    } 

    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
     private static Dictionary<int, Window1> _opened = 
      new Dictionary<int, Window1>(); 

     private int _key; 

     public Window1() 
     { 
      InitializeComponent(); 

      KeyDown += OnKeyDown; 
     } 

     private void OnKeyDown(object sender, KeyEventArgs ea) 
     { 
      if (ea.Key == Key.Escape) 
      { 
       Close(); 
      } 
     } 

     public static void Run(Window owner, int key) 
     { 
      Window1 w = null; 

      if (_opened.TryGetValue(key, out w)) 
      { 
       w.Activate(); 
      } 
      else 
      { 
       w = new Window1{_key = key}; 
       w.Closed += (s, e) => 
        { 
         var win = s as Window1; 

         _opened.Remove(win._key); 
         if (_opened.Count > 0) 
         { 
          _opened.First().Value.Activate(); 
         } 
        }; 
       _opened.Add(key, w); 
       w.Show(); 
      } 
     } 
    } 
} 

업데이트 # 1

감사 Potecaru 튜더에, 그는 또 다른 해결책을 발견 닫기()를 호출 한 후 핸들러에서 e.Handled = true를 설정하십시오

솔루션 코드 : 여기

private void OnKeyDown(object sender, KeyEventArgs ea) 
{ 
    if (ea.Key == Key.Escape) 
    { 
     ea.Handled = true; 
     Close(); 
    } 
} 

업데이트 # 2

그리고는

... 
_opened.Remove(win._key); 
if (_opened.Count > 0) 
{ 
    // i suppose here is the error hidden 
    var w2 = _opened.First().Value; 
    w2.Dispatcher.BeginInvoke(new Action(() => w2.Activate())); 
} 
... 

답변

2

아무 문제없이 문제를 재현하려고했지만 창문이 하나씩 미세하게 닫힙니다. Window.IsActive 속성이 true로 설정된 경우에만 Close() 메서드를 호출 해 볼 수 있습니다.

EDIT 문제를 재현 할 수있었습니다.

은 내가 찾은 해결책은 호출 후에서 KeyDown 처리기 e.Handled = 사실를 설정하는 것이 었습니다 닫기()

나는 문제가 첫 번째가지기 전에 창문이 다른 후 활성 하나가 있다고 가정하자 그래서 그들은 KeyDown 이벤트 발사를 받았습니다. 이상한 일은 당신이 열어 놓고있는 첫 번째 창에 대해서만 내 표본에서 발생합니다. 모두 닫은 후에 다른 사람을 열면 다시 생성되지 않습니다.

+0

내 샘플 프로젝트에서 "ea.Key == Key.Escape && IsActive"키를 사용해 보았는데 도움이되지 않습니다. 모든 창은 동시에 닫습니다. – garek

+0

당신 말이 맞습니다. 더 정확하게 당신은 두번 옳습니다^_ __^ 먼저, "e.Handled = true"가 작업을 수행하는 것으로 보입니다. 둘째로, 그것은 정말로 이상하고 처음 열린 창문에 대해서만 발생합니다. – garek

0

유일한 방법 내가 가진 단지 기록을 위해, 또 다른, 그리 우아한 해결책이다 다음과 같은 창 활성화가 지연되는 것을 발견했습니다 :

... 
    _opened.Remove(win._key); 
    if (_opened.Count > 0) 
    { 
     // i suppose here is the error hidden 
     var w2 = _opened.First().Value; 
     w2.Dispatcher.BeginInvoke(new Action(() => w2.Activate())); 
    } 
    ... 

다른 의견을 보내 주시면 감사하겠습니다. 고맙습니다!