2010-03-15 3 views
4

타사 컨트롤에서 파생 된 Im입니다. ApplicationCommands.SelectAll을 구현 중입니다. 그러나 내가 원하는 행동은 약간 다릅니다. 재정의 할 수있는 가상 메서드가 없습니다. 이렇게하면 클래스 핸들러를 등록 할 때WPF 두 명령 핸들러, 한 명령

 CommandManager.RegisterClassCommandBinding(typeof(MyDerivedControl), new CommandBinding(ApplicationCommands.SelectAll, new ExecutedRoutedEventHandler(OnExecutedSelectAll), new CanExecuteRoutedEventHandler(OnCanExecuteSelectAll))); 

내 메서드가 호출되지 않습니다. 난에서 파생하고있는 타사 컨트롤은 명령 핸들러에

e.Handled=true;

을 표시한다 (나는 소스를 보았다이 원인을 알고,하지만 난 그것을 수정하지 못할)

내가 무엇을 할 수 있습니까? 당신은의 또는 일반 이벤트에 추가하는 대신 미리보기 이벤트를 처리하기 위해 CommandBinding을 등록 할 수 있습니다

1) :

답변

6

당신은 세 가지 옵션이

CommandBinding cb = new CommandBinding(ApplicationCommands.SelectAll); 
cb.PreviewCanExecute += OnCanExecuteSelectAll; 
cb.PreviewExecuted += OnExecutedSelectAll; 

하지만 조심을 - 당신이 경우 CommandBinding을 통해 핸들러를 등록 할 때 PreviewExecuted가 등록되어 있으면 명시 적으로 e.Handled를 false로 설정하더라도 Executed 핸들러가 실행되지 않습니다. PreviewCanExecute/CanExecute 이벤트 쌍에 대해 예상대로 작동합니다. 이것이 CommandBinding 클래스가 구현되는 방식입니다.
기본 클래스 명령 처리기를 실행하지 않으려면 PreviewExecuted를 사용하십시오.

2) 또는 직접 CommandManager의를 통해 명령 핸들러를 등록 할 수 있습니다

CommandManager.AddPreviewCanExecuteHandler(this, OnCanExecuteSelectAll); 
CommandManager.AddPreviewExecutedHandler(this, OnExecutedSelectAll); 

이 그래서 당신은 각 인스턴스에 대해 그것을해야 할 것입니다하지만 클래스 핸들러가 없습니다. 그런 다음 처리기에서 날씨에 관심이있는 명령이 있는지 확인해야합니다 (이벤트 args에 명령에 대한 참조가 있음). 참고 : CommandBinding을 등록해야하지만 CommandManager에 직접 핸들러를 추가하는 경우에는 해당 명령 바인딩에 핸들러를 등록 할 필요가 없습니다.

3) 아니면 해킹 약간의 작업을 수행 할 수 있습니다 (정말 해킹) :

this.AddHandler(CommandManager.CanExecuteEvent, new CanExecuteRoutedEventHandler(OnCanExecuteSelectAll), true); 
this.AddHandler(CommandManager.ExecutedEvent, new ExecutedRoutedEventHandler(OnExecutedSelectAll), true); 

가 이미 처리 된 경우에도 실행됩니다 있도록 명령 이벤트 핸들러를 등록이 방법.
위와 같이 CommandManager 이벤트를 시작하려면 명령 바인딩을 등록해야합니다.
이것은 위의 2 점과 거의 같지만 CommandManager.Add [네 가지 이벤트 중 하나]를 호출 할 때 처리기 - 명령 관리자는 두 개의 인수 버전을 사용하여 컨트롤에서 AddHandler를 호출합니다.