/// <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()); } }
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()); } }