在网上找到了一个名为SVG-Convert-Driver-XAML-0.02的开源代码, 解压缩之后发现,它并不是使用.net代码写的, 所以并不适合我的需要。
不过,里面有一个文件却是非常有用的,那就是:解压目录\SVG-Convert-Driver-XAML-0.02\lib\SVG\Convert\Driver\XAML\svg2xaml.xsl。由于XSLT文件中还引用到一个名为colors.xml的文件,但原作者给出的压缩包中并没有这个文件。于是,我只好顺藤摸瓜,根据此XSLT中的XPath,来推断此colors.xml的结构。根据svg2xaml.xsl第71行这句:
经过分析,我推测出这个colors.xml的结构大致应该是这样:
<!-- 更多的color元素及其属性 -->
我现在要用它来写将SVG转换成XAML。
先看看写出完整程序之后的最终运行的效果图:
制作程序的过程:
于是在网上搜索colors.xml,还真找到一个类似的文件。它的结构是:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 更多color元素 -->
剩下的工作就是将SVG文件用弹出对话框打开, 然后使用XslCompiledTransform,XsltSettings, XmlReaderSettings将此文件转换成XAML了。
OpenFileDialog fd = new OpenFileDialog();
ofd.Filter = "*.svg|*.svg";
ofd.ShowDialog();
if (ofd.FileName != string.Empty)
{
StringWriter sw = new StringWriter();
XmlWriter xmlWriter = new XmlTextWriter(sw);
try
{
using (StreamReader streamReader = new StreamReader(ofd.FileName))
{
txtBoxSVGCode.Text = streamReader.ReadToEnd();
}
}
catch (Exception exc)
{
System.Windows.MessageBox.Show(string.Format("出错了,错误是:\r\n{0}", exc.Message));
}
string untrustedUri = @"http://www.anuntrustedsite.com/test.xsl";
XmlResolver resolver = new XmlSecureResolver(new XmlUrlResolver(), untrustedUri);
XsltSettings settings = XsltSettings.TrustedXslt;
settings.EnableDocumentFunction = true;
XslCompiledTransform transform. = new XslCompiledTransform();
transform.Load(@"../svg2xaml.xsl", settings, new XmlUrlResolver());
XmlReaderSettings rs = new XmlReaderSettings();
rs.ProhibitDtd = false;
transform.Transform(XmlReader.Create(ofd.FileName, rs), null, xmlWriter, resolver);
xmlWriter.Close();
// 这里是显示最终结果图形的代码(略)
}
在调试中发现,上面的程序对于有些SVG可以进行非常正常的转换,但有些却无法转换,抛出异常。比如说打开svg2xaml.xsl处第71行异常等。但这个XSLT文件经过我多次检测,没有格式方面的问题。还有对有些SVG文件转换速度很慢,特别是有路径内嵌的情况时更是如此——初步估计与XSLT模版中的某些算法有关系。
有空再找找相关的原因吧,我这里重点讲述转换的方法,希望对你有所启迪。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14601556/viewspace-528539/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/14601556/viewspace-528539/