|
@@ -19,6 +19,8 @@ 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
|
|
|
{
|
|
@@ -31,6 +33,8 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
|
|
|
private IDialogService dialogs;
|
|
|
|
|
|
+ private IEventAggregator eventor;
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 是否正在初始化所有列表项,正在初始化时,不刷新图片
|
|
|
/// </summary>
|
|
@@ -44,6 +48,8 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
/// </summary>
|
|
|
private DispatcherTimer timer = new DispatcherTimer();
|
|
|
|
|
|
+ private string unicode = null;
|
|
|
+
|
|
|
#region 属性
|
|
|
private Visibility isvisible;
|
|
|
|
|
@@ -57,19 +63,24 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
}
|
|
|
|
|
|
|
|
|
- #endregion
|
|
|
-
|
|
|
- #region 命令
|
|
|
+ private int selecedIndex;
|
|
|
/// <summary>
|
|
|
- /// 是否显示 事件
|
|
|
+ /// 选中项的索引
|
|
|
/// </summary>
|
|
|
- public DelegateCommand<object> IsVisibleChangedCommmand { get; set; }
|
|
|
+ public int SelectedIndex
|
|
|
+ {
|
|
|
+ get { return selecedIndex; }
|
|
|
+ set
|
|
|
+ {
|
|
|
+ SetProperty(ref selecedIndex, value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
- public DelegateCommand<object> ScollChangedComamnd { get; set; }
|
|
|
+ #endregion
|
|
|
|
|
|
- public DelegateCommand<object> ScrollCommand { get; set; }
|
|
|
+ #region 命令
|
|
|
|
|
|
- public DelegateCommand LoadCommand { get; set; }
|
|
|
#endregion
|
|
|
|
|
|
/// <summary>
|
|
@@ -77,111 +88,25 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
/// </summary>
|
|
|
public ObservableCollection<PageEditItem> PageEditItems { get; set; }
|
|
|
|
|
|
- public PageEditContentViewModel(IDialogService dialogService)
|
|
|
+ public PageEditContentViewModel(IDialogService dialogService, IEventAggregator eventAggregator)
|
|
|
{
|
|
|
dialogs = dialogService;
|
|
|
+ eventor = eventAggregator;
|
|
|
+ unicode = App.mainWindowViewModel.SelectedItem.Unicode;
|
|
|
PageEditItems = new ObservableCollection<PageEditItem>();
|
|
|
- timer.Interval = TimeSpan.FromSeconds(0.2);
|
|
|
- timer.Tick += Timer_Tick;
|
|
|
+ eventAggregator.GetEvent<PageEditRefreshEvent>().Subscribe(OnPageEditRefreshEvent, e=>e.Unicode== unicode);
|
|
|
|
|
|
-
|
|
|
- IsVisibleChangedCommmand = new DelegateCommand<object>(IsVisibleChangedEvent);
|
|
|
- ScollChangedComamnd = new DelegateCommand<object>(ScrollChanged);
|
|
|
- ScrollCommand = new DelegateCommand<object>(ScrollEvent);
|
|
|
- LoadCommand = new DelegateCommand(ControlLoad);
|
|
|
}
|
|
|
|
|
|
|
|
|
#region 事件
|
|
|
- /// <summary>
|
|
|
- /// 判断鼠标滚轮是否停止滚动的事件
|
|
|
- /// </summary>
|
|
|
- /// <param name="sender"></param>
|
|
|
- /// <param name="e"></param>
|
|
|
- private void Timer_Tick(object sender, EventArgs e)
|
|
|
- {
|
|
|
- if (PDFViewer != null && PDFViewer.Document != null)
|
|
|
- {
|
|
|
- timer.Stop();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- /// 鼠标滚轮滚动时触发的事件
|
|
|
- /// </summary>
|
|
|
- /// <param name="e"></param>
|
|
|
- private void ScrollChanged(object e)
|
|
|
- {
|
|
|
- var args = (ScrollChangedEventArgs)e;
|
|
|
- var scrollviewer = args.OriginalSource as ScrollViewer;
|
|
|
- if (scrollviewer == null)
|
|
|
- return;
|
|
|
- if (args != null && PDFViewer != null)
|
|
|
- {
|
|
|
- //确保第一次所有item添加完之后再刷新图片
|
|
|
- //鼠标拖动过程中不拿图
|
|
|
- if (!isInitaling&& scrollType== ScrollEventType.EndScroll)
|
|
|
- {
|
|
|
- //size是拿的DataTemplate的宽高
|
|
|
- var range = GetRoughFromView(scrollviewer, new Size(208, 320), new Thickness(5, 10, 5, 10));
|
|
|
- RefreshItemImage(range.Item1, range.Item2 + 1);
|
|
|
- RefreshBookMarkList();
|
|
|
- }
|
|
|
- else//其余滚动的时候,只有滚动暂停后再刷图
|
|
|
- {
|
|
|
- if (args.VerticalChange != 0)
|
|
|
- {
|
|
|
- timer.Start();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- /// 拖动右侧滑块时触发的事件
|
|
|
- /// </summary>
|
|
|
- /// <param name="e"></param>
|
|
|
- private void ScrollEvent(object e)
|
|
|
+ private void OnPageEditRefreshEvent(PageEditRefreshEventArgs e)
|
|
|
{
|
|
|
- var args = (ScrollEventArgs)e;
|
|
|
- scrollType = args.ScrollEventType;
|
|
|
- var scroll = CommonHelper.FindVisualParent<ScrollViewer>(args.OriginalSource as ScrollBar);
|
|
|
- if(args!=null&&PDFViewer!=null&&scroll!=null)
|
|
|
- {
|
|
|
- if(scrollType == ScrollEventType.EndScroll)
|
|
|
- {
|
|
|
- //size是拿的DataTemplate的宽高
|
|
|
- var range = GetRoughFromView(scroll, new Size(208, 320), new Thickness(5, 10, 5, 10));
|
|
|
- RefreshItemImage(range.Item1, range.Item2+1);
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
+ //UI发送事件过来通知刷新图片时
|
|
|
+ //调整逻辑,前后预加载5页
|
|
|
+ RefreshItemImage(e.PageRange.Item1-5,e.PageRange.Item2+5);
|
|
|
}
|
|
|
|
|
|
- private void IsVisibleChangedEvent(object e)
|
|
|
- {
|
|
|
- var args = (DependencyPropertyChangedEventArgs)e;
|
|
|
- if (args == null)
|
|
|
- return;
|
|
|
- if ((Visibility)args.NewValue == Visibility.Visible)
|
|
|
- {
|
|
|
- GetSourceItems();
|
|
|
- RefreshBookMarkList();
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private void ControlLoad()
|
|
|
- {
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- private void Load(object e)
|
|
|
- {
|
|
|
- Debug.Write("Loaded");
|
|
|
- }
|
|
|
#endregion
|
|
|
|
|
|
/// <summary>
|
|
@@ -198,7 +123,6 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
var pagesize = PDFViewer.Document.GetPageSize(i);
|
|
|
|
|
|
item.PageSize = $"{pagesize.Width}mm*{pagesize.Height} mm";
|
|
|
- RefreshItemImage(i,i);
|
|
|
PageEditItems.Add(item);
|
|
|
}
|
|
|
isInitaling = false;
|
|
@@ -266,66 +190,23 @@ namespace PDF_Office.ViewModels.PageEdit
|
|
|
|
|
|
/// <summary>
|
|
|
/// 从其他页面导航过来的时候会触发
|
|
|
+ /// 考虑只有在页面编辑的时候会进行页面的删减,可以尝试逻辑优化:仅第一次进入页面编辑时重新刷新页面
|
|
|
/// </summary>
|
|
|
/// <param name="navigationContext"></param>
|
|
|
- public async void OnNavigatedTo(NavigationContext navigationContext)
|
|
|
+ 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;
|
|
|
- //每次进入前 更新item项,刷新书签列表
|
|
|
- await Task.Run(() =>
|
|
|
- {
|
|
|
- App.Current.Dispatcher.Invoke(() =>
|
|
|
- {
|
|
|
- GetSourceItems();
|
|
|
- });
|
|
|
- });
|
|
|
- RefreshBookMarkList();
|
|
|
- }
|
|
|
- }
|
|
|
- #endregion
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// 获取滑轨的垂直偏移量,结合item总数和Item尺寸以及间隔,来估算实际展示的item范围
|
|
|
- /// 返回值为页面范围 从1开始
|
|
|
- /// </summary>
|
|
|
- /// <param name="scrollViewer"></param>
|
|
|
- /// <param name="itemSize"></param>
|
|
|
- /// <param name="itemMargin"></param>
|
|
|
- /// <returns></returns>
|
|
|
- private Tuple<int, int, int> GetRoughFromView(ScrollViewer scrollViewer, Size itemSize, Thickness itemMargin)
|
|
|
- {
|
|
|
- if (PDFViewer == null || PDFViewer.Document == null || scrollViewer == null || scrollViewer.ActualHeight == 0 || scrollViewer.ActualWidth == 0|| scrollViewer.ExtentHeight==0)//视图展开
|
|
|
- return new Tuple<int, int, int>(0, 0, 0);
|
|
|
- try
|
|
|
- {
|
|
|
- var currentHeight = scrollViewer.ActualHeight;
|
|
|
- var currentWidth = scrollViewer.ActualWidth;
|
|
|
- //计算当前窗口大小能显示的行数和列数
|
|
|
- var columnCount = (int)(currentWidth / (itemSize.Width + itemMargin.Left));
|
|
|
- var rowCount = (int)Math.Ceiling(currentHeight / (itemSize.Height + itemMargin.Bottom));
|
|
|
-
|
|
|
- var preItemCount = (int)((scrollViewer.VerticalOffset / scrollViewer.ExtentHeight) * ((PDFViewer.Document.PageCount + columnCount - 1) / columnCount));//滑动百分比*行数 = 大概的垂直位置
|
|
|
- preItemCount = preItemCount * columnCount;
|
|
|
- var preEnd = (int)(((scrollViewer.VerticalOffset + scrollViewer.ActualHeight) / scrollViewer.ExtentHeight) * ((PDFViewer.Document.PageCount + columnCount - 1) / columnCount));
|
|
|
- preEnd = preEnd * columnCount + columnCount - 1;
|
|
|
-
|
|
|
- var middle = (int)Math.Ceiling(preItemCount + preEnd / 2d);
|
|
|
-
|
|
|
- return new Tuple<int, int, int>(
|
|
|
- Math.Max(preItemCount, 0),
|
|
|
- Math.Min(PageEditItems.Count, preEnd),
|
|
|
- middle);
|
|
|
- }
|
|
|
- catch (Exception ex)
|
|
|
- {
|
|
|
+ GetSourceItems();
|
|
|
|
|
|
+ RefreshBookMarkList();
|
|
|
}
|
|
|
- return new Tuple<int, int, int>(0, 0, 0);
|
|
|
}
|
|
|
+ #endregion
|
|
|
|
|
|
/// <summary>
|
|
|
/// 从底层库获取对应页面的图片
|