代码背后的Vs. MVVM C#WPF应用程序 [英] Code behind Vs. MVVM C# WPF App

查看:103
本文介绍了代码背后的Vs. MVVM C#WPF应用程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用WPF编写截图应用程序 - 我已经就如何设置MVVM发布了一个问题,但我得到的答案并没有真正帮助我。我确实理解MVVM的基础知识,但不了解如何为我特定的
案例实际设置它。大多数使用MVVM的应用程序都使用实际数据 - 但它们通常是人物项目,客户或商品等东西。但是,对于我的特殊情况,我正在使用图像。我的应用程序非常像一个带标签的
绘画应用程序,在按钮点击时添加图像(截图,即)。当您单击其中一个屏幕截图按钮时,屏幕截图会添加到一个tabitem中,在ScreenshotTAb内(这是我创建的具有scrollviewer的用户控件,以及一个画布
,以便您可以在图像上绘制形状并保存它)。因此,这些事件与screenshottab usercontrol相关联,但它们在代码隐藏中。我已经创建了一个带有类来处理某些逻辑的简单库,并且我使这个逻辑可以重复使用
不同的UI技术,但我知道像截图工具这样的东西不能真正重用于不同的UI工具包例如,WPF中的截图与Winforms中的截图不同。因此,我不想问一个关于如何为此设置MVVM
的问题,我想问的是 - MVVM是否适用于这种应用程序?除了MVVM的基本定义之外我什么都不懂,我在上一个问题中没有说明这一点,所以这就是为什么我又回来了。 这是应用程序
的样子,以便更好地了解我正在谈论的内容(它不会让我粘贴图片,所以我粘贴了一个链接):

I'm working on a screenshot application using WPF -- I posted a question already on this on how to set up MVVM but the answer I was given didn't really help me. I do understand the very very basics of MVVM, but not how to actually set it up for my particular case. Most applications that use MVVM work with actual data--but they're usually things like people items, or customers, or merchandise, something of that sort. For my particular case use, however, I'm working with images. My app is pretty much like a tabbed paint app, where an image gets added on button click (a screenshot, that is). When you click one of the screenshot buttons, a screenshot gets added into a tabitem, inside a ScreenshotTAb (which is a usercontrol I created which has a scrollviewer, and a canvas so that you can draw shapes onto the image and save it). So those events are hooked up the screenshottab usercontrol, but they're in the code-behind. I have created a simple library with a class to handle some of the logic, and I made that logic reusable for different UI technologies, but I know that something like a screenshot tool isn't really reusable for different UI toolkits since screenshot taking isn't the same in WPF as it is in Winforms, for example. So rather than ask a question on how to set up MVVM for this, what I want to ask is this--is MVVM appropriate for this kind of application? I don't understand anything beyond the basic definition of MVVM, something I didn't clarify in my last question, so that's why I'm back again.  Here's what the application looks like to get a better idea of what I'm talking about (it won't let me paste a picture so I pasted a link):

https://drive.google.com/file/d/1tUPzkAdYhXrzOmDyx1Zim31O4-ZPmTZU/view?usp=sharing

https://drive.google.com/file/d/1tUPzkAdYhXrzOmDyx1Zim31O4-ZPmTZU/view?usp=sharing

这是我的creenshotTab代码(来自我发布的昨天的问题)(控件截图被添加到)以及改进后的代码隐藏:

Here is my creenshotTab code (from yesterday's question i posted) (the control the screenshot gets added to) along with the revamped code-behind:

< UserControl x:Class =" MySnipItTool.ScreenshotTab"

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;   xmlns =" http://schemas.microsoft.com/winfx/2006/xaml/presentation"

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;   xmlns:x =" http://schemas.microsoft.com/winfx/2006/xaml"

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;   xmlns:mc =" http://schemas.openxmlformats.org/markup-compatibility/2006" 

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;   xmlns:d =" http://schemas.microsoft.com/expression/blend/2008" 

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;   xmlns:local =" clr-namespace:MySnipItTool"

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;   mc:Ignorable =" d" 

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; d:DesignHeight = QUOT; 300" d:DesignWidth = QUOT; 300"背景="白色">

  &NBSP; < UserControl.DataContext>

  &NBSP; &NBSP; &NBSP; < local:ViewModel />

  &NBSP; < /UserControl.DataContext>

  &NBSP; < Grid Cursor =" Cross">

  &NBSP; &NBSP; &NBSP; < ScrollViewer Horizo​​ntalScrollBarVisibility =" Visible" VerticalScrollBarVisibility =" Visible">

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; < Canvas Width =" 300"名称= QUOT;画布"背景= QUOT;白色"的MouseDown = QUOT; imgControl_MouseDown"的MouseMove = QUOT; imgControl_MouseMove" MouseUp =" imgControl_MouseUp">

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; < Image RenderOptions.BitmapScalingMode =" NearestNeighbor" Name =" imgControl" />

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; < / Canvas>

  &NBSP; &NBSP; &NBSP; < / ScrollViewer>

  &NBSP; < / Grid>

< / UserControl>

<UserControl x:Class="MySnipItTool.ScreenshotTab"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:MySnipItTool"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300" Background="White">
    <UserControl.DataContext>
        <local:ViewModel/>
    </UserControl.DataContext>
    <Grid Cursor="Cross">
        <ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible">
            <Canvas Width="300" Name="canvas" Background="White" MouseDown="imgControl_MouseDown" MouseMove="imgControl_MouseMove" MouseUp="imgControl_MouseUp">
                <Image RenderOptions.BitmapScalingMode="NearestNeighbor" Name="imgControl"/>
            </Canvas>
        </ScrollViewer>
    </Grid>
</UserControl>

公共部分类ScreenshotTab:UserControl

  &NBSP; {

  &NBSP; &NBSP; &NBSP; public Sc​​reenshotTab()

  &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; InitializeComponent();

  &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; public Sc​​reenshotTab(BitmapImage screenshot,Window window)

  &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; InitializeComponent();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; imgControl.Source =截图;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; imgControl.MaxWidth = screenshot.Width;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; imgControl.MaxHeight = screenshot.Height;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; canvas.Height = screenshot.Height;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; canvas.MinHeight = screenshot.Height;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; canvas.MaxHeight = screenshot.Height;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; canvas.Width = screenshot.Width;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; canvas.MinWidth = screenshot.Width;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; canvas.MaxWidth = screenshot.Width;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; mainWindow =窗口为MainWindow;

  &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; public bool isSaved

  &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;得到;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;设定;

  &NBSP; &NBSP; &NBSP; }




  &NBSP; &NBSP; &NBSP; public BitmapImage截图

  &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;得到
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; if(imgControl.Source是BitmapImage)

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;将imgControl.Source返回为BitmapImage;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }¥b $ b  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;否则

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;返回null;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }¥b $ b  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }¥b $ b  &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; //按事件处理程序内逻辑流程中所需的顺序列出。

  &NBSP; &NBSP; &NBSP;私人MainWindow mainWindow;

  &NBSP; &NBSP; &NBSP;私人椭圆圈;

  &NBSP; &NBSP; &NBSP;私人折线polyLine;

  &NBSP; &NBSP; &NBSP;私人Point startPoint;

  &NBSP; &NBSP; &NBSP;私人Point endPoint;

  &NBSP; &NBSP; &NBSP;私人专线;

  &NBSP; &NBSP; &NBSP;私人矩形矩形;



  &NBSP; &NBSP; &NBSP; private void imgControl_MouseDown(object sender,MouseButtonEventArgs e)

  &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;开关(mainWindow.toolSelected)

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;案例DrawingTool.FreeDraw:

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; polyLine = new Polyline();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; SetStrokeProperties(polyLine);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; polyLine.Points.Add(e.GetPosition(canvas));

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; canvas.Children.Add(polyLine);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;休息;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;案例DrawingTool.Line:

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; line = new Line();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; SetStrokeProperties(line);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; line.X1 = e.GetPosition(canvas).X;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; line.Y1 = e.GetPosition(canvas).Y;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; line.X2 = e.GetPosition(canvas).X;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; line.Y2 = e.GetPosition(canvas).Y;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; canvas.Children.Add(line);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;休息;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; case DrawingTool.Rectangle:

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; rectangle = new Rectangle();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; SetStrokeProperties(矩形);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; startPoint = e.GetPosition(画布);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; endPoint = e.GetPosition(画布);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; Canvas.SetLeft(rectangle,startPoint.X);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; Canvas.SetTop(rectangle,startPoint.X);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; canvas.Children.Add(rectangle);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;休息;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; case DrawingTool.Circle:

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; circle = new Ellipse();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; SetStrokeProperties(圆圈);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; startPoint = e.GetPosition(画布);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; endPoint = e.GetPosition(画布);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; Canvas.SetLeft(circle,startPoint.X);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; Canvas.SetTop(circle,startPoint.X);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; canvas.Children.Add(circle);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;休息;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }¥b $ b  &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; private void SetStrokeProperties(形状)

  &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; shape.MouseEnter + = OnMouseOver;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; shape.Stroke = new SolidColorBrush(mainWindow.color);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; shape.StrokeThickness = 3;

  &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; //这是我们的橡皮擦活动。

  &NBSP; &NBSP; &NBSP; //当选择工具时,它只是从对象中删除元素

  &NBSP; &NBSP; &NBSP; //是橡皮擦工具,我们将鼠标放下。

  &NBSP; &NBSP; &NBSP; private void OnMouseOver(object sender,MouseEventArgs e)

  &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; if((e.LeftButton == MouseButtonState.Pressed)&&(mainWindow.toolSelected == DrawingTool.Eraser))

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; canvas.Children.Remove(发件人为UIElement);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }¥b $ b  &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; private void imgControl_MouseMove(object sender,MouseEventArgs e)

  &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; if(e.LeftButton == MouseButtonState.Pressed)

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;开关(mainWindow.toolSelected)

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;案例DrawingTool.FreeDraw:

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; polyLine.Points.Add(e.GetPosition(canvas));

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;休息;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;案例DrawingTool.Line:

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; line.X2 = e.GetPosition(canvas).X;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; line.Y2 = e.GetPosition(canvas).Y;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;休息;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; case DrawingTool.Rectangle:

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; endPoint = e.GetPosition(画布);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; CalculateNewShapePosition(startPoint,endPoint,rectangle);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }¥b $ b  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;休息;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; case DrawingTool.Circle:

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; endPoint = e.GetPosition(画布);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; CalculateNewShapePosition(startPoint,endPoint,circle);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }¥b $ b  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;休息;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }¥b $ b  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }¥b $ b  &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; private void imgControl_MouseUp(object sender,MouseButtonEventArgs e)

  &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; isSaved = false;

  &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; private void CalculateNewShapePosition(Point startPoint,Point endPoint,Shape shape)

  &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; shape.Width = RectangleShapeResizer.CalculateNewWidth(startPoint.X,endPoint.X);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; shape.Height = RectangleShapeResizer.CalculateNewHeight(startPoint.Y,endPoint.Y);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; double topLeftX = RectangleShapeResizer.GetEndPointXCoordinate(

         shape.Width,shape.Height,startPoint.X,startPoint.Y,endPoint.X ,endPoint.Y);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; Canvas.SetLeft(shape,topLeftX);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; double topLeftY = RectangleShapeResizer.GetEndPointYCoordinate(

         shape.Width,shape.Height,startPoint.X,startPoint.Y,endPoint.X ,endPoint.Y);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; Canvas.SetTop(shape,topLeftY);

  &NBSP; &NBSP; &NBSP; }¥b $ b  &NBSP; }

public partial class ScreenshotTab : UserControl
    {
        public ScreenshotTab()
        {
            InitializeComponent();
        }

        public ScreenshotTab(BitmapImage screenshot, Window window)
        {
            InitializeComponent();
            imgControl.Source = screenshot;
            imgControl.MaxWidth = screenshot.Width;
            imgControl.MaxHeight = screenshot.Height;
            canvas.Height = screenshot.Height;
            canvas.MinHeight = screenshot.Height;
            canvas.MaxHeight = screenshot.Height;
            canvas.Width = screenshot.Width;
            canvas.MinWidth = screenshot.Width;
            canvas.MaxWidth = screenshot.Width;
            mainWindow = window as MainWindow;
        }

        public bool isSaved
        {
            get;
            set;
        }


        public BitmapImage Screenshot
        {
            get
            {
                if (imgControl.Source is BitmapImage)
                {
                    return imgControl.Source as BitmapImage;
                }
                else
                {
                    return null;
                }
            }
        }

        // Listed in the order they are needed in the logic flow inside the event handlers.
        private MainWindow mainWindow;
        private Ellipse circle;
        private Polyline polyLine;
        private Point startPoint;
        private Point endPoint;
        private Line line;
        private Rectangle rectangle;

        private void imgControl_MouseDown(object sender, MouseButtonEventArgs e)
        {
            switch (mainWindow.toolSelected)
            {
                case DrawingTool.FreeDraw:
                    polyLine = new Polyline();
                    SetStrokeProperties(polyLine);
                    polyLine.Points.Add(e.GetPosition(canvas));
                    canvas.Children.Add(polyLine);
                    break;
                case DrawingTool.Line:
                    line = new Line();
                    SetStrokeProperties(line);
                    line.X1 = e.GetPosition(canvas).X;
                    line.Y1 = e.GetPosition(canvas).Y;
                    line.X2 = e.GetPosition(canvas).X;
                    line.Y2 = e.GetPosition(canvas).Y;
                    canvas.Children.Add(line);
                    break;
                case DrawingTool.Rectangle:
                    rectangle = new Rectangle();
                    SetStrokeProperties(rectangle);
                    startPoint = e.GetPosition(canvas);
                    endPoint = e.GetPosition(canvas);
                    Canvas.SetLeft(rectangle, startPoint.X);
                    Canvas.SetTop(rectangle, startPoint.X);
                    canvas.Children.Add(rectangle);
                    break;
                case DrawingTool.Circle:
                    circle = new Ellipse();
                    SetStrokeProperties(circle);
                    startPoint = e.GetPosition(canvas);
                    endPoint = e.GetPosition(canvas);
                    Canvas.SetLeft(circle, startPoint.X);
                    Canvas.SetTop(circle, startPoint.X);
                    canvas.Children.Add(circle);
                    break;
            }
        }

        private void SetStrokeProperties(Shape shape)
        {
            shape.MouseEnter += OnMouseOver;
            shape.Stroke = new SolidColorBrush(mainWindow.color);
            shape.StrokeThickness = 3;
        }

        // This is our eraser event.
        // It simply removes the element from the object when the tool selected
        // is the eraser tool and we have the mouse down.
        private void OnMouseOver(object sender, MouseEventArgs e)
        {
            if ((e.LeftButton == MouseButtonState.Pressed) && (mainWindow.toolSelected == DrawingTool.Eraser))
            {
                canvas.Children.Remove(sender as UIElement);
            }
        }

        private void imgControl_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.LeftButton == MouseButtonState.Pressed)
            {
                switch (mainWindow.toolSelected)
                {
                    case DrawingTool.FreeDraw:
                        polyLine.Points.Add(e.GetPosition(canvas));
                        break;
                    case DrawingTool.Line:
                        line.X2 = e.GetPosition(canvas).X;
                        line.Y2 = e.GetPosition(canvas).Y;
                        break;
                    case DrawingTool.Rectangle:
                        {
                            endPoint = e.GetPosition(canvas);
                            CalculateNewShapePosition(startPoint, endPoint, rectangle);
                        }
                        break;
                    case DrawingTool.Circle:
                        {
                            endPoint = e.GetPosition(canvas);
                            CalculateNewShapePosition(startPoint, endPoint, circle);
                        }
                        break;
                }
            }
        }

        private void imgControl_MouseUp(object sender, MouseButtonEventArgs e)
        {
            isSaved = false;
        }

        private void CalculateNewShapePosition(Point startPoint, Point endPoint, Shape shape)
        {
            shape.Width = RectangleShapeResizer.CalculateNewWidth(startPoint.X, endPoint.X);
            shape.Height = RectangleShapeResizer.CalculateNewHeight(startPoint.Y, endPoint.Y);
            double topLeftX = RectangleShapeResizer.GetEndPointXCoordinate(
                shape.Width, shape.Height, startPoint.X, startPoint.Y, endPoint.X, endPoint.Y);
            Canvas.SetLeft(shape, topLeftX);
            double topLeftY = RectangleShapeResizer.GetEndPointYCoordinate(
                shape.Width, shape.Height, startPoint.X, startPoint.Y, endPoint.X, endPoint.Y);
            Canvas.SetTop(shape, topLeftY);
        }
    }

RectangleShapeResizer只是一个辅助类,用于计算矩形的大小。如果您需要,我的所有代码都在这里:

RectangleShapeResizer is just a helper class that calculates the resizes for the rectangle. All of my code is located here if you need it:

https://github.com/zacharywatson1129/MySnipItTool

https://github.com/zacharywatson1129/MySnipItTool

提前致谢,我是MSDN的新手 - 很抱歉,如果这篇文章不是很好。

Thanks in advance, and I am new to MSDN--so sorry if this post isn't very good.

推荐答案

嗨Zachary,

Hi Zachary,

MVVM设计模式是设计模式的帮助你组织你的代码。它将比以前更轻松地更改代码。但也许它不会在运行时如此改变
。我无法评估哪个对你更好,也许你可以查看其他人的一些想法,例如,这是MVVM的用法:

https://stackoverflow.com/questions/2653096/why-use-mvvm

https://softwareengineering.stackexchange.com/questions/254744/wpf- event-driven-vs-mvvm-design-pattern

最好的问候,

Cherry

这篇关于代码背后的Vs. MVVM C#WPF应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆