2010-03-17 4 views
4

우리는 WPF 앱 (실제로 VSTO WPF 앱)을 가지고 있습니다. 특정 컨트롤에는 클릭 할 때 웹 서비스에서 데이터를로드하고 UI를 업데이트하는 여러 요소가 있습니다. 현재 우리는 이러한 웹 요청을 동 기적으로 수행하여 응답이 돌아올 때까지 UI 스레드를 차단합니다. 이렇게하면 데이터가로드되는 동안 사용자가 앱을 클릭하지 못하며 잠재적으로 데이터를 반환 할 때 데이터를 처리 할 수없는 상태가됩니다.WPF에서 비동기 작업 중 UI를 차단하는 방법

물론 요청이 오랜 시간이 걸릴 경우 앱이 응답하지 않게됩니다. 이상적으로는이 시간 동안 취소 버튼을 활성화하고 싶지만 다른 것은 없습니다. 이 작업을 수행하는 영리한 방법이 있습니까? 아니면 백그라운드 작업자를 사용하여 비동기 적으로 실행되도록 요청을 전환하고 요청이 진행되는 동안 취소 버튼을 제외한 모든 컨트롤을 사용할 수 없도록 설정해야합니까?

편집 : 우리는 이미 장시간 실행 (파일 다운로드 등) 할 것으로 예상되는 작업에 대해 진행 대화 상자 창이 나타납니다. 사건은 꽤 빨리 (최대 2 초) 행동을 기대하지만 때로는 더 오래 걸릴 수도 있습니다. 이러한 상황에서 잠시 동안 전체 창을 깜박 거리는 것은 너무 산만합니다.

답변

4

클릭 가능한 컨트롤은 명령에 바인딩되어야하고 명령에 CanBeExecuted은 백그라운드 작업이 진행 중일 때 false를 반환해야합니다. 이렇게하면 해당 명령에 바인드 된 컨트롤이 자동으로 비활성화되고 활성화됩니다.

background-task-in-progress 검사를 구현하는 명령 클래스를 만든 다음이 클래스의 모든 명령 (물론 cancel 명령 제외)을 파생 시킴으로서 많은 코드를 복사하는 것을 피할 수 있습니다.

1

별도의 스레드에서 비동기 요청을하는 동안 취소 단추 (및 진행률 표시 줄 또는 다른 활동 표시기)가있는 모달 대화 상자를 표시하십시오.

그런 식으로 사용자는 기본 UI와 상호 작용할 수 없으며 사용자는 여전히 어떤 일이 일어나고 있다는 의견과 취소 할 수있는 기능을 얻을 수 있습니다.

+0

SRY, 편집 – mcintyre321

0

"취소"를 제외한 모든 컨트롤을 사용 중지하는 것 이외의 다른 방법은 생각할 수 없습니다.

그렇다면 취소 버튼만으로 작업중인 진행 대화 상자를 표시하면 더 나은 사용자 경험을 얻을 수 있습니다.

이 dailog를 사용하여 웹 요청 진행 상황 및 다시 올 수있는 오류 메시지에 대한 유용한 정보를 표시 할 수 있습니다.

1

응답을 기다리는 동안 액세스 할 수없는 UI 부분에 반투명 캔버스를 놓는 것이 한 가지 방법이며, 가운데에는 취소 버튼이있는 메시지를 넣는 것이 좋습니다.

+0

는 요청이 시작되기 전에이 버튼이 이미 표시 취소 볼 수 있지만, 나는 우리가 그것을 그것은 가능하다 높은 Z- 인덱스 – mcintyre321

+0

을 줄 수있는 것 같아요 하나 이상의 버튼이 같은 명령에 묶여 있어야합니다. –

+0

확실한 - 나는 2 개의 동일한 취소 버튼을 다른 하나의 위에 앉는 것과 함께 만들지 않고 그것을하는 방법에 관해 단지 생각하고 있었다 – mcintyre321

1

Silverlight Toolkit에는 BusyIndicator 컨트롤이 있습니다. 툴킷은 오픈 소스이므로 쉽게 WPF로 포팅 할 수 있습니다.

코드에서 IsBusy 속성을 true로 설정하거나 모델에 바인딩 할 때 할당 된 영역의 모든 항목을 비활성화하고 회색으로 만듭니다. 사용법은 다음 : 내 질문을 명확히해야

<ctl:BusyIndicator> 
    <StackPanel x:Name="myDataArea"> 
     <Button Content="Load Data" /> 
     <DataGrid x:Name="myDataGrid" /> 
    </StackPanel> 
</ctl:BusyIndicator>