2011-07-07 2 views
1

MVVM-Light EventToCommand 대 InputBindings에서 발생하는 문제를 재현 할 수있는 솔루션을 만들었습니다. 이 문제는 하나의 창이 열리면서 다른 창이 열리 며, InputBinding을 이스케이프 키에 연결하고 두 번째보기를 닫으면 두 번째보기가 닫히고 첫 번째보기로 돌아갑니다. 대신 EventToCommand를 사용하고 수동으로 동일한 명령을 호출하면 두 번째보기가 닫히고 첫 번째보기가 닫힙니다.EventToCommand 대 InputBindings 문제

코드가 없으면 약간보기가 어렵 기 때문에 문제를 재현 할 수있는 테스트 솔루션을 만들었습니다.

단계는 다음과 같습니다 :

작품 등)

한 것으로 두 번째 열려면 버튼을 첫 번째 창을 클릭합니다. 두 번째에

2) Esc 키를 누릅니다 두 번째를 열려면 버튼을 첫 번째 창을 클릭하고 입력 바인딩

1

문제 사례)를 사용합니다.

2) "Hello"텍스트 상자를 클릭하십시오. 3) Esc 키를 눌러 EventToCommand 경로를 사용하고 두 창을 모두 닫으시겠습니까?

Example Solution

답변

1

WPF 이벤트 처리 메커니즘에 단추 처리기가 이벤트 처리기에서 처리되었고 이벤트 체인 위로 버블 링되어서는 안된다는 사실을 알려야합니다. 텍스트 상자가 활성 창 (window2)에서 닫기를 호출하고 이스케이프 처리기가 활성 창 (window2는 이미 텍스트 상자의 이스케이프 처리기로 닫혀 있으므로 window1)에서 close를 호출합니다. 따라서 Close2 함수를 수정하면 다음과 같이 모든 것이 잘 작동합니다.

public void Close2(KeyEventArgs e) 
    { 
     if (e.Key == Key.Escape) 
      Close(); 
     e.Handled = true; 
    } 
+0

물론! WPF가 Windows Eventing 변경 사항을 의미하지는 않기 때문입니다. 감사. – Cheval

0

나는 문제가 있기 때문에 당신이 EventToCommand 리스너의 PreviewKeyDown 이벤트를 후킹 생각합니다. KeyUp 및 KeyPress 이벤트가 시작되기 전에 키가 내려 가고 창을 닫는 것에 반응하고 있다고 생각합니다. 이것은 KeyUp과 KeyPress가 주 윈도우에서 실행될 것이라는 것을 의미하며 닫히면 반응합니다.

샘플의 PreviewKeyPress으로 EventName을 변경했는데 문제가 해결 된 것으로 보입니다. Escape를 누르고 맨 위 창만 닫을 수있었습니다.

+0

실제 코드에서 PreviewKeyUp으로 변경되었으며 작동하는 것처럼 보였습니다. 감사. – Cheval

관련 문제