2011-11-26 4 views
4

포커스가 현재 어디에 있든 관계없이 응용 프로그램 전체에서 사용할 수있는 많은 키보드 바로 가기가 있습니다.UserControl에서 KeyBinding을 정의하지만 전체 창에 적용 할 수 있습니까?

현재 메인 윈도우의 XAML에 <Window.InputBindings>으로 정의 된 것들이 있습니다. 모두 좋지만 ...
리본은 별도의 UserControl으로 캡슐화되어 있으며 모든 바로 가기는 자연스럽게 리본에있는 단추와 관련되어 있습니다.
따라서 두 가지 클래스에 걸쳐 동일한 기능을 처리하는 응용 프로그램 논리의 두 가지 부분을 가지고 있다는 냄새가 정말 좋아하지 않습니다.

이상적으로는 KeyBindings를 <Window.InputBindings>으로 정의하고 UserControl에서는 정의하지 않는 것이 좋습니다. 분명히 XAML 구문을 사용하여이를 수행 할 수는 없지만 <UserControl.InputBindings> - 아아에만 포커스가 리본에있는 경우에만 사용할 수 있습니다 (을 의미하지 않음).

제안 사항?

감사합니다, 알렉스 컨트롤의 또는로드() 이벤트 핸들러의 생성자에서

답변

2

, 그것은 GetType을이 설정되어있는 재귀 때까지 (VisualTreeHelper.GetParent (이 사용)가 서있는 창을 찾을 수 있습니다. ..), 원하는 창에 원하는 InputBinding을 추가하십시오.

+1

안녕 빈센트, 이 제안 해 주셔서 감사합니다. 나는이 라인들을 따라 생각 해왔다 ... 내가 가지고있는 유일한 2 가지 이의 (너무 중요하지는 않지만)는 다음과 같다 : 1. 일반적으로 컨트롤의 캡슐화를 깨뜨린 것처럼 비주얼 트리를 등반하는 것에 대해 의심 스럽다. "외부 세계"에 대해 특정 가정을 할 필요가 있음); 이 특별한 경우에는, 리본이 상주 할 Window가 있다고 가정하는 것이 좋을 수도 있습니다 : 2. 프로그래밍 방식 (코드 숨김)보다는 선언적 솔루션 (즉, XAML)을 선호합니다. ...하지만 우리가 얻을 수있는 가장 좋은 방법은 다음과 같습니다 :-) – Alex

+0

아, 또 다른 의견 : 컨트롤의 생성자에서이를 수행 할 수 없습니다 (메인 윈도우가 완전히 구성되지 않았으므로 하위 컨트롤의 생성자가 라는). 예를 들어, 다음 단계에서 완료해야합니다. OnApplyTemplate에서. – Alex

+0

ok :-) Application.xaml 파일의 응용 프로그램 수준에서 바인딩을 선언 할 수 있는지 궁금합니다. – GameAlchemist