FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

コマンドクラスのリメイク(伍)

実際に使ってみる。
〇XAML
<Button Content="開始"
Command="{Binding Path=StartCommand}"
/>
<Button Grid.Row="1"
Content="中止"
Command="{Binding Path=CancelCommand}"
/>
かなり省略しているkど、Gridに配置。
〇コードビハインド
-データバインドするために、プロパティを宣言。
/// <summary>
/// 開始コマンドを取得します。
/// </summary>
public CommandExBase StartCommand {
get; private set;
}

/// <summary>
/// 中止コマンドを取得します。
/// </summary>
public CommandExBase CancelCommand {
get; private set;
}

-コンストラクタで、コマンドのインスタンスを生成。
this.StartCommand = new DelegateCommand(
this.ExecuteButtonCommand, this.CanExecuteButtonCommand, this.Dispatcher);
this.StartCommand.PreviewExecuteAction =
(command, _) => {command.RaiseCanExecuteChanged();};
this.StartCommand.CompletedExecuteAction =
(command, _) => {command.RaiseCanExecuteChanged();};

this.CancelCommand = new DelegateCommand(this.ExecuteCancelCommand);

-各コマンド用メソッドを実装
StartCommand用のメソッド
/// <summary>
/// 開始コマンド 実行メソッド
/// </summary>
/// <param name="parameter">コマンドパラメータ</param>
private void ExecuteStartCommand(object parameter) {

this.isCancelled_.Value = false;

this.Dispatcher.Invoke(() => {
MessageBox.Show(this, "開始。");
});

System.Threading.Thread.Sleep(5000);

this.Dispatcher.Invoke(() => {
MessageBox.Show(this, $"終了。IsCancelled = {this.isCancelled_.Value}");
});
}

/// <summary>
/// 開始コマンド 実行可否判定メソッド
/// </summary>
/// <param name="parameter">コマンドパラメータ</param>
/// <returns>true:実行可能</returns>
private bool CanExecuteStartCommand(object parameter) {
return !this.StartCommand.NowExecuting;
}

CancelCommand用メソッド
/// <summary>中止ボタンが押されたかどうか</summary>
private ConcurrentData<bool> isCancelled_ = new ConcurrentData<bool>(false);

/// <summary>
/// 中止コマンド 実行メソッド
/// </summary>
/// <param name="parameter">コマンドパラメータ</param>
private void ExecuteCancelCommand(object parameter) {
this.isCancelled_.Value = true;
}
さて、ビルドが成功したら、実行してみるか
20180809_1.png

処理内容:
・開始ボタンを押すと、メッセージが表示される。
・5秒後、再びメッセージが表示される。
・中止ボタンを押すと、結果が変わるかどうかを確認する。


開始tボタンが押された直後、メッセージが表示される。
20180809_2.png

5秒スリープ後、メッセージが再表示される。
20180809_3.png

中止ボタンを受け付けられたら、メッセージの内容が変わる、はず。
〇同期コマンドを使用した場合
スリープ中、何度中止ボタンを押しても、結果は変わらない。開始コマンドがUIスレッド上で実行中で、かつ実行権を握っているので、ほかの処理(要求)を受け付けないのだろう。
〇非同期コマンドを使用した場合
インスタンス生成部分を書き換える。
this.StartCommand = new AsyncDelegateCommand(
this.ExecuteButtonCommand, this.CanExecuteButtonCommand, this.Dispatcher);

非同期コマンドでスリープ中に中止ボタンを押すと、メッセージの内容が変わる。
20180809_4.png

非同期コマンドの利点はここ。実行中のコマンド以外でも、その処理を受け付けてくれるところだろうか。開始コマンドが、そもそもバックグラウンドで動いているようなものだし。処理の進捗状況を示すプログレスバーとかに使えそう。
まあ、UIに影響を与える処理は、もれなくDispatcher.Invokeを使う必要がある点が、めんどくさいけど。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m

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