2

我正在使用 MVVM Light Toolkit,在我的视图中,我有一个函数可以截取屏幕截图并返回该屏幕截图的字节数组。由于截图(使用UIElements)与视图而不是 ViewModel 相关。

byte[] TakeScreenShot(Canvas sourceUiElement)    

我需要在 ViewModel 中获取函数的返回值,但我想不出正确的方法。

另一方面,如果我想将此功能移动到我的 ViewModel,我需要访问视图中的该元素,但不引用我的 ViewModel 中的视图(可能作为参数或其他东西Command?)

4

2 回答 2

1

由于这个问题被标记为 MvvmLight,所以这里有一个 MvvmLight Toolkit 答案。使用所述工具包的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 上有一个名为Snapshot的属性,在单击事件中,您将获得 byte[] 数组,将其分配给 ViewModel 的属性Snapshot,就像后面的代码一样。

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

取决于您对 MVVM 的严格程度,有些人可能不同意,我认为您的视图引用您的视图模型是完全有效的,也就是说,无论如何您必须知道要绑定到的上下文,但反之则不然。这就像手动绑定到我一样。

于 2012-09-09T15:56:01.683 回答