我想實現一種方法,通過計算密集型方法將消息傳遞給UI,以便向用戶通知計算的狀態和進度。在執行此操作時,UI應該保持響應,即計算在另一個線程上執行。我已經閱讀了代表,背景工作者等,但是我發現他們非常混亂,並且無法在我的應用程序中實現它們。這裏有一個簡單的應用程序,它與我的應用程序具有相同的總體思路完成計算密集型的方法後,在UI的文本框在這裏更新:從對象更新UI文本框
<Window x:Class="UpdateTxtBox.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="UpdateTxtBox" Height="350" Width="525">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="1*" />
</Grid.ColumnDefinitions>
<Button Content="Start" Height="23" HorizontalAlignment="Left" Margin="94,112,0,0" Name="btnStart" VerticalAlignment="Top" Width="75" Click="btnStart_Click" />
<TextBox Grid.Column="1" HorizontalAlignment="Stretch" Margin="0,0,0,0" Name="txtBox" VerticalAlignment="Stretch" TextWrapping="Wrap" VerticalScrollBarVisibility="Visible" />
</Grid>
namespace UpdateTxtBox
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void btnStart_Click(object sender, RoutedEventArgs e)
{
MyTextProducer txtProducer = new MyTextProducer();
txtProducer.ProduceText();
txtBox.Text = txtProducer.myText;
}
}
}
計算密集型類:
namespace UpdateTxtBox
{
public class MyTextProducer
{
public string myText { get; private set; }
public MyTextProducer()
{
myText = string.Empty;
}
public void ProduceText()
{
string txt;
for (int i = 0; i < 10; i++)
{
txt = string.Format("This is line number {0}", i.ToString());
AddText(txt);
Thread.Sleep(1000);
}
}
private void AddText(string txt)
{
myText += txt + Environment.NewLine;
}
}
}
如何能修改此代碼,以便每次調用AddText方法時都會更新文本框?
我試圖玩弄這個,但無法得到它的工作。如果您可以修改上面的代碼以便它可以使用Dispatcher類,它將會有很大的幫助。 – Elfendahl 2012-07-23 13:53:22
嗨!我很遺憾聽到這個消息。我和Dispatcher(和那篇文章)有同樣的問題。解決方案是實際閱讀整篇文章,而不是僅僅瀏覽「魔法代碼」。如果您想要一個可以工作的剪切和粘貼解決方案,請參閱paul的答案。它由本書完成,並很好地融入到一個合適的WPF應用程序中。 – 2012-07-23 13:56:16