如何仅从片段创建System.Uri对象?Svg.NET开发场景问题
如何仅从片段创建System.Uri对象(适配Svg.NET的SvgTextPath.ReferencedPath)
问题说明
直接执行new System.Uri("#something", UriKind.Relative)创建仅含片段的Uri时,无论指定相对还是绝对模式都会抛出异常。在使用Svg.NET构建SvgTextPath对象时,ReferencedPath属性要求传入System.Uri类型值,但实际需要赋值的是SVG路径元素的ID(符合SVG规范中textPath元素的引用要求),无法直接传入字符串ID,因此需要找到将元素ID转换为合法Uri的方法。
可行解决方案
方法1:基于空基Uri构造片段Uri
通过一个空的绝对Uri作为基础,使用Uri.TryCreate方法拼接片段,即可生成合法的Uri对象:
var baseUri = new Uri("http://tempuri.org/"); Uri fragmentUri; if (Uri.TryCreate(baseUri, "#pathId", out fragmentUri)) { textPath.ReferencedPath = fragmentUri; }
方法2:使用UriBuilder直接构造
利用UriBuilder的Fragment属性设置ID(无需手动加#,UriBuilder会自动处理),再转换为Uri:
var builder = new UriBuilder(); builder.Fragment = "pathId"; var fragmentUri = builder.Uri; textPath.ReferencedPath = fragmentUri;
原理补充
System.Uri的构造逻辑不允许直接创建仅包含片段的独立Uri(片段本身无法构成有效的相对或绝对Uri)。但通过绑定一个空的基地址,或者借助UriBuilder间接构造,就能生成符合要求的Uri对象,其Fragment属性正好对应SVG元素的ID,完全适配Svg.NET的ReferencedPath属性需求。
内容的提问来源于stack exchange,提问作者dotNET
相关产品推荐
相关产品推荐

