본문 바로가기

Silverlight

[삽질방지] ButtonBase의 Space바 클릭


오늘도 또 실버라이트의 치부를 공개하게 되는군요.

어제 저는 원하지도 않는 기능을 실버라이트가 지원하고 있다는 사실을 알게 되었습니다.

바로 SpaceBar Click 입니다. 이것은 ButtonBase를 상속한 모든 객체가 적용됩니다.

실제로 Button에 Focus가 가있는 상태에서만 작동을 해서 문제가 되지 않을 수 있지만 다음에

경우 크게 문제가 됩니다.

Button 클릭으로 어떤 새로운 객체를 띄워야 하는 경우.. 이 경우 만약 버튼이 새로운 객체에 의해

가려진다면 실제 의도상으로는 새로운 객체는 한개만 띄워져야 하지만 SpaceBar를 사용하면 여러번

띄워지는 경우가 생기죠.

  이 경우는 개발자가 부주의 한 탓에 생긴 버그라고 할 수 있죠.. 이런 경우 클릭 이후 Focus를 새로 띄운

객체에게 다시 맞춰줘야겠죠.

  다음의 경우는 버그가 좀더 심각합니다. 간단한 프로젝트를 첨부하니 한번 확인해 보시길 바랍니다.




  테스트 방법은 간단합니다.

Button을 하나 만들고 Click 시 이 버튼의 Visibility 를 Collapsed 시켜줍니다.

그리고 Spacebar를 눌러서 Click 이벤트를 발생시킵니다.


Sys.InvalidOperationException:ManagedRuntimeError error #4004 in control 'Xaml1': System.Exception:COM l1 ”Œ 8œÐ HRESULT E_FAIL $X
http://localhost:61604/ButtonSpaceClickTestWeb/ScriptResource.axd?d=tAAvm8BmByFdAKHmeYf8BNblydHO0228NHDLdU66QIf01HCX-g_tKwK9JPhqOuaxX88rI8w2AeWOzicBqEYveg2&t=2077b8c9
Line 441


  다음과 같은 에러가 발생하는군요...

 이 경우는 명백히 버그로 보이지만 피할 방법은 있습니다.

 이렇게 Button에 Focus가 가있는 상태에서 Visibility를 Collapsed 시켜줄 때는 반드시

Focus를 잃게 만드는 것입니다. 그런데.. Focus를 잃게 만드는 메소드가 없으니 Focus가

가도 상관없는 다른 객체에 Focus가 가도록 설정해두면 됩니다.


  예전에는 Page에서 밖에 KeyEvent를 못받아서 불편하긴 했어도 이런 문제는 없었는데 이제

모든 Control들이 KeyEvent를 받으니 이런 문제가 생기는군요.

   암튼 간단히 결론만 말씀드리자면 다음과 같습니다.
  
Button류들은 사용하지 않을 때 꼭 Focus를 해제 해주어야 한다.

  오늘은 결론이 간단하네요.^^ 그럼 Focus관리 잘하셔서

모두들 삽질 덜하시길..^^

[출처] 실버라이트 네이버 카페