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

Bind string based SVGs to a UWP application

我是 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 中使用 {x:Bind},但不确定如何绑定它。 潜在的 XAML 代码如下:

<Image x:Name="MyImageView" Source="{x:Bind ...required area...”}>

更新:

我的MainPage.xaml.cs:

 public sealed partial class MainPage : Page
    {
        SVGModel dataBindedModel = new SVGModel();
        public MainPage()
        {
            this.InitializeComponent();
            dataBindedModel.SVGString = File.ReadAllText("test.xml");
            this.DataContext = dataBindedModel;
        }
    }
    public class SVGModel
    {
        public SVGModel() { }
        public SVGModel(string svg)
        {
            SVGString = svg;
        }
        public string SVGString { get; set; }

    }

我的MainPage.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>

我的test.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字符串,它只包含SvgImageSource class,请另存为svg文件并设置为图像控件,如下所示。

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

另一种方法是使用值转换器将字符串转换为 SvgImageSource 例如

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 }}" />

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