코드의 문제는 doSomeThing()
방법 UI 스레드에서 실행된다. 따라서 버튼이 제대로 비활성화되지 않았습니다. doSomeThing()
메서드가 다른 스레드에서 실행되도록 코드를 리팩토링하면 정상적으로 작동합니다. 여기에 BackgroundWorker
을 사용하는 간단한 예가 있습니다. 그러나 UI 스레드에서 시간 소모적 인 작업을해서는 안된다는 생각입니다. 리팩토링 된 코드는 다음과 같습니다.
public partial class ButtonEnableTest : Window
{
private BackgroundWorker worker = new BackgroundWorker();
public ButtonEnableTest()
{
InitializeComponent();
this.worker.DoWork += new DoWorkEventHandler(worker_DoWork);
this.worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (this.btn.IsEnabled == false)
{
this.btn.IsEnabled = true;
}
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
doSomeThing();
}
private void doSomeThing()
{
int i = 5;
while (i > 0)
{
Thread.Sleep(TimeSpan.FromMilliseconds(2000));
System.Diagnostics.Debug.WriteLine("Woke up " + i);
i--;
}
}
private void button1_Click(object sender, RoutedEventArgs e)
{
Button btn = (Button) sender;
System.Diagnostics.Debug.WriteLine("at ButtonClick");
if (btn.IsEnabled)
{
btn.IsEnabled = false;
this.worker.RunWorkerAsync();
}
}
}
아이디어를 공유하기 위해 코딩 변환을 수행하지 않았습니다. WPF 버튼을 "btn"으로 명명했습니다.
버튼을 클릭하면 실제로 버튼이 비활성화 된 시각적 모양으로 변경됩니까? 그렇지 않은 경우 귀하의 질문은 [이 질문과 유사 할 것 같습니다] (http://stackoverflow.com/questions/9519295/updatelayout-on-wpf-click/9519860#9519860) – ianschol
예 : 시각적 모양이 사용 중지로 바뀝니다. – HelloWorld