Windows应用商店应用async xaml呈现

时间:2014-10-06 14:05:04

标签: c# xaml windows-store-apps

我试图在可缩放的ScrollViewer中加载矢量图像,在我的笔记本电脑上工作得很好,但在缩放/解除缩放时平板电脑上的速度非常慢。在图像渲染过程中,UI被冻结。

我的图像已使用Inkscape从svg转换为xaml文件。 (~2,37 MB)

C#

public MainPage()
{
    this.InitializeComponent();

    this.Loaded += MainPage_Loaded;

}

async void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    string fileContent;
    StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri(@"ms-appx:///Images/plan.xaml"));
    using (StreamReader sRead = new StreamReader(await file.OpenStreamForReadAsync()))
            fileContent = await sRead.ReadToEndAsync();

    var xamlRead = XamlReader.Load(fileContent) as Canvas;

    ImgMainGrid.Height = xamlRead.Height;
    ImgMainGrid.Width = xamlRead.Width;
    ImgMainGrid.Children.Add(xamlRead);
}

XAML

<ScrollViewer Grid.Row="1" x:Name="scrl" ZoomMode="Enabled" HorizontalScrollMode="Enabled" VerticalScrollMode="Enabled" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden" MinZoomFactor="1">
     <Grid x:Name="ImgMainGrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
</ScrollViewer>

如何在背景中渲染画布? (不阻止UI)。 如果不可能,我如何处理此渲染以在渲染时添加ProgressBar?

1 个答案:

答案 0 :(得分:0)

这不是这个问题的真正答案,而是一个临时解决方案。

首先使用inkscape打开svg文件并将其放大到一个大分辨率(我尝试使用3500 * 4000),并导出到xaml。 (此方法将通过保持较小的文件大小来放大图像)。

在C#代码中添加xamlRead.CacheMode = new BitmapCache();,这将使用导出的大小将图像从矢量渲染到位图。

最后,它就像处理文件较小的非常大的PNG / JPEG图像一样。使用矢量图像的所有其他兴趣都丢失了。但结果是公平的。