private async void LoadNextChapter() { if (currentChapterIndex == null) { return; } ChapterNavigationItem nextChapter = null; try { var currentMainChapter = chapterList[currentChapterIndex ?? 0]; nextChapter = currentMainChapter.SubChapters.ElementAtOrDefault((currentChapterIndex ?? 0) + 1); if (nextChapter == null) { var nextMainChapter = chapterList.ElementAtOrDefault((currentChapterIndex ?? 0) + 1); nextChapter = nextMainChapter?.SubChapters?.FirstOrDefault(); if (nextChapter == null) { nextChapter = nextMainChapter; } } } catch { } if (nextChapter != null) { await LoadChapterAsync(nextChapter, true); } }
private static List <ChapterNavigationItem> FindChapterList(XElement root) { var elements = root.Elements().Where(d => d.Name.LocalName == "navPoint"); var chapterList = new List <ChapterNavigationItem>(); foreach (var element in elements) { var chapterElements = element.Elements(); var chapterElement = chapterElements.FirstOrDefault(d => d.Name.LocalName == "navLabel"); var chapterTitle = chapterElement.Elements().FirstOrDefault(d => d.Name.LocalName == "text")?.Value; var chapterSrcElement = chapterElements.FirstOrDefault(d => d.Name.LocalName == "content"); var chapterSrc = chapterSrcElement.Attributes().FirstOrDefault(a => a.Name == "src")?.Value; var chapter = new ChapterNavigationItem { Text = chapterTitle, Src = chapterSrc, SubChapters = FindChapterList(element) }; chapterList.Add(chapter); } return(chapterList); }
private async Task LoadChapterAsync(ChapterNavigationItem chapter, bool forceReload = false) { var link = chapter.Src.Split("#"); var src = link[0]; var anchor = link.Length > 1 ? link[1] : string.Empty; if (loadedSrc != src || forceReload) { var url = book.GetChapterUrl(src); webView.LoadUrl(url); loadedSrc = src; } if (!string.IsNullOrEmpty(anchor)) { webView.ScrollToAnchor(anchor); } else { webView.ScrollToTop(); } var chapterIndex = chapterList.IndexOf(chapter); if (chapterIndex >= 0) { currentChapterIndex = chapterIndex; currentSubChapterIndex = null; } else { var mainChapter = chapterList.FirstOrDefault(c => c.SubChapters != null && c.SubChapters.Contains(chapter)); if (mainChapter == null) { return; } currentChapterIndex = chapterList.IndexOf(mainChapter); currentSubChapterIndex = mainChapter.SubChapters.IndexOf(chapter); } }