C# 将基于字符串的SVG绑定到UWP应用程序

C# 将基于字符串的SVG绑定到UWP应用程序,c#,.net,image,uwp,desktop,C#,.net,Image,Uwp,Desktop,我是UWP应用程序开发的新手,正在寻找一种将基于字符串的SVG绑定到UWP(通用Windows平台)页面的方法。我想通过使用UWP页面的图像标签(XAML布局)来展示基于字符串的SVG。SVG将以SVG标记语言表示,如: dataBindedModel.svg = “<svg xmlns="http://www.w3.org/2000/svg"; width="500" height="500"> <circle cx

我是UWP应用程序开发的新手,正在寻找一种将基于字符串的SVG绑定到UWP(通用Windows平台)页面的方法。我想通过使用UWP页面的图像标签(XAML布局)来展示基于字符串的SVG。SVG将以SVG标记语言表示,如:

dataBindedModel.svg = “<svg xmlns="http://www.w3.org/2000/svg"; width="500" height="500">
<circle cx="250" cy="250" r="210" fill="#fff" stroke="#000" stroke-width="8"/>
</svg>”;
我的主页.xaml

<Grid>
        <Grid.Resources>
            <local:SVGImageConverter x:Key="MyConvert" />
        </Grid.Resources>
        <Image x:Name="MyImageView" Source="{x:Bind dataBindedModel.SVGString,Mode=OneWay,Converter={StaticResource MyConvert }}" />
    </Grid>

Mytest.xml:

<?xml version="1.0" encoding="utf-8" ?>
<svg  width="500" height="500">
    <circle cx="250" cy="250" r="210" fill="#fff" stroke="#000" stroke-width="8"/>
</svg>

UWP不允许直接绑定SVG字符串,它只包含类,请另存为SVG文件并将其设置为图像控件,如下所示

<Image Source="Assets/mysvg.svg"/>
用法

<Image x:Name="MyImageView" Source="{x:Bind dataBindedModel.svg,Mode=OneWay,Converter={StaticResource MyConvert }}" />


请注意:请确保您的svg字符串是正确的svg类型。

Nico Zhu-MSFT-感谢您的反馈。我已经尝试过你的解决方案,但由于某些原因它不起作用。我已经更新了我的问题。请告诉我我的代码中缺少了什么。Nico Zhu-MSFT-您可以尝试使用您选择的任何其他xml字符串吗。我想浏览一下这个绑定。谢谢好的,我会给你们做样品,请稍等。@Hassaniftikar,有用吗?让我们看看。你们有的只是文字,不是图像。将一些文本指定给
图像
属性不会呈现它
之所以有效,是因为运行时将使用在被识别为
svg
文件路径和
Image
属性之间进行转换svg来自何处?文本文件?资源?在这种情况下,您只需将正确的路径传递到
源代码。如果是在运行时生成的字符串,则可以绑定到SvgImageSource并使用@PanagiotisKanavos加载数据-我的SVG是XML格式的(test.XML请参见上文)。我已经创建了一个xml文件,将我的SVG xml粘贴到其中。我正在MainPage.xaml.cs构造函数中SVGModel类的SVGString属性中读取此xml。(请参见上文)但是为了运行代码会遇到一些异常。
我的SVG是XML格式的
,因为SVG是一种什么都不说的XML。您是否尝试过使用
svg
扩展名保存文件,并按照链接文档的显示方式使用它?另外,那
test.xml
文件在哪里?路径是相对的,这意味着应用程序将尝试在tis可执行文件夹中找到它,无论该文件夹位于何处。Windows应用程序是沙盒的,这意味着当前目录不在您认为的位置,并且应用程序无法读取它想要的任何内容either@PanagiotisKanavos-如何在MainPage.xaml.cs的ctor中直接使用XML设置SVGString属性。如果我尝试使用:databindemodel.SVGString=“”;有什么想法吗?
<Image Source="Assets/mysvg.svg"/>
public class SVGImageConverter : IValueConverter
{
    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }

    public  object Convert(object value, Type targetType, object parameter, string language)
    {
        var svg = new SvgImageSource();
        try
        {
            var svgBuffer = CryptographicBuffer.ConvertStringToBinary(value.ToString(), BinaryStringEncoding.Utf8);
       
            using (var stream = svgBuffer.AsStream())
            {
                 svg.SetSourceAsync(stream.AsRandomAccessStream()).AsTask().ConfigureAwait(false);                    
            }
        }
        catch (Exception ex)
        {

        }

        return svg;
    }
}
<Image x:Name="MyImageView" Source="{x:Bind dataBindedModel.svg,Mode=OneWay,Converter={StaticResource MyConvert }}" />