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