gpt4 book ai didi

c# - MVVM 架构 WPF

转载 作者:太空狗 更新时间:2023-10-30 01:16:13 25 4
gpt4 key购买 nike

我对 WPF 中的 MVVM 有一点架构问题。我有 View,其中包含用于编写一些代码或使用计算机 的相机扫描 QRCode 的选项。如果用户选择不扫码,我可以绑定(bind)Command`,没有问题。

当用户选择扫描二维码时出现问题。当用户按下扫描码时,屏幕的一部分被折叠,相机显示在屏幕上。我必须在后面的 View 代码中执行此操作,所以我在 View 中获取的代码在 MVVM 中并不好。

View 的代码如下所示:

private void Scan_Click(object sender, RoutedEventArgs e)
{
if (_finalVideo.IsRunning)
{
_finalVideo.Stop();
}

_finalVideo = new VideoCaptureDevice(_cameraDevices[CamerasList.SelectedIndex].MonikerString);

_finalVideo.NewFrame += (s, a) =>
{
try
{
System.Drawing.Image img = (Bitmap)a.Frame.Clone();
var ms = new MemoryStream();
img.Save(ms, ImageFormat.Bmp);
ms.Seek(0, SeekOrigin.Begin);
var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = ms;
bitmapImage.EndInit();
bitmapImage.Freeze();
Dispatcher.BeginInvoke(new ThreadStart(() =>
{
CameraStream.Source = bitmapImage;
ReadQrCode(bitmapImage);
}));
}
catch
{
//exc
}
};

_finalVideo.Start();
}

我如何使用 MVVM 解决这个问题?

最佳答案

这很简单,只要您掌握了它并知道“用户控件”和 View 之间的区别。

第一个声明是,理想情况下, View 后面的代码应该是空的。这是真的。

但是,这不适用于用户控件。用户控件可以而且应该有代码隐藏,因为它们需要 self 维持并且没有将它们的逻辑提取到某个 View 模型类中。

那么用户控件和 View 之间有什么区别呢?是的,它们通常都派生于 UserControl,但这不会使 View 默认成为用户控件。重要的是, View 是为一个应用程序制作的非常具体的 UI 片段,非常不可能在其他应用程序中重用。

例如,应用程序 A 中的 CustomerDetailViewCustomerDetailPage 将不同于应用程序 B 的相同 View ,因为应用程序 B 可能对CustomerDetailView

另一侧的用户控件可跨应用程序重用,例如 DatePickerCalendarControlCameraControl。例如,此控件可用于可能需要相机的多个应用程序。

这里重要的是,“用户控件”不知道您的应用程序结构,因此没有 View 模型,没有业务/领域模型等。如果您想让 ViewModels 绑定(bind)到您的用户控件(ICommand 例如用于启动和回调,或将生成的图片绑定(bind)到 ViewModel),然后将依赖属性放入用户控件中。

当您在您的应用程序中使用此用户控件时,您只需将您的 View 模型绑定(bind)到这些依赖属性 (DP) 并获得您的抽象。

长话短说: View 中的代码隐藏是糟糕的,用户控件中的代码隐藏是必要的

关于c# - MVVM 架构 WPF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35982506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com