DefectPreviewAreaUtil.cs 7.53 KB
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OS.Spin.ViewModle.Models;
using OS.Spin.View.DefectPreviewArea;
using System.Windows.Controls;

namespace OS.Spin.View.Utils
{
    /// <summary>
    /// 瑕疵预览区域管理工具类
    /// </summary>
    public class DefectPreviewAreaUtil
    {
        private static List<OS.Spin.ViewModle.Models.DefectPreviewArea> _defectPreviewAreas = null;   //保存瑕疵预览区域数据用于动态刷新界面
        private static object _object = new object();   //锁对象
        private static DefectPreviewAreaUtil _defectPreviewAreaUtil = null;     //管理其它对象的单例对象
        private static List<DefectSpanPreview> _defectSpanPreview = null;     //已经添加的瑕疵点控件

        private static DefectPreviewDelegateUtil _defectPreviewDelegateUtil = null; //委托实例

        /// <summary>
        /// 无参构造函数初始化数据
        /// </summary>
        public DefectPreviewAreaUtil()
        {
            _defectPreviewAreas = new List<OS.Spin.ViewModle.Models.DefectPreviewArea>();    //创建瑕疵预览区域缓存区
            _defectSpanPreview = new List<DefectSpanPreview>();
            _defectPreviewDelegateUtil = new DefectPreviewDelegateUtil();   //获取该委托实例
        }

        /// <summary>
        /// 返回瑕疵控件对象集合
        /// </summary>
        /// <returns></returns>
        public List<DefectSpanPreview> getDefectSpanPreviews()
        {
            return _defectSpanPreview;
        }

        /// <summary>
        /// 添加该瑕疵控件到集合中管理
        /// </summary>
        /// <param name="defectSpanPreview"></param>
        public void addDefectSpanPreview(DefectSpanPreview defectSpanPreview)
        {
            if (!_defectSpanPreview.Contains(defectSpanPreview))    //只有不存在该对象的时候才添加该对象
            {
                _defectSpanPreview.Add(defectSpanPreview);
            }
        }

        public void removeDefectSpanPreview()
        {
            if (null != _defectSpanPreview && _defectSpanPreview.Count > 0)
            {
                _defectSpanPreview.Clear();
                //for(int j = 0; j < _defectSpanPreview.Count; j++)
                //{
                //    _defectSpanPreview.Remove(_defectSpanPreview[j]);
                //}
            }
        }
        /// <summary>
        /// 单例类实例化
        /// </summary>
        /// <returns></returns>
        public static DefectPreviewAreaUtil getInstance()
        {
            if (null == _defectPreviewAreaUtil)
            {
                lock (_object)
                {
                    if (null == _defectPreviewAreaUtil)
                    {
                        _defectPreviewAreaUtil = new DefectPreviewAreaUtil();
                    }
                }
            }
            return _defectPreviewAreaUtil;
        }

        /// <summary>
        /// 获取该委托实例
        /// </summary>
        /// <returns></returns>
        public DefectPreviewDelegateUtil getDefectPreviewDelegateUtil()
        {
            return _defectPreviewDelegateUtil;
        }
        /// <summary>
        /// 获取瑕疵预览区集合对象
        /// </summary>
        /// <returns></returns>
        public List<OS.Spin.ViewModle.Models.DefectPreviewArea> getDefectPreviewAreas()
        {
            return _defectPreviewAreas;
        }

        /// <summary>
        /// 向瑕疵集合中添加数据
        /// </summary>
        /// <param name="defectPreviewArea"></param>
        public void addDefectPreviewArea(OS.Spin.ViewModle.Models.DefectPreviewArea defectPreviewArea)
        {
            _defectPreviewAreas.Add(defectPreviewArea);
        }

        /// <summary>
        /// 从集合中删除某个瑕疵点
        /// </summary>
        /// <param name="defectDataImage"></param>
        public void removeDefectDataImage(DefectDataImage defectDataImage)
        {
            //保证非空
            if(null != _defectSpanPreview && _defectSpanPreview.Count > 0)
            {
                //找到该控件是否存在
                for(int i = 0; i < _defectSpanPreview.Count; i++)
                {
                    DefectSpanPreview defectSpanPreview = _defectSpanPreview[i];
                    StackPanel stack = defectSpanPreview.StackPanel;
                    Canvas canvas = (Canvas)stack.Children[4];  //瑕疵点显示区域数据
                    //List<DefectDataImage> defectDataImages = (DefectDataImage)canvas.Children.OfType<DefectDataImage>();
                    //最多四个
                    int len = canvas.Children.Count;
                    DefectDataImage defectDataImageOne = null;
                    for (int c = 0; c < len; c++) {
                        defectDataImageOne = (DefectDataImage)canvas.Children[c];
                        if (defectDataImageOne != null && defectDataImageOne.Equals(defectDataImage))   //找到了
                        {
                            canvas.Children.Remove(defectDataImageOne); //找到了就删除掉
                            StackPanel stackPanelOne = (StackPanel)defectDataImage.stackPanelFather;
                            TextBlock textBlockOne = (TextBlock)stackPanelOne.Children[0];
                            TextBlock textBlockTwo = (TextBlock)stackPanelOne.Children[1];
                            TextBlock textBlockThree = (TextBlock)stackPanelOne.Children[2];
                            string type = textBlockOne.Text;    //类型
                            string length = textBlockTwo.Text;        //长度
                            string score = textBlockThree.Text;     //分数

                            //获取布匹编号
                            Border border = (Border)stack.Children[0];
                            TextBlock textBlock = (TextBlock)border.Child;
                            //TextBlock textBlock = (TextBlock)stack.Children[0];
                            string text = textBlock.Text;
                            //根据布匹编号找到该数据
                            for (int j = 0; j < _defectPreviewAreas.Count; j++)
                            {
                                OS.Spin.ViewModle.Models.DefectPreviewArea defectPreviewArea = _defectPreviewAreas[j];
                                String number = defectPreviewArea.DefectNumber;
                                if (text == number) //找到相同的编号了
                                {
                                    List<DefectSpot> defectSpots = defectPreviewArea.DefectSpots;
                                    for (int a = 0; a < defectSpots.Count; a++)
                                    {
                                        if (defectSpots[a].DefectType == type && defectSpots[a].DefectLength == length && defectSpots[a].DefectDeduct == score)
                                        {
                                            //到这一步终于让我给找到了,哈哈,找到了就直接删除了吧,这过程确实比较麻烦像爬虫一样
                                            defectSpots.Remove(defectSpots[a]); //删除相同的元素
                                            return; //我已经找到了,我还找毛线,直接return避免重复查找
                                        }
                                    }

                                }
                            }
                        }
                    }
                }
            }
        }
    }
}