スポンサーサイト

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

画面の起動はビューの仕事らしい(弐)

画面の起動はビューの仕事らしい(壱)の続き。
依存関係プロパティを実装する。
/// <summary>Windowタイプ</summary>
public static readonly DependencyProperty WindowTypeProperty =
DependencyProperty.Register("WindowType", typeof(Type),
typeof(StartWindowAction),
new FrameworkPropertyMetadata(null,
OnCanStartWindowPropertiesChanged));

/// <summary>
/// Windowタイプを取得|設定します。
/// </summary>
public Type WindowType {
get { return (Type)GetValue(WindowTypeProperty); }
set { SetValue(WindowTypeProperty, value); }
}

/// <summary>モーダル起動させるかどうか</summary>
public static readonly DependencyProperty IsModalProperty =
DependencyProperty.Register("IsModal",
typeof(bool),
typeof(StartWindowAction),
new FrameworkPropertyMetadata(true));
/// <summary>
/// モーダル起動させるかどうかを取得|設定します。
/// </summary>
public bool IsModal {
get { return (bool)GetValue(IsModalProperty); }
set { SetValue(IsModalProperty, value); }
}

両方のプロパティの役割は名前そのまま。WindowTypeプロパティの方は、設定の有無で実行可否が変わるので、OnCanStartWindowPropertiesChangedメソッドでコマンドの実行可否を再評価させる。
/// <summary>
/// CanStartWindowプロパティ値変更イベント用メソッド
/// </summary>
/// <param name="dpObj">対象オブジェクト</param>
/// <param name="e">イベントデータ</param>
private static void OnCanStartWindowPropertiesChanged(
DependencyObject dpObj,
DependencyPropertyChangedEventArgs e) {

var action = dpObj as StartWindowAction;

if (action == null || action.IsDesignMode()) {
return;
}

//実行可否判定の再評価を通知します。
//値ではなく、値の変更がトリガーになります。
if (this.canExecuteChangedHandler_ != null) {
this.canExecuteChangedHandler_(this, System.EventArgs.Empty);
}
return;
}
次に、ICommandインターフェースを実装する。
/// <summary>コマンド実行可否判定変更イベント用ハンドラ</summary>
private System.EventHandler canExecuteChangedHandler_;

/// <summary>
/// コマンド実行可否判定変更イベント用ハンドラ
/// </summary>
public event System.EventHandler CanExecuteChanged {
add {this.canExecuteChangedHandler_ += value;}
remove {this.canExecuteChangedHandler_ -= value;}
}


/// <summary>
/// 当コマンドを実行します。(Windowを起動します)
/// </summary>
/// <param name="parameter">コマンドパラメータ</param>
public void Execute(object parameter) {
var startWindow = (Window)System.Activator.CreateInstance(this.WindowType);
WindowBehavior.SetIsModal(startWindow, this.IsModal);

if (this.IsModal) {
startWindow.ShowDialog();
} else {
startWindow.Show();
}

return;
}

/// <summary>
/// 当コマンドを実行できるかどうかを判定します。
/// </summary>
/// <param name="parameter">コマンドパラメータ</param>
/// <returns>true:実行可能</returns>
public bool CanExecute(object parameter) {

if (this.WindowType == null ||
!typeof(Window).IsAssignableFrom(this.WindowType)) {
//未設定だったり、Window継承クラスじゃなかったり。
return false;
}

return true;
}
 XAMLはこうなる。
<tw:StartWindowAction x:Name="ShowWindow2"
WindowType="{x:Type local:Window2}"
IsModal="True"
/>
この実装でも起動だけならできる。そう、起動だけなら。
続く。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


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

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

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

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

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