단일 응용 프로그램에서 여러 인스턴스를 열 수있는 일부 창이 있습니다. 정적 인 사전에서 모두 추적합니다.문제 : 닫힌 이벤트에서 다른 창 활성화
창이 활성화되어있는 경우 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()));
}
...
내 샘플 프로젝트에서 "ea.Key == Key.Escape && IsActive"키를 사용해 보았는데 도움이되지 않습니다. 모든 창은 동시에 닫습니다. – garek
당신 말이 맞습니다. 더 정확하게 당신은 두번 옳습니다^_ __^ 먼저, "e.Handled = true"가 작업을 수행하는 것으로 보입니다. 둘째로, 그것은 정말로 이상하고 처음 열린 창문에 대해서만 발생합니다. – garek