FC2ブログ

ブログに書く内容とか

  • 仕事(開発)時の覚書的なメモ
  • メインは、C#、WPF、時々WCF
  • ご利用は自己責任でよろしく

スポンサーサイト

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

WPFでくるくる回してみたい(後編)

とりあえず回してみたかった前回。
仕事で使えるか?と聞かれたら、「使えない」と答えるレベルなんだよね。いや「使わない」かなぁ。業務用のアプリでアニメーションは邪魔だし。ま、いいか。
前回の問題として挙げた、「起動してから延々と」という部分に改良を加える。bool値の変化をトリガーとして開始、あるいは終了させてみたい。

続きを読む
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0

WPFでくるくる回してみたい(前編)

長い時間がかかりそうな処理の時は、処理が終わるまで、マウスカーソルを砂時計にしている。がしかし、jQueryとかなら、マウスではなく画面上にくるくる回るアレが表示される。
Waiting Spinnerだっけかな。WPFにはないのか!?と思って調べた。

待ち時間にクルクル回るアレ

2013年かぁ。5年前の記事ですねぇ。でも、かなり作りこまれていて、便利そう。
だが使わない。上の記事でも書いているが、まずは自分で組んでみる事にする。
とりあえず、くるくる回れば良いので、違う方法で。続きを読む
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0

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

実際に使ってみる。
〇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;
}
さて、ビルドが成功したら、実行してみるか
続きを読む
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0

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

コマンドクラスのリメイク(壱)
コマンドクラスのリメイク(弐)
コマンドクラスのリメイク(参)
の続き

・同期型コマンドクラス
短時間で終わる処理に向いている。非同期より構造が簡単なので処理は速い(と思う)。
〇クラス宣言
/// <summary>
/// 同期型コマンド用クラス
/// </summary>
public class DelegateCommand : CommandExBase {

〇実行メソッド
/// <summary>
/// コマンド実行
/// </summary>
/// <param name="parameter">コマンドパラメータ</param>
protected override void ExecuteProtected(object parameter) {
try {
if (!this.NeedSync) {
//Dispatcher.Invokeを使うと、むしろエラーになる時の回避策
this.ExecuteAction(parameter);
} else if (this.Dispatcher.Thread == System.Threading.Thread.CurrentThread) {
this.ExecuteAction(parameter);
} else {
this.Dispatcher.Invoke(this.ExecuteAction, this.Priority, parameter);
}

//先にフラグをOFF
this.NowExecuting = false;
//実行完了後のアクション
this.CompletedExecuteAction?.Invoke(this, null);

} catch (Exception ex) {
//先にフラグをOFF
this.NowExecuting = false;
//実行完了後のアクション
this.CompletedExecuteAction?.Invoke(this, ex);
}

return;
}
CompletedExecuteActionを呼び出す前にNowExecutingをfalseにしないと、CanExecute再評価で困る事になる。続きを読む
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0

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

コマンドクラスのリメイク(壱)
コマンドクラスのリメイク(弐)
の続き。長くなってしまった。
・汎用抽象クラス
 同期、非同期に依存しない共通部分を汎用クラス化。実装が分かれる部分を抽象メソッドとしている。実行処理本体以外は、そんなに違わない。
〇クラス宣言
namespace Tawamuredays.Commands {

using Tawamuredays.Data;

/// <summary>
/// コマンド用 基底クラス
/// </summary>
/// <remarks>
public abstract class CommandExBase : ICommandEx {

汎用クラスのインスタンスを作られても困る(意味ない)ので、abstractにしておく。
〇コンストラクタ
/// <summary>
/// コンストラクタ
/// </summary>
/// <param name="executeAction">実行アクション(必須)</param>
/// <param name="canExcuteAction">実行可否判定アクション</param>
/// <param name="dispatcher">ディスパッチャー</param>
public CommandExBase(Action<object> executeAction,
Func<object, bool> canExcuteAction = null,
Dispatcher dispatcher = null) {
this.ExecuteAction = executeAction;
this.CanExecuteAction = canExcuteAction;
this.Dispatcher = dispatcher ?? System.Windows.Application.Current.Dispatcher;
return;
}
コンストラクタで必須なのは、実行用アクション(executeAction)のみ。executeActionにnullが設定されたら、ArgumentNullExceptionをスローしても良いくらい。
〇要となるプロパティ
以下3つは、コマンドクラスの要であり、コンストラクタ引数を保持する。
/// <summary>実行用アクション</summary>
protected Action<object> ExecuteAction {get; private set;}

/// <summary>実行可否判定用アクション</summary>
protected Func<object, bool> CanExecuteAction {get; private set;}

/// <summary>ディスパッチャー</summary>
protected Dispatcher Dispatcher {get; set;}

Action系のプロパティは、Command内で実行する処理の要。Setterのアクセスを制限して、処理途中で切り替えさせない。
Actionって、イベントみたいに+=でメソッドを追加できるし。Setterをpublicにすると、いろいろ面倒になりそうだったので。
続きを読む
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0

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

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

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

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

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