2014-10-06 2 views
0

Я пытаюсь загрузить векторное изображение в масштабируемом ScrollViewer, отлично работает на моем ноутбуке, но очень медленно на планшете при масштабировании/отключении. Пользовательский интерфейс заморожен во время рендеринга изображений.Windows Store Приложения async xaml rendering

Мое изображение было преобразовано из svg в файл xaml с помощью Inkscape. (~ 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> 

Как я могу оказать Canvas в фоновом режиме? (без блокировки пользовательского интерфейса). Если это невозможно, как я могу обработать этот рендеринг, чтобы добавить ProgressBar во время рендеринга?

+0

Можете ли вы предоставить больше кода на C#? В частности, когда вы вызываете его (в обработчике событий? И т. Д.) - сообщит нам, используете ли вы его в потоке пользовательского интерфейса или нет, что является обычной причиной таких задержек. – rikkit

+0

Отредактировано первое сообщение, чтобы предоставить больше кода на C# – alvinmeimoun

+0

Итак, мой ответ будет по существу таким же, как у JaredPar в этом вопросе: http://stackoverflow.com/questions/5395264/xamlreader-load-in-a-background-thread-is- это возможно - ваш планшет просто не способен достаточно выполнить эту операцию (XamlReader.Load с файлом 2 МБ) без запаздывания. К сожалению, XamlReader.Load должен использоваться в потоке пользовательского интерфейса. Вы можете попытаться уменьшить детали вектора, или может быть альтернатива третьей стороне для этой проблемы где-то там. – rikkit

ответ

0

Это не настоящий ответ на этот вопрос, а временное решение.

Сначала откройте файл svg с inkscape и увеличьте его до большого разрешения (я попробовал с 3500 * 4000) и экспортировал в xaml. (Этот метод увеличит изображение, сохранив небольшой размер файла).

В коде C# добавьте xamlRead.CacheMode = new BitmapCache();, это отобразит изображение из вектора в растровое изображение с экспортированным размером.

В конце концов, это похоже на работу с очень большим PNG/JPEG-изображением с меньшим размером файла. Все другие интересы использования векторных изображений теряются. Но результат справедлив.

+0

Я думаю, что в настоящее время невозможно воспроизвести асинхронно – alvinmeimoun

Смежные вопросы