コード例 #1
0
        /// <summary>
        /// 处理拖拽导入的SVG文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ContainerGrid_OnDrop(object sender, DragEventArgs e)
        {
            try
            {
                var fileNames = e.Data.GetData(DataFormats.FileDrop, true) as string[];
                if (fileNames == null || !fileNames.Any())
                {
                    return;
                }
                var svgs = fileNames.Where(x => Path.GetExtension(x) == ".svg").ToArray();

                if (!svgs.Any())
                {
                    return;
                }

                var sb = new StringBuilder();
                foreach (var svg in svgs)
                {
                    var     svgFileName = Path.GetFileNameWithoutExtension(svg);
                    Drawing drawing     = _fileSvgReader.GetDrawingGroup(svg);

                    //去掉冗余的层次
                    while (drawing is DrawingGroup drawingGroup && (drawingGroup.Children.Count == 1))
                    {
                        var dr = drawingGroup.Children[0];
                        if (dr != null)
                        {
                            if (drawingGroup.Transform != null)
                            {
                                if (dr is DrawingGroup @group)
                                {
                                    @group.Transform = drawingGroup.Transform;
                                }
                                else if (dr is GeometryDrawing geometryDrawing)
                                {
                                    geometryDrawing.Geometry.Transform = drawingGroup.Transform;
                                }
                            }

                            drawing = dr;
                        }
                        else
                        {
                            break;
                        }
                    }

                    var drawingImage = new DrawingImage(drawing);
                    if (drawing is GeometryDrawing geometryDrawing1)
                    {
                        if (geometryDrawing1.Geometry is PathGeometry geo)
                        {
                            var pathGeometry = new PathGeometry();
                            foreach (var figure in geo.Figures)
                            {
                                pathGeometry.Figures.Add(figure);
                            }

                            var combineGeometry = Geometry.Combine(Geometry.Empty, pathGeometry,
                                                                   GeometryCombineMode.Union, geometryDrawing1.Geometry.Transform);
                            geometryDrawing1.Geometry = combineGeometry;
                            drawing = geometryDrawing1;
                        }
                    }

                    var xaml = GetXaml(drawingImage);

                    var bounds = drawing.Bounds;
                    var image  = new Image
                    {
                        Source              = drawingImage,
                        Width               = bounds.Width,
                        Height              = bounds.Height,
                        ToolTip             = $"{drawing.Bounds.Width},{drawing.Bounds.Height}",
                        SnapsToDevicePixels = true,
                        UseLayoutRounding   = true,
                        Stretch             = Stretch.None,
                    };

                    IconsContainer.Children.Add(image);
                    HintText.Text = string.Empty;

                    sb.Append(xaml);
                    sb.Append(Environment.NewLine);
                    sb.Append(Environment.NewLine);
                    sb.Replace("<DrawingImage xmlns", $"<DrawingImage x:Key=\"{svgFileName}\" xmlns");
                }

                //替换掉不需要的字符串
                sb.Replace(" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"", string.Empty);
                sb.Replace(" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"", string.Empty);
                sb.Replace(" xmlns:svg=\"http://sharpvectors.codeplex.com/runtime/\"", string.Empty);
                sb.Replace(" Pen=\"{x:Null}\"", string.Empty);


                var result = sb.ToString();
                result = Regex.Replace(result, " svg:SvgLink.Key=\".*\"", string.Empty);
                result = Regex.Replace(result, " svg:SvgObject.Id=\".*\"", string.Empty);
                result = Regex.Replace(result, "<PathGeometry FillRule=\"EvenOdd\" Figures=\"([^T]*?)\" />",
                                       "<StreamGeometry>$1</StreamGeometry>");

                var tempXamlFile = Path.Combine(Path.GetTempPath(), $"{Path.GetRandomFileName()}.xaml");

                WriteToFile(result, tempXamlFile);

                TryOpenXamlFile(tempXamlFile);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
コード例 #2
0
        private void MainGrid_OnDrop(object sender, DragEventArgs e)
        {
            var wpfSettings = new WpfDrawingSettings();

            wpfSettings.CultureInfo = wpfSettings.NeutralCultureInfo;
            var fileSvgReader = new FileSvgReader(wpfSettings);

            var tempSvgFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Temp", "Svg2XamlTemp.svg");

            try
            {
                var fileNames = e.Data.GetData(DataFormats.FileDrop, true) as string[];
                if (fileNames == null || !fileNames.Any())
                {
                    return;
                }
                var svgs = fileNames.Where(x => Path.GetExtension(x) == ".svg").ToArray();

                if (!svgs.Any())
                {
                    return;
                }

                foreach (var svg in svgs)
                {
                    var content = File.ReadAllText(svg);
                    content = Regex.Replace(content, "<g id=\".*?\"", "<g");
                    File.WriteAllText(tempSvgFile, content);

                    var svgFileName = Path.GetFileNameWithoutExtension(svg);
                    if (svgFileName == null)
                    {
                        continue;
                    }

                    Drawing drawing = fileSvgReader.GetDrawingGroup(tempSvgFile);
                    while (drawing is DrawingGroup && (((DrawingGroup)drawing).Children.Count == 1))
                    {
                        var dr = ((DrawingGroup)drawing).Children[0];
                        if (dr != null)
                        {
                            drawing = dr;
                        }
                        else
                        {
                            break;
                        }
                    }
                    var drawingImage = new DrawingImage(drawing);

                    var resourceDictionary = _allDictList.FirstOrDefault(x => x.Contains(svgFileName) && x.MergedDictionaries.Count < 1)
                                             ?? _allDictList.FirstOrDefault(x => SvgMatchDict(x, svgFileName))
                                             ?? _allDictList.OrderBy(x => x.Count).LastOrDefault();
                    if (resourceDictionary != null)
                    {
                        if (svgFileName.StartsWith("Image."))
                        {
                            resourceDictionary[svgFileName] = drawingImage;
                        }
                        else if (svgFileName.StartsWith("Geometry."))
                        {
                            var gd = drawingImage.Drawing as GeometryDrawing;
                            if (gd != null)
                            {
                                var geomtry = gd.Geometry;
                                resourceDictionary[svgFileName] = geomtry;
                            }
                            else
                            {
                                MessageBox.Show($"Geometry 类型的 SVG 文件 {svgFileName}.svg 不符合规范");
                            }
                        }

                        if (!_updateDictList.Contains(resourceDictionary))
                        {
                            _updateDictList.Add(resourceDictionary);
                        }
                    }
                }

                Save();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }