私はリストビューアイテムを動的に入力しています。同時に私はプログレスバーを表示したい。データが入力されたら、進行状況バーを無効にする必要があります。これを達成する方法。 私はWPFの新機能です。WPFの異なるスレッドでプログレスバーを実行する方法は?
0
A
答えて
4
WPFを使用しているときにバックグラウンドスレッドの処理を簡略化するBackgroundWorkerクラスを使用できます。 これにはWeb上に多くの例があります。ここでは、2つのCodeProjectのから、それはより多くの例を見つけるのは簡単です:
http://www.codeproject.com/Tips/83317/BackgroundWorker-and-ProgressBar-demo.aspx http://www.codeproject.com/KB/cpp/BackgroundWorker_Threads.aspx
1
私はプレゼンテーションモデルを経由して表示状態を制御することを好みます。ビューは、Workerスレッドを開始し、UI同期コンテキストで進行状況値を更新するプレゼンテーションモデルへのアドレスの項目を設定する必要がある場合。
public class SampleModel : ObservableObject
{
private ObservableCollection<string> _items = new ObservableCollection<string>();
public IEnumerable<string> Items
{
get
{
return this._items;
}
}
private int _progress;
public int Progress
{
get
{
return this._progress;
}
set
{
if (this._progress != value)
{
this._progress = value;
this.OnPropertyChanged("Progress");
}
}
}
public void Fill()
{
this.Progress = 0;
var sc = SynchronizationContext.Current;
new Thread(new ThreadStart(() =>
{
for (int i = 0; i < 100; i++)
{
sc.Post(p =>
{
this._items.Add(i.ToString());
this.Progress ++;
}, null);
Thread.Sleep(100);
}
sc.Post(p =>
{
this.Progress = 0;
}, null);
}))
.Start();
}
}
XAML:
<DockPanel>
<ProgressBar Minimum="0"
Maximum="100"
Height="50"
Value="{Binding Progress}"
DockPanel.Dock="Top">
<ProgressBar.Style>
<Style TargetType="ProgressBar">
<Setter Property="IsEnabled"
Value="True"/>
</Style>
</ProgressBar.Style>
</ProgressBar>
<Button Name="Start"
DockPanel.Dock="Top">Start</Button>
<ListView Name="List"
ItemsSource="{Binding Items}"/>
</DockPanel>
そして、背後にあるコード:
public MainWindow()
{
InitializeComponent();
this.Model = new SampleModel();
this.Start.Click += new RoutedEventHandler(Start_Click);
}
void Start_Click(object sender, RoutedEventArgs e)
{
this.Model.Fill();
}
protected SampleModel Model
{
get
{
return (SampleModel)this.DataContext;
}
set
{
this.DataContext = value;
}
}
関連する問題
- 1. 異なるスレッドでBeginRequestとEndRequestを実行するCassini(VS WebDev)
- 2. 異なるコマンドで2つのタスクを実行する方法
- 3. WPFプログレスバーの使用方法は?
- 4. wpfオフスクリーンイベントを実行する方法
- 5. WPF MVVMでは、UIスレッドでコールバックを実行するバックグラウンドタスクを生成する方法は?
- 6. TextBox WPFで異なる色の線を作る方法は?
- 7. QTの異なるスレッドで実行されているオブジェクトを安全に終了する方法
- 8. WindowStyle = "None"のWPFウィンドウでMinWidth&MinHeightを実行する方法は?
- 9. Javaで異なるジョブを実行する複数のスレッドを実行する正しい方法は何ですか?
- 10. WPFでエイリアスコマンドを実行する方法はありますか?
- 11. WPF GUIスレッドでコードを実行するための好ましい方法は何ですか?
- 12. Android:毎秒スレッドを実行する標準的な方法
- 13. 異なるSQL文を一度に実行する方法
- 14. 2つの異なるアクティビティでプログレスバーの進行状況を共有する方法
- 15. メソッドの実行を表示するプログレスバー
- 16. TIdTCPClientでプログレスバーを実装する方法は?
- 17. Rubyでプログレスバーを実装する方法は?
- 18. 私のiPhoneアプリでバックグラウンド実行スレッドをキャンセルする方法
- 19. Java:異なるスレッドのオブジェクトを比較する方法
- 20. 異なるxvfb画面でselenium serverセッションを実行する方法は?
- 21. 実行時間を切るために異なるスレッドでテストケースを実行する
- 22. 同時に実行するスレッドの数をバインドする方法
- 23. AsyncTaskは2つの異なるスレッドを実行していますか?
- 24. WPF Kinectアプリケーションの実行形式を作成する方法は?
- 25. 毎分スレッドを正しく実行する方法は?
- 26. C#で堅牢なスレッド監視を実装する方法は?
- 27. 'メイン'スレッドでDefaultMessageListenerContainerを実行する方法
- 28. 別のスレッドでWPFでOpenGLエンジンを実行しています
- 29. 異なるスレッドからWindowsフォームコントロールを編集する方法
- 30. 複数のセレンテストを異なるブラウザで同時に実行する方法
しかし、私はバックグラウンドワーカーのコントロールにアクセスする際、その投げる例外は:呼び出し元のスレッドが異なるため、このオブジェクトにアクセスすることはできませんスレッドはそれを所有しています。 – Sandy
progressBarコントロールを更新するには、BackgroundWorkerイベント(ProgressChanged、RunWorkerCompleted)を使用する必要があります。これらのイベントのハンドラー内では、問題なくUIコントロールにアクセスできます。 http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx –