mvvm - 如何使用MVVM模式在ViewModel中的View中调用函数(与UIElements一起使用)

标签 mvvm view viewmodel screenshot mvvm-light

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

byte[] TakeScreenShot(Canvas sourceUiElement)    

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

另一方面,如果我想将此函数移至ViewModel,则需要访问 View 中的该元素,但不引用ViewModel中的View(可能作为参数或Command的内容?)。

最佳答案

由于此问题被标记为MvvmLight,因此这里是MvvmLight工具包的答案。使用所述工具箱的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));
});

然后在您的 View 模型中,像这样注册ScreenshotTakenMessage:
Messenger.Default.Register<ScreenshotTakenMessage>(this, (msg) =>
{
    byte[] bytes = msg.Content.
    //do something with your bytes
});

现在,您可以随时通过在应用程序中的任何位置(即 View 模型, View ,帮助器类等)调用以下命令来随时截屏:
Messenger.Default.Send(new TakeScreenshotMessage());

关于mvvm - 如何使用MVVM模式在ViewModel中的View中调用函数(与UIElements一起使用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12340445/

相关文章:

wpf - 反射(reflect)从一个ViewModel到另一个ViewModel的属性更改

c# - 文件浏览器 TreeView MVVM

swift - 我的drawRect函数不会更新

ios - 切换 View 后, View 中仍然调用方法吗?

java - 在任何 View 上 setText()

wpf - 如何使用MVVM方法实现DataGrid

MVVM - View 模型/模型绑定(bind)

JavaScript - 原型(prototype)函数与 ViewModel 函数?

android - 获取 ViewModel ViewModelProvider.Factory 和应用上下文

c# - Xamarin Forms 和 Prism Navigation 历史记录