げんさん日記

プログラミングで気付いた事等を書きます。

全モデルのベースを作成する。(IDisposable)

2021年05月20日 15時00分10秒 | C#
メモリのリークを最小限にする為、デストラクタを正しく定義し、「BaseModel」を作成して行きます。

クラスの名前をBaseModelにしてIDisposableを継承します。

解放済みを確認するフラグを用意します。
public abstract class BaseModel : IDisposable
{
  protected bool IsDisposed { get; set; }
}

次にデストラクタを定義しDisposeをfaiseで呼び出します。
~BaseModel()
{
  this.Dispose(false);
}

PublicのDisposeを定義します。
public void Dispose()
{
  // DisposeをTrueで呼び出す。
  this.Dispose(true);
  // 自分を解放する。
  GC.SuppressFinalize(this);
}

管理外のオブジェクトを解放する為、ProtectedのDisposeを定義します。
protected virtual void Dispose(bool disposing = true)
{
  // 解放済みなら何もしない
  if (this.IsDisposed == true) return;

  // 管理外のオブジェクトを解放する。
  if (disposing == true)
  {
  }
  this.IsDisposed = true;
}

継承先のモデル例
public Class TestModel : BaseModel
{
  // Disposeをオーバーライド
  protected override void Dispose(bool disposing = true)
  {
   // 解放済みなら何もしない
   if (this.IsDisposed == true) return;

   // 管理外オブジェクトの解放
   if (disposing == true)
   {
    // 自クラスのオブジェクト&イベントの解放
   }

   // ベースの解放を呼び出す。
   base.Dispose(disposing);
  }
}

ViewModelからBehaviorのコマンドを実行する。

2020年08月31日 11時04分23秒 | WPF
ViewModelからコントロールに処理を実行したい場合があります。定義方法を下記に記します。
Behaviorにコマンドを定義します
public static readonly DependencyProperty CreateImageProperty = DependencyProperty.Register("CreateImageCommand", typeof(ICommand), typeof(InkCanvasBehavior), new PropertyMetadata(null));

XamlのコントロールにBehaiviorを定義します。その時のModeを『OneWayToSource』に設定します。
<i:Interaction.Behaviors />
    <beh:InkCanvasBehavior
        CreateImageCommand="{Binding CreateImageCommand,Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}" />

ViewModelからコマンドを実行します
this.CreateImageCommand.Execute(null);

ジェネリックを使用したモデルの保存・リストアを行います。

2019年11月06日 11時06分00秒 | C#
データモデル内にジェネリックが存在する場合に通常のSerialize及びDeserializeではエラーになり正しく処理できない為、データを一度メモリに出力し、その内容をシリアライズする事でジェネリックデータの保存を可能にします。その方法を下記に記します。

オブジェクトを保存する。
public void Save<T>(T saveObject, string fileName)
{
  // データをシリアライズして保存します。
  using (var memoryStream = new MemoryStream())
  {
    var binaryFormatter = new BinaryFormatter();
    binaryFormatter.Serialize(memoryStream, saveObject);
    System.IO.File.WriteAllBytes(fileName, memoryStream.ToArray());
    binaryFormatter = null;
  }
}

オブジェクトをリストアする。
public T Restore(string fileName)
{
  var binaryFormatter = new BinaryFormatter();

  try
  {
    using (var memoryStream = new MemoryStream(System.IO.File.ReadAllBytes(fileName)))
    {
      memoryStream.Seek(0, SeekOrigin.Begin);
      var obj = binaryFormatter.Deserialize(memoryStream);
      return (T)obj;
    }

  }
  finally
  {
    binaryFormatter = null;
  }
}


キャンバス上の位置を取得・設定を行います。

2019年11月06日 10時41分41秒 | WPF
キャンバス上に配置されているオブジェクトの位置を取得したり設定したりする方法を下記に記します。

キャンバス上の位置を取得します。
// キャンパス上のTOP・Leftを取得します。
var top = System.Windows.Controls.Canvas.GetTop(element);
var left = System.Windows.Controls.Canvas.GetLeft(element);

// 取得した内容をポイントに変換して返します。
return new Point(left, top);

キャンバス上の左位置を変更します。
System.Windows.Controls.Canvas.SetLeft(element, positionX);

キャンバス上の上位置を変更します。
System.Windows.Controls.Canvas.SetTop(element, positionY);

マウスの位置を取得する。

2019年11月06日 10時33分12秒 | WPF
指定のコントロール上のマウス位置を取得する方法を下記に記します。

マウスの位置を取得
System.Windows.Input.Mouse.GetPosition(element);
element上のマウス位置が取得できます。