关于c#:如何从UWP应用程序中XmlDocument的内容设置Image组件的SvgImageSource属性?

How can I set the SvgImageSource property of an Image component from the contents of an XmlDocument in a UWP app?

我有一个Windows 10 UWP应用程序,它使用Prism MVVM a,其中我以编程方式在C#中创建了一个在XmlDocument中的SVG XML,我需要在现有的Image组件中显示它。<铅>

在我的XAML中,我有:

1
2
3
<Image
 Source="{x:Bind ViewModel.SvgSource, Mode=OneWay}"
 Stretch="Uniform" />

在我的ViewModel中,我有:

1
2
3
4
5
6
private SvgImageSource _svgSource;
public SvgImageSource SvgSource
{
 get => _svgSource;
 set => _ = SetProperty(ref _svgSource, value);
}

...然后我通过以下方式在视图模型中设置源:

1
2
private SVGGenerator generator;
SvgSource = await generator.GetSourceAsync(_generationCancellationTokenSource.Token);

在我的SVGGenerator类中(除其他方法外):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public async Task<IRandomAccessStream> GetSourceAsync(CancellationToken cancellationToken)
{
 return await Task.Run(() =>
   {
     using (var stringWriter = new StringWriter())
     {
       XmlWriterSettings settings = new XmlWriterSettings
       {
         Indent = true,
         Encoding = Encoding.UTF8
       };
       using (var memoryStream = new MemoryStream())
       {
         using (var xmlTextWriter = XmlWriter.Create(memoryStream, settings))
         {
           _document.WriteTo(xmlTextWriter);
           xmlTextWriter.Flush();
           var ramStream = new InMemoryRandomAccessStream();
           memoryStream.CopyTo(ramStream);
           ramStream.Seek(0);
           return ramStream;
         }
       }
     }
   }, cancellationToken
 );
}

memoryStream.CopyTo(ramStream);行无法编译-CS1503 C#参数1:无法从Windows.Storage.Streams.InMemoryRandomAccessStreama转换。到'System.IO.Stream'-因为MemoryStream不能写入InMemoryRandomAccessStream(或者换句话说,我无法弄清楚该怎么做)。

某些文本,例如如何在Windows 8中将字节数组转换为InMemoryRandomAccessStream或IRandomAccessStream?我已经看到建议使用memoryStream.AsRandomAccessStream(),但我无法弄清楚如何使用.AsRandomAccessStream()扩展方法(这对我不可用,我不知道从哪里获得它,因为可用的代码未显示using语句)。

其他文字,例如https://csharp.hotexamples.com/examples/Windows.Storage.Streams/InMemoryRandomAccessStream/AsStream/php-inmemoryrandomaccessstream-asstream-method-examples.html –建议使用memoryStream.CopyTo(ramStream.AsStream());,但.AsStream()扩展名isna?出于类似原因可用。

此刻我正在转来转去。

我想做的

"全部"是将XmlDocument中的文本直接写到InMemoryRandomAccessStream或将MemoryStream的内容复制到InMemoryRandomAccessStream,但是我无法弄清楚要么做。

有人可以帮我吗?
我是否应该以另一种(更简单的)方式来执行此操作?


为了测试您的代码,我发现memoryStream参数是输出类型,但是您将空的memoryStream发送给该方法。因此,请尝试将WriteTo修改为Save方法,以确保memoryStream包含内容。我在下面发布了完整的GetSourceAsync,您可以直接使用它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public async Task<IRandomAccessStream> GetSourceAsync(CancellationToken cancellationToken)
{
    return await Task.Run(async () =>
    {
        using (var stringWriter = new StringWriter())
        {
            XmlWriterSettings settings = new XmlWriterSettings
            {
                Indent = true,
                Encoding = Encoding.UTF8
            };
            using (var memoryStream = new MemoryStream())
            {
                using (var xmlTextWriter = XmlWriter.Create(memoryStream, settings))
                {
                    _document.Save(xmlTextWriter);
                    xmlTextWriter.Flush();
                    var ibuffer = memoryStream.GetWindowsRuntimeBuffer();
                    InMemoryRandomAccessStream randomAccessStream = new InMemoryRandomAccessStream();
                    await randomAccessStream.WriteAsync(ibuffer);
                    randomAccessStream.Seek(0);
                    return randomAccessStream;
                }
            }
        }
    }, cancellationToken
    );
}