2016-07-25 62 views
0

我正在編寫一個更正文本文件中的值的程序。在我的xaml中,我有一個應該報告狀態/進度的文本框。 「等待」=程序啓動前,「處理」=程序正在處理文件,「完成」=文件已被處理。在按鈕上更改文本單擊,然後在運行後再次運行

下面是文本字段和RUN鍵我的XAML代碼:

<TextBox x:Name="statusBox" HorizontalAlignment="Left" Height="23" Margin="130,332,0,0" TextWrapping="Wrap" Text="waiting" VerticalAlignment="Top" Width="120" FontSize="14" TextAlignment="Center" IsReadOnlyCaretVisible="True" > 
<Button Content="Run" 
      Name="Run" 
      HorizontalAlignment="Left" 
      Margin="562,27,0,0" 
      VerticalAlignment="Top" 
      Width="53" 
      Click="Run_Click" 
      RenderTransformOrigin="-0.305,0.487" Height="19"> 
     <Button.BindingGroup> 
      <BindingGroup Name="btnOpen"/> 
     </Button.BindingGroup> 
     <Button.RenderTransform> 
      <TransformGroup> 
       <ScaleTransform/> 
       <SkewTransform/> 
       <RotateTransform Angle="-0.848"/> 
       <TranslateTransform/> 
      </TransformGroup> 
     </Button.RenderTransform> 
    </Button> 

這裏是我遇到的問題:

我已經嘗試了這許多不同的方式。我在下面是最近的嘗試。

//In XAML, the status defaults to "waiting". 
public class Operate 
{ 
public void operations() 
{ 
statusBox.Text = "processing"; 
... Perform Text Operations 
status.Text = "finished"; 
} 
}  

當我運行該程序時,在狀態文本框中看到「正在等待」。但是,當我點擊運行時,程序開始,但文本仍然顯示「正在等待」。然後,程序運行結束後,文本變爲「完成」,而不改變爲「處理」。

任何幫助,非常感謝。我已經編寫了許多控制檯應用程序,但對wpf來說是相對較新的。

謝謝。

+0

我認爲這只是一個錯字,而不是'statusBox.Text'而不是'status.Text'。無論如何,如果你刪除所有內容並保留'statusBox.Text =「處理」;'它會改變嗎? –

+1

要使用更長的操作,您需要使用'ThreadPool'。這裏是一個例子:http://stackoverflow.com/questions/36521365/run-program-after-wpf-windows-form-appears –

+1

真的有一百種方法去做這件事,但最好的將使用ASYNC和捆綁。一旦你學會了如何在WPF/XAML中開始綁定,它將會走很長的路。 –

回答

1

正如其他人所說的問題是,所有代碼都在同一線程上執行。您的操作正在UI線程上運行,這意味着它無法響應您正在嘗試執行的更改等情況。

解決方法是將您的工作轉移到新線程。

(這是假設.NET框架的新版本,支持異步/的await語法)

public class Operate 
{ 
public async void operations() 
{ 
statusBox.Text = "processing"; 

await Task.Run(()=>{ 
//do work here 
}); 

status.Text = "finished"; 
} 
} 

記住,因爲這Task.Run命令在不同的線程執行它不能訪問的UI。如果你需要返回的東西,以顯示在用戶界面上,那麼你可以做到這一點

await Task.Run(mydata=>{ 
//do stuff, with mydata variable 
}); 

:如果你需要有從UI的一些信息,您可以在Task.Run呼叫通過它像這樣

var myReturnValue = await Task.Run(mydata=>{ 
    //do work 
    return myNewReturnData; 
}); 

//can do something with your return data here. 

如果您需要用戶單擊不同按鈕來取消事務的功能,請查看CancellationToken類。

2

當您開始運行時,您的UI將不會更新,直到它結束運行當前線程。 完成該任務後,您的狀態將從處理完成更新得非常快,因此您不會看到更改。 我建議使用後臺工作程序來執行更長的操作,並仍然可以使用UI。

看到這個HOWTO:Use a background worker

相關問題