2010-07-07 4 views
7

WPF/MVVM 응용 프로그램에서 코드 길이가 긴 작업 전에 기본보기 커서를 Cursors.Wait으로 설정하고 완료 후 기본 커서로 복원하는 코드 효율적인 방법을 찾으려고합니다.보기 내에서 RoutedCommand의 실행을 차단하는 방법은 무엇입니까? (WPF/MVVM)

모든 작업이 라우팅 된 명령을 사용하여 호출되기 때문에 기본으로 라우팅 된 명령의 인스턴스를 래핑하는 일반 명령 클래스를 생성하여 명령 실행을 차단하는 방법을 찾고 싶습니다. 이것을하는 방법을 시각화하십시오.

특히 RoutedCommand.Execute 메서드는 가상이 아니므로 호출을 가로 채기위한 다른 메커니즘이 필요합니다. 또한 generic 명령 클래스의 인스턴스가 커서를 설정해야하는 뷰를 참조하는 방법을 잘 모르겠습니다.

아무쪼록 부탁드립니다.

감사합니다,

+0

:

Mouse.OverrideCursor = Cursors.Wait; 

작업 후에는이 같은 재정을 취소해야 완료 다소 복잡한 것처럼 들리지만, 단순히 ViewModel에서 CurrentCursor 속성을 만들고 뷰에서 커서를 해당 속성에 바인딩 할 수없는 이유가 무엇입니까? –

+1

@Wonko. 감사합니다. 좋은 질문입니다. MVVM과 가장 유사한 방식 인 것 같습니다. 그러나 커서 관리 코드를 중앙 집중화하기를 원했지만 동일한 2 행 코드 변경을 많은 ViewModel 메서드에 적용해야한다는 것을 의미합니다. 두 번째 복잡한 점은 내 View에 라우트 된 명령을 허용하는 일부 컨트롤이 있다는 것입니다. 그것들은 ViewModel의 일부가 아니기 때문에 같은 로직을 그들의 연산에 어떻게 적용합니까? –

답변

3

당신은 정적 인 방식으로 커서를 설정할 수 있습니다. 효과는 앱이 특정 컨트롤 위에있을 때가 아니라 포커스가있는 동안 커서가 '대기'상태가되는 것입니다. 긴 작업의 시작시 뷰 모델의 일부가 될 것입니다

코드 :이

Move.OverrideCursor = null; 
+0

아이디어에 감사 드리며 +1은 새롭고 유용한 것을 가르쳐주었습니다.하지만 여전히 @Wonko에 대한 제 의견에서 제기 한 문제는 실제로 해결되지 않습니다. –

+0

다른 대안은 ICommand를 직접 구현하는 것입니다. 인기있는 것은 RelayCommand 라 불리며, 어딘가에서 온라인으로 구현할 수 있습니다. 명령에 사용하면 기본 유형의 '실행'처리에서이 커서 처리를 추상화 할 수 있습니다. 내 지식으로는 모든 라우팅 된 명령을 전 세계적으로 가로 챌 수있는 방법이 없습니다. 유일한 단점은 귀하의 명령이 더 이상 '라우트'되지 않는다는 것입니다. 대신 ViewModel에 푸시됩니다. 도움이 되길 바랍니다. – Steven

+0

Steven에게 다시 한 번 감사드립니다. 내가 명령을 내 보내지 않고도 살 수 있는지 생각할 필요가있는 것 같지만 달성하려는 것입니다. 필자는 컨트롤 (예 : RichTextBox를 대상으로하는 ToggleBold 명령)을 대상으로하는 기본 제공 명령의 경우 어떻게 작동하는지 시각화하는 데 어려움을 겪고 있습니다. 이 시나리오를 RelayCommand와 함께 사용할 수있는 방법이 있습니까? –

관련 문제