2

MVVM Light Toolkitを使用していますが、ビューには、スクリーンショットを取得してそのスクリーンショットのバイト配列を返す関数があります。スクリーンショットを撮る(UIElementsを使用する)ので、ViewModelではなくビューに関連しています。

byte[] TakeScreenShot(Canvas sourceUiElement)    

ViewModelで関数の戻り値を取得する必要がありますが、それを行う適切な方法を思い付くことができません。

一方、この関数をViewModelに移動したい場合は、ビュー内のその要素にアクセスする必要がありますが、ViewModel内のビューを参照する必要はありません(引数または何かへの何かとしてCommand?)

4

2 に答える 2

1

この質問は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());
于 2012-09-19T16:19:42.180 に答える
0

TakeScreenShotをボタンのクリックイベントまたはコードビハインドの何かにバインドし、たとえばスナップショットと呼ばれるViewModelのプロパティを持ち、クリックイベントでbyte []配列を取得し、それをViewModelのプロパティに割り当てます。スナップショット、コードビハインドのように。

public void ButtonOnClick(object sender, EventArgs e)
{
    var myViewModel = this.DataContext;
    myViewModel.Snapshot = this.TakeScreenShot(someCanvas);
}

MVVMの厳密さにもよりますが、一部の人は同意しないかもしれませんが、ビューがビューモデルを参照することは完全に有効だと思います。つまり、バインドしているコンテキストを知っている必要がありますが、その逆はできません。手動でバインドするようなものです。

于 2012-09-09T15:56:01.683 に答える