C# 在使用MVVM模式时,我应该将与视图紧密连接但规模巨大的方法放在哪里?

C# 在使用MVVM模式时,我应该将与视图紧密连接但规模巨大的方法放在哪里?,c#,mvvm,view,command,viewmodel,C#,Mvvm,View,Command,Viewmodel,继续上一个问题,关于viewmodel的混乱状态上一个问题我有一个新问题。对于一个学校项目,我正在使用MVVM模式在WPF中制作一个图像编辑桌面应用程序。由于所有的编辑选项(裁剪调整大小等),有相当多的命令,它们调用使用GDI+属性和方法以及事件的代码密集型方法。ATM取款机的viewmodel有770行,这让我有点想哭。 像这两种方法(天啊,请记住我四个月前开始编程)应该去哪里 private void ToGrayscale() { 位图模板=CurrentImage.LoadeImage.

继续上一个问题,关于viewmodel的混乱状态上一个问题我有一个新问题。对于一个学校项目,我正在使用MVVM模式在WPF中制作一个图像编辑桌面应用程序。由于所有的编辑选项(裁剪调整大小等),有相当多的命令,它们调用使用GDI+属性和方法以及事件的代码密集型方法。ATM取款机的viewmodel有770行,这让我有点想哭。 像这两种方法(天啊,请记住我四个月前开始编程)应该去哪里

private void ToGrayscale()
{
位图模板=CurrentImage.LoadeImage.ToBitmap();
var绘图=新位图(template.Width、template.Height);
var drawingsurface=Graphics.FromImage(绘图);
var attributes=新的ImageAttributes();
SetColorMatrix(ImageFilters.GrayScaleMatrix);
drawingsurface.DrawImage(模板,新系统。绘图。矩形(0,0,模板。宽度,模板。高度),
0,0,模板。宽度,模板。高度,图形。像素,属性);
drawingsurface.Dispose();
添加快照(图纸“去饱和”);
CurrentImage.LoadeImage=drawing.ToBitmapImage();
UiImageContainer.Source=CurrentImage.LoadeImage;
}
MouseMove上的私有void(对象发送者、MouseEventArgs参数)
{
if(UiImageContainer.IsMouseCaptured&&args.GetPosition(UiImageContainer.X)>0&&
args.GetPosition(UiImageContainer).Y0&&
args.GetPosition(UiImageContainer.X
你的_rubberBand应该成为一个类,rubberBand可能

然后做橡皮筋。把手移动(…)

基本上,将对象移动到不与视图模型耦合的单独方法中,然后将这些方法移动到其他类中。这个过程会让你思考很多你需要如何组织事情。您会发现,当您需要将内容移动到其他类时,这些类需要与视图模型/UI交互。你会想,‘嗯,我不想让他们直接引用我的UI/VM等等’,然后你开始想,也许我需要想出一些我的类可以通过的接口。。。。。然后让我的VM/UI实现这些接口


例如,您可能会在MouseMove上发现,所发生的事情取决于“上下文”,然后您有一个“RubberBandSelection”上下文或类似的内容。然后你会想出一个通用的方法来拥有不同的上下文。

你的_rubberBand应该最终成为一个类,rubberBand可能

然后做橡皮筋。把手移动(…)

基本上,将对象移动到不与视图模型耦合的单独方法中,然后将这些方法移动到其他类中。这个过程会让你思考很多你需要如何组织事情。您会发现,当您需要将内容移动到其他类时,这些类需要与视图模型/UI交互。你会想,‘嗯,我不想让他们直接引用我的UI/VM等等’,然后你开始想,也许我需要想出一些我的类可以通过的接口。。。。。然后让我的VM/UI实现这些接口


例如,您可能会在MouseMove上发现,所发生的事情取决于“上下文”,然后您有一个“RubberBandSelection”上下文或类似的内容。然后你会想出一种通用的方法来创建不同的上下文。

举个例子,你可以这样做

// your original ToGreyscale modified
    private void ToGrayscale()      
    {      
        Bitmap greyscaleImage = ConvertToGreyscale(CurrentImage.LoadedImage.ToBitmap());      
        AddSnapshot(greyscaleImage, "Desaturate");      
        CurrentImage.LoadedImage = greyscaleImage .ToBitmapImage();      
        UiImageContainer.Source = CurrentImage.LoadedImage;      
    }      

// put this in another class
    private Bitmap ConvertToGrayscale(Bitmap originalImage) 
    { 
        var drawing = new Bitmap(originalImage.Width, originalImage.Height); 
        var drawingsurface = Graphics.FromImage(drawing); 
        var attributes = new ImageAttributes(); 
        attributes.SetColorMatrix(ImageFilters.GrayScaleMatrix); 
        drawingsurface.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, originalImage.Width, originalImage.Height), 
                                   0, 0, template.Width, template.Height, GraphicsUnit.Pixel, attributes); 
        drawingsurface.Dispose(); 

       return drawing
                    } 

更“性感”的方法是将ConvertToGreyscale作为位图的扩展方法。

举个例子,您可以这样做

// your original ToGreyscale modified
    private void ToGrayscale()      
    {      
        Bitmap greyscaleImage = ConvertToGreyscale(CurrentImage.LoadedImage.ToBitmap());      
        AddSnapshot(greyscaleImage, "Desaturate");      
        CurrentImage.LoadedImage = greyscaleImage .ToBitmapImage();      
        UiImageContainer.Source = CurrentImage.LoadedImage;      
    }      

// put this in another class
    private Bitmap ConvertToGrayscale(Bitmap originalImage) 
    { 
        var drawing = new Bitmap(originalImage.Width, originalImage.Height); 
        var drawingsurface = Graphics.FromImage(drawing); 
        var attributes = new ImageAttributes(); 
        attributes.SetColorMatrix(ImageFilters.GrayScaleMatrix); 
        drawingsurface.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, originalImage.Width, originalImage.Height), 
                                   0, 0, template.Width, template.Height, GraphicsUnit.Pixel, attributes); 
        drawingsurface.Dispose(); 

       return drawing
                    } 

一种更“性感”的方法是将ConvertToGreyscale作为位图的扩展方法。

如果您有复杂的行为,请考虑如何将其分解为更小的部分(单独的类)

想象一下一座摩天大楼。它是一个巨大的东西吗?或者它是一个较小部件的集合,每个部件都有不同的工作要做(立柱、大梁、窗户等)?也许大梁是由用螺栓连接的梁组成的。任何系统都可以分解成更小的组件,直到每个组件完成一个明确定义的任务

就视图类而言,尝试将UI与它所做的工作分开——例如,ToGreyscale是类中包含的“图像处理功能”的一个很好的例子。其他图像处理功能可以写入类似的类中,所有这些类都派生自相同的基类或接口,