主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

WPF: Buttonを動的にウィンドウに加えていく

                
Add Buttons to WrapPanel or StackPanel dynamically

処理の進行に応じてButtonを加えていく

今回の参考文献:http://msdn.microsoft.com/ja-JP/ms741870


前回:WPFで非同期のスレッド処理でGUIパーツを加える

 今回は前回の記事の改良版。スレッド処理の一つのケースワーク。

 前回の記事ではバックグラウンド処理でボタンを一括して作って、それをStackPanelやWrapPanelなどのコンテナに子要素として加えた。以下のように。
self.Dispatcher.Invoke(Action[list](self.add_buttons), buttons)

def add_buttons(self, buttons):
for button in buttons:
self.WrapPanel.AddChild(button)


でもこれって、実はクールじゃない。なぜかというと、ボタンを一括して作るので、ボタン作成処理がすべて済むまで、作成の済んだボタンのGUIへのレンダー処理が一切行われない。クールにしたければ、作成が終わったボタンからどんどんGUIにレンダー処理がされていくべきだ。ではどうすればそうなるか。Dispatcher処理の終わりにまたDispatcher処理をキューに登録するような処理を書けばいい。たとえば以下のように。
self.buttons = [x for x in range(100)]
self.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Background,
Action[list](self.add_button))

def add_button(self):
button = self.buttons.pop(0)
self.WrapPanel.AddChild(button)
self.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Background,
Action[list](self.add_button))


ここで気にしなければならなくなるのが、Dispatcher処理の優先度。これを適切なものにしなければ、バックグラウンドスレッド終了までGUIレンダリングが行われなかったり、ユーザー入力を受け付けなくなってしまう。MSDNを参照して適切な優先度設定をする。
http://msdn.microsoft.com/ja-jp/library/system.windows.threading.dispatcherpriority.aspx

以下は今回の記事の動作デモ。
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。