나는 포럼을 이미 수색했지만 아무 질문도 내 문제에 부합하지 않는다고 생각합니다. ...BackgroundWorker_RunWorkerCompleted가 GUI를 업데이트하지 않는 이유는 무엇입니까?
저는 시간이 많이 걸리는 작업을 처리하기 위해 BackgroundWorker를 사용합니다. 이 작업이 끝나면 사용자가 다른 작업을 수행 할 수 있도록 단추를 사용하도록 설정해야합니다.
WPF를 사용 중이며 MVVM 패턴을 따르고 있으므로이 버튼에 직접 액세스 할 수 없습니다. Button enabled-state를 true로 나타내는 Property를 설정하는 BackgroundWorker_RunWorkerCompleted 이벤트 핸들러에서 메서드를 호출해야합니다.
단 한 가지를 제외하고 모두 제대로 작동합니다. 버튼이 예를 들어서 만 다시 그려집니다. 창을 클릭하십시오 (또는 창을 최대화하십시오 ...). 매우 성가신 나에게 하루 종일했다 그게이 문제를 없애 그러나 나는 해결책을 찾을 수 없습니다 ...
BackgroundWorker_RunWorkerCompleted 이벤트 핸들러는 다음과 같습니다
void fileLoadBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
SetButtonToEnabled(); }
어떻게 어떤 생각을 누군가를 가지고 이 문제를 해결하려면?
편집 :
버튼은 명령에 바인딩:
<Button Name="btnLoadTargetFile" Command="{Binding Path=LoadTargetCommand}" .../>
이 명령은 스미스가 자신의 블로그 (http://msdn.microsoft.com/en-us/magazine/dd419663.aspx)에 명시된 바와 같이 RelayCommand를하고 다음과 같습니다
public RelayCommand LoadTargetCommand
{
get
{
if (loadTargetCommand == null)
{
loadTargetCommand = new RelayCommand(param => this.OnRequestLoadFile(BusinessLogic.CustomTypes.TreeType.Target), param => this.CanLoadTarget);
}
return loadTargetCommand;
}
set { loadTargetCommand = value; }
}
this.CanLoadTarget은 SetButtonToEnabled()에 의해 true로 설정됩니다. 방법
편집 2 :
이다음 코드는 '작동'
fileLoadBackgroundWorker.RunWorkerAsync(argumentList);
while(fileLoadBackgroundWorker.IsBusy)
System.Windows.Forms.Application.DoEvents();
SetButtonToEnabled();
하지만 정말 위험하고 추한 코드의 일종입니다 ...
속성을 true로 설정하면 'PropertyChanged' 이벤트가 발생합니다 (즉, viewmodel이'INotifyPropertyChanged'를 올바르게 구현합니까?)? –
fileLoadBackgroundWorker.RunWorkerAsync() 이후에이 메서드를 호출하면 모든 것이 올바르게 작동하므로 문제가 아닌 것 같습니까?! – lakai
호기심에서 벗어나 양식의 모양이나 테두리 (테두리 색 등)에 대한 WMI 수정을 사용하고 있습니까? –