using Microsoft.Win32; using Prism.Commands; using Prism.Mvvm; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ComPDFKitViewer.PdfViewer; using Prism.Regions; using DryIoc; using System.Diagnostics; using Prism.Services.Dialogs; using PDF_Office.CustomControl; using PDF_Office.Model; using System.Windows; using System.Windows.Controls; namespace PDF_Office.ViewModels { public class ViewContentViewModel : BindableBase, INavigationAware { #region 属性、变量 private CPDFViewer PDFViewer { get; set; } private MainContentViewModel mainViewModel { get; set; } public IRegionManager region; public IDialogService dialogs; public string ViwerRegionName { get; set; } public string BOTARegionName { get; set; } public string PropertyRegionName { get; set; } public string ToolContentRegionName { get; set; } public string ToolsBarContentRegionName { get; set; } private int gridToolRow = 1; /// /// 控制ToolContent的Row /// public int GridToolRow { get { return gridToolRow; } set { SetProperty(ref gridToolRow, value); } } private int gridToolRowSpan = 3; /// /// 控制ToolContent的RowSpan /// public int GridToolRowSpan { get { return gridToolRowSpan; } set { SetProperty(ref gridToolRowSpan, value); } } private Visibility toolContentVisible = Visibility.Visible; /// /// 控制Content的显示 用于显示水印、贝茨码、密文等功能模块 /// 留意:显示前需要先注入内容、设置好行和跨行数 /// public Visibility ToolContentVisible { get { return toolContentVisible; } set { SetProperty(ref toolContentVisible, value); } } private Visibility isLoading = Visibility.Collapsed; /// /// 是否正在加载中 /// public Visibility IsLoading { get { return isLoading; } set { SetProperty(ref isLoading, value); } } private Visibility toolsbarContentVisible = Visibility.Visible; /// /// 控制Content的显示 /// 留意:显示前需要先注入内容、设置好行和跨行数 /// public Visibility ToolsBarContentVisible { get { return toolsbarContentVisible; } set { SetProperty(ref toolsbarContentVisible, value); } } private Dictionary regionNameByTabItem; private Dictionary barContentByTabItem; private string previousBar = ""; private string currentBar = ""; /// /// 用来避免重复触发导航事件的标志符 /// private bool isOpenFile = false; /// /// 鼠标滚轮缩放的缩放值 /// private double[] zoomLevel = { 1.00f, 10, 25, 50, 75, 100, 125, 150, 200, 300, 400, 600, 800, 1000 }; #endregion #region 命令 public DelegateCommand LoadFile { get; set; } public DelegateCommand Load { get; set; } public DelegateCommand TabControlSelectionChangedCommand { get; set; } #endregion public ViewContentViewModel(IRegionManager regionManager, IDialogService dialogService) { region = regionManager; dialogs = dialogService; LoadFile = new DelegateCommand(loadFile); Load = new DelegateCommand(LoadControl); TabControlSelectionChangedCommand = new DelegateCommand(TabControlSelectonChangedEvent); ViwerRegionName = Guid.NewGuid().ToString(); BOTARegionName = Guid.NewGuid().ToString(); PropertyRegionName = Guid.NewGuid().ToString(); //未显示时无法注册上Region名称 ToolContentVisible = Visibility.Visible; ToolContentRegionName = Guid.NewGuid().ToString(); ToolsBarContentRegionName = Guid.NewGuid().ToString(); ToolContentVisible = Visibility.Collapsed; ToolsBarContentVisible = Visibility.Collapsed; regionNameByTabItem = new Dictionary(); barContentByTabItem = new Dictionary(); InitialregionNameByTabItem(ref regionNameByTabItem); InitialbarContentByTabItem(ref barContentByTabItem); } private void InitialregionNameByTabItem(ref Dictionary dictionary) { dictionary.Add("TabItemPageEdit", ToolContentRegionName); dictionary.Add("TabItemTool", ToolsBarContentRegionName); } private void InitialbarContentByTabItem(ref Dictionary dictionary) { dictionary.Add("TabItemPageEdit", "PageEditContent"); dictionary.Add("TabItemTool", "ToolsBarContent"); } private void LoadControl() { //在构造函数中使用Region需要借助Dispatcher 确保UI已经加载完成,加载BOTA区域 System.Windows.Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, new Action(() => { region.RequestNavigate(BOTARegionName, "BOTAContent"); } )); } /// /// 将PDFViwer添加到Region /// private void loadFile() { PDFViewer.MouseWheelZoomHandler += PdfViewer_MouseWheelZoomHandler; region.AddToRegion(ViwerRegionName, PDFViewer); } /// /// 选项卡切换事件 /// /// private void TabControlSelectonChangedEvent(object e) { var args = e as SelectionChangedEventArgs; if (args != null) { var item = args.AddedItems[0] as TabItem; currentBar = item.Name; if (previousBar != currentBar) { currentBar = item.Name; if (previousBar != currentBar) { if (previousBar != "" && (currentBar == "TabItemPageEdit" || currentBar == "TabItemTool")) { ExitToolMode(); } if ((currentBar == "TabItemPageEdit" || currentBar == "TabItemTool")) { EnterSelectedBar(currentBar); } previousBar = currentBar; } } } } #region PDFViewer鼠标滚轮缩放事件 public void PdfViewer_MouseWheelZoomHandler(object sender, bool e) { double newZoom = CheckZoomLevel(PDFViewer.ZoomFactor + (e ? 0.01 : -0.01), e); PDFViewer.Zoom(newZoom); } private double CheckZoomLevel(double zoom, bool IsGrowth) { double standardZoom = 100; if (zoom <= 0.01) { return 0.01; } if (zoom >= 10) { return 10; } zoom *= 100; for (int i = 0; i < zoomLevel.Length - 1; i++) { if (zoom > zoomLevel[i] && zoom <= zoomLevel[i + 1] && IsGrowth) { standardZoom = zoomLevel[i + 1]; break; } if (zoom >= zoomLevel[i] && zoom < zoomLevel[i + 1] && !IsGrowth) { standardZoom = zoomLevel[i]; break; } } return standardZoom / 100; } #endregion #region Navigate public void OnNavigatedTo(NavigationContext navigationContext) { if (isOpenFile) return; var mainVM = navigationContext.Parameters[ParameterNames.MainViewModel] as MainContentViewModel; if (mainVM != null) { mainViewModel = mainVM; } var pdfview = navigationContext.Parameters[ParameterNames.PDFViewer] as CPDFViewer; if (pdfview != null) { PDFViewer = pdfview; loadFile(); } isOpenFile = true; } public bool IsNavigationTarget(NavigationContext navigationContext) { return true; } public void OnNavigatedFrom(NavigationContext navigationContext) { } #endregion #region 方法 /// /// 显示前添加内容到Region /// /// private void ShowContent(string currentBar) { //显示页面编辑 if (currentBar == "TabItemPageEdit") { if (GridToolRow != 1) { GridToolRow = 1; } if (GridToolRowSpan != 3) { GridToolRowSpan = 3; } ToolContentVisible = Visibility.Visible; ToolContentVisible = Visibility.Visible; } else { if (GridToolRow != 1) { GridToolRow = 1; } ToolsBarContentVisible = Visibility.Visible; } } /// /// 进入工具编辑(如页面编辑、水印、密文等)模式 /// /// 要导航过去的控件名称 /// 导航需要传送的参数,为空时,默认传送PDFView和ViewContentViewModel private async void EnterToolMode(string targetToolMode, NavigationParameters valuePairs = null) { IsLoading = Visibility.Visible; await Task.Delay(3); NavigationParameters param = new NavigationParameters(); if (valuePairs == null) { param.Add(ParameterNames.PDFViewer, PDFViewer); param.Add(ParameterNames.ViewContentViewModel, this); } else//有传入其他内容的参数时 { param = valuePairs; } region.RequestNavigate(ToolContentRegionName, targetToolMode, param); ShowContent(currentBar); IsLoading = Visibility.Collapsed; } private void EnterSelectedBar(string currentBar) { NavigationParameters param = new NavigationParameters(); param.Add(ParameterNames.PDFViewer, PDFViewer); param.Add(ParameterNames.ViewContentViewModel, this); region.RequestNavigate(regionNameByTabItem[currentBar], barContentByTabItem[currentBar], param); ShowContent(currentBar); } /// /// 退出工具(水印、密文等)编辑模式,隐藏ToolContent /// public void ExitToolMode() { ToolContentVisible = Visibility.Collapsed; ToolsBarContentVisible = Visibility.Collapsed; } #endregion } }