この質問はMvvmLightとしてタグ付けされているため、ここにMvvmLightToolkitの回答があります。上記のツールキットのMessenger
クラスを使用します。アプリケーションのどこかに次のメッセージクラスを定義するだけです。
public class TakeScreenshotMessage : MessageBase { }
public class ScreenshotTakenMessage : GenericMessage<byte[]>
{
public ScreenshotTakenMessage (byte[]content) : base(content) { }
public ScreenshotTakenMessage (object sender, byte[]content) : base(sender, content) { }
public ScreenshotTakenMessage (object sender, object target, byte[]content) : base(sender, target, content) { }
}
コードビハインドのコンストラクターで、次のようにTakeScreenshotMessageに登録します。
Messenger.Default.Register<TakeScreenshotMessage>(this, (msg) =>
{
byte[] bytes = this.TakeScreenShot(someCanvas);
Messenger.Default.Send(new ScreenshotTakenMessage(bytes));
});
そして、ビューモデルで、次のようにScreenshotTakenMessageに登録します。
Messenger.Default.Register<ScreenshotTakenMessage>(this, (msg) =>
{
byte[] bytes = msg.Content.
//do something with your bytes
});
これで、アプリケーションのどこからでも次のコマンドを呼び出すだけで、いつでもスクリーンショットを撮ることができます(つまり、ビューモデル、ビュー、ヘルパークラスなど)。
Messenger.Default.Send(new TakeScreenshotMessage());