ここ数日間抱えていた問題をうまく説明できるデモを作成しました。
GenerateRandomInt() という名前の単一の public static メソッドを使用して、Data Supplierという名前の単純なクラスを作成しました。これは、時間がかかるプロセスをシミュレートするためのものです。前述のクラスのコードは次のとおりです。
class DataSupplier
{
public static int GenerateRandomInt()
{
Random rnd = new Random();
Thread.Sleep(1000);
return rnd.Next();
}
}
私の MainWindow シンプルには、 stackPanel1 という名前の StackPanel が埋め込まれた ScrollViewer と、button1という名前のボタン (このための XAML を以下に示します) が含まれています。
<Window x:Class="ThreadingDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="40" />
</Grid.RowDefinitions>
<ScrollViewer>
<StackPanel Name="stackPanel1" />
</ScrollViewer>
<Button Grid.Row="1"
Name="button1"
Content="Generate 10 Labels"
Click="button1_Click" />
</Grid>
</Window>
私が達成したいのは、button1をクリックすると、静的なDataSupplier.GetRandomInt()メソッドを使用して乱数を表示する 10 個のラベルが生成されることです。ただし、個別に作成されるとすぐに、それらを 1 つずつ表示したいと考えています。私の MainWindow の分離コードを以下に示します。
public partial class MainWindow : Window
{
private BackgroundWorker worker;
public MainWindow()
{
InitializeComponent();
worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
button1.IsEnabled = true;
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
this.Dispatcher.Invoke((Action)(() =>
{
for (int i = 1; i <= 10; i++)
{
//create a new label, and set it's content to a randomly generated number
Label lbl = new Label();
lbl.Content = DataSupplier.GenerateRandomInt();
//add this label to stackPanel1
stackPanel1.Children.Add(lbl);
}
}));
}
private void button1_Click(object sender, RoutedEventArgs e)
{
button1.IsEnabled = false;
worker.RunWorkerAsync();
}
}
ただし、ランダムに生成された 10 個のラベルすべてが stackPanel1 に追加されるまで、視覚的には何も表示されません。
とにかく、これをプログラムして、各ラベルが作成されるたびに表示されるようにすることはできますか? また、UI の応答性を維持しながら?