我使用的是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/