123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- using Prism.Mvvm;
- using Prism.Regions;
- using Prism.Services.Dialogs;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Media;
- using ComPDFKitViewer.PdfViewer;
- using PDF_Office.Model;
- using System.Collections.ObjectModel;
- using PDF_Office.Model.PageEdit;
- using Prism.Commands;
- using System.Windows;
- using System.Windows.Media.Imaging;
- using System.Windows.Controls.Primitives;
- using System.Diagnostics;
- using System.Windows.Controls;
- using PDF_Office.Tools;
- using System.Windows.Threading;
- using Prism.Events;
- using PDF_Office.EventAggregators;
- namespace PDF_Office.ViewModels.PageEdit
- {
- public class PageEditContentViewModel : BindableBase, INavigationAware
- {
- private CPDFViewer PDFViewer;
- private ViewContentViewModel viewContentViewModel;
- private IDialogService dialogs;
- private IEventAggregator eventor;
- /// <summary>
- /// 是否正在初始化所有列表项,正在初始化时,不刷新图片
- /// </summary>
- private bool isInitaling = false;
- private ScrollEventType scrollType = ScrollEventType.EndScroll;
- /// <summary>
- /// 辅助判断滚轮是否暂停滚动的计时器(暂时没有更好的方法来判断滚轮是否停止滚动)
- /// 只要滚动就重新计时、通过计时开始0.3秒后没有刷新计时来粗略判断用户是否有暂停滚动
- /// </summary>
- private DispatcherTimer timer = new DispatcherTimer();
- private string unicode = null;
- #region 属性
- private Visibility isvisible;
- public Visibility IsVisible
- {
- get { return isvisible; }
- set
- {
- SetProperty(ref isvisible, value);
- }
- }
- private int selecedIndex;
- /// <summary>
- /// 选中项的索引
- /// </summary>
- public int SelectedIndex
- {
- get { return selecedIndex; }
- set
- {
- SetProperty(ref selecedIndex, value);
- }
- }
- #endregion
- #region 命令
- #endregion
- /// <summary>
- /// 项数据集合
- /// </summary>
- public ObservableCollection<PageEditItem> PageEditItems { get; set; }
- public PageEditContentViewModel(IDialogService dialogService, IEventAggregator eventAggregator)
- {
- dialogs = dialogService;
- eventor = eventAggregator;
- unicode = App.mainWindowViewModel.SelectedItem.Unicode;
- PageEditItems = new ObservableCollection<PageEditItem>();
- eventAggregator.GetEvent<PageEditRefreshEvent>().Subscribe(OnPageEditRefreshEvent, e=>e.Unicode== unicode);
- }
- #region 事件
- private void OnPageEditRefreshEvent(PageEditRefreshEventArgs e)
- {
- //UI发送事件过来通知刷新图片时
- //调整逻辑,前后预加载5页
- RefreshItemImage(e.PageRange.Item1-5,e.PageRange.Item2+5);
- }
- #endregion
- /// <summary>
- /// 从PDFView获取所有Items集合
- /// </summary>
- private void GetSourceItems()
- {
- PageEditItems.Clear();
- isInitaling = true;
- for (int i = 0; i < PDFViewer.Document.PageCount; i++)
- {
- PageEditItem item = new PageEditItem();
- item.PageNumber = i + 1;
- var pagesize = PDFViewer.Document.GetPageSize(i);
- item.PageSize = $"{pagesize.Width}mm*{pagesize.Height} mm";
- PageEditItems.Add(item);
- }
- isInitaling = false;
- }
- /// <summary>
- /// 刷新书签列表
- /// </summary>
- public void RefreshBookMarkList()
- {
- if (PDFViewer != null)
- {
- var booklist = PDFViewer.Document.GetBookmarkList();
- if (booklist == null)
- {
- return;
- }
- //获取所有书签的Index集合
- List<int> marks = new List<int>();
- for (int i = 0; i < booklist.Count; i++)
- {
- marks.Add(booklist[i].PageIndex);
- }
- //不能只遍历marks集合,考虑书签集合元素删除的情况
- for (int k = 0; k < PageEditItems.Count; k++)
- {
- if (marks.Contains(k))
- PageEditItems[k].HaveBookMark = true;
- else
- PageEditItems[k].HaveBookMark = false;
- }
- }
- }
- /// <summary>
- /// 刷新指定范围的图片
- /// </summary>
- /// <param name="startIndex"></param>
- /// <param name="endIndex"></param>
- private async void RefreshItemImage(int startIndex,int endIndex)
- {
- for (int i = startIndex; i <=endIndex;i++)
- {
- if (i <= PDFViewer.Document.PageCount - 1&&i>=0)
- {
- //宽高为样式中图片控件宽高
- await PDFViewer.GetThumbnail(i, 208, 294);
- }
- }
- }
- #region Navigate
- public bool IsNavigationTarget(NavigationContext navigationContext)
- {
- return true;
- }
- public void OnNavigatedFrom(NavigationContext navigationContext)
- {
-
- }
- /// <summary>
- /// 从其他页面导航过来的时候会触发
- /// 考虑只有在页面编辑的时候会进行页面的删减,可以尝试逻辑优化:仅第一次进入页面编辑时重新刷新页面
- /// </summary>
- /// <param name="navigationContext"></param>
- public void OnNavigatedTo(NavigationContext navigationContext)
- {
- navigationContext.Parameters.TryGetValue<ViewContentViewModel>(ParameterNames.ViewContentViewModel, out viewContentViewModel);
- navigationContext.Parameters.TryGetValue<CPDFViewer>(ParameterNames.PDFViewer, out PDFViewer);
- if (PDFViewer != null)
- {
- PDFViewer.OnThumbnailGenerated += PDFViewer_OnThumbnailGenerated;
- GetSourceItems();
- RefreshBookMarkList();
- }
- }
- #endregion
- /// <summary>
- /// 从底层库获取对应页面的图片
- /// </summary>
- /// <param name="pageIndex"></param>
- /// <param name="thumb"></param>
- /// <param name="w"></param>
- /// <param name="h"></param>
- private void PDFViewer_OnThumbnailGenerated(int pageIndex, byte[] thumb, int w, int h)
- {
- try
- {
- if (PageEditItems.Count >= pageIndex + 1&&!PageEditItems[pageIndex].IsGetImage)
- {
- PixelFormat fmt = PixelFormats.Bgra32;
- BitmapSource bps = BitmapSource.Create(w, h, 96.0, 96.0, fmt, null, thumb, (w * fmt.BitsPerPixel + 7) / 8);
- PageEditItems[pageIndex].Image = bps;
- PageEditItems[pageIndex].IsGetImage = true;
- }
- }
- catch
- {
-
- }
- }
- }
- }
|