using PDF_Master.ViewModels;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Prism.Events;
using PDF_Master.EventAggregators;
using PDF_Master.CustomControl;
using Prism.Ioc;
using PDF_Master.Helper;
using System.IO;
using ComPDFKit.PDFDocument;
using PDFSettings.Settings;
using PDF_Master.Properties;
using System.Windows.Interop;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
namespace PDF_Master.Views
{
///
/// MainWindow.xaml 的交互逻辑
///
public partial class MainWindow : Window
{
public IEventAggregator aggregator;
public IRegionManager region;
public MainWindow()
{
InitializeComponent();
this.SourceInitialized += MainWindow_SourceInitialized;
}
private void MainWindow_SourceInitialized(object sender, EventArgs e)
{
try
{
//限制应用多开,显示已有窗体或者直接打开文件
IntPtr hwnd = new WindowInteropHelper(this).Handle;
HwndSource.FromHwnd(hwnd).AddHook(new HwndSourceHook(WndProc));
}
catch { }
}
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == App.MsgId)
{
try
{
int msgLength = (int)(lParam);
IntPtr mapHandle = Win32Helper.OpenFileMapping((int)Win32Helper.FileMapAccessType.Read, 0, "Global\\sharePathNotify");
IntPtr readPtr = Win32Helper.MapViewOfFileEx(mapHandle, Win32Helper.FileMapAccessType.Read, 0, 0, UIntPtr.Zero, IntPtr.Zero);
string filePath = Marshal.PtrToStringAuto(readPtr, msgLength);
Win32Helper.UnmapViewOfFile(readPtr);
Win32Helper.CloseHandle(mapHandle);
MD5 currMd5 = MD5.Create();
byte[] hashArray = currMd5.ComputeHash(Encoding.Default.GetBytes(filePath));
StringBuilder hexBuilder = new StringBuilder();
foreach (byte code in hashArray)
{
hexBuilder.AppendFormat("{0:X2}", code);
}
IntPtr waitPtr = Win32Helper.OpenEvent(0x0002, false, "Global\\shareWaitNotify" + hexBuilder.ToString());
if (waitPtr != IntPtr.Zero)
{
Win32Helper.SetEvent(waitPtr);
Win32Helper.CloseHandle(waitPtr);
}
if (File.Exists(filePath))
{
//打开传过来的文件路径
if (App.OpenedFileList.Contains(App.GuidPDFPath))
{
//如果已经打开时,则选中文档所在页签
App.mainWindowViewModel.SelectItem(App.GuidPDFPath);
}
else
{
(this.DataContext as MainWindowViewModel).AddTabItem(filePath);
}
if (WindowState == WindowState.Minimized)
{
WindowState = WindowState.Normal;
}
Activate();
}
}
catch (Exception ex)
{
}
handled = true;
return (IntPtr)(1);
}
if (msg == App.WakeId)
{
//将现有窗口激活 并前置
try
{
if (WindowState == WindowState.Minimized)
{
WindowState = WindowState.Normal;
}
Activate();
handled = true;
}
catch (Exception ex)
{
}
return (IntPtr)(1);
}
return IntPtr.Zero;
}
///
/// 此类因为Dragablz控件的原因需要特殊处理
///
///
public MainWindow(IEventAggregator eventAggregator, IContainerProvider container) :this()
{
aggregator = eventAggregator;
eventAggregator?.GetEvent().Publish(new DragablzWindowEventArgs() { TabControl = TabablzControl, Type = DragablzWindowEventType.Opened });
}
private void BtnMiniSize_Click(object sender, RoutedEventArgs e)
{
System.Windows.SystemCommands.MinimizeWindow(this);
}
private void BtnClose_Click(object sender, RoutedEventArgs e)
{
System.Windows.SystemCommands.CloseWindow(this);
}
private void BtnReStore_Click(object sender, RoutedEventArgs e)
{
if (this.WindowState == WindowState.Maximized)
{
System.Windows.SystemCommands.RestoreWindow(this);
}
else
{
System.Windows.SystemCommands.MaximizeWindow(this);
}
}
private void Window_Activated(object sender, EventArgs e)
{
App.Current.MainWindow = this;
App.mainWindowViewModel = this.DataContext as MainWindowViewModel;
aggregator?.GetEvent().Publish(new DragablzWindowEventArgs() { TabControl = TabablzControl, Type = DragablzWindowEventType.Activated });
}
private void Window_Closed(object sender, EventArgs e)
{
aggregator?.GetEvent().Publish(new DragablzWindowEventArgs() { TabControl = TabablzControl, Type = DragablzWindowEventType.Closed });
}
public void LoadPdfViewer(string[] filePaths)
{
var content = App.mainWindowViewModel.SelectedItem.DataContext as MainContentViewModel;
if (filePaths.Count() == 1)
{
if (App.OpenedFileList.Contains(filePaths[0]))
{
App.mainWindowViewModel.SelectItem(filePaths[0]);
}
else
{
content.OpenFile(filePaths[0]);
}
ToolMethod.SetFileThumbImg(filePaths[0]);
}
else
{
var fileList = filePaths.ToList().Where(x => !App.OpenedFileList.Exists(y => y == x)).ToList();
if (fileList.Count <= 0)
return;
content.OpenFile(filePaths[0]);
for (int i = 1; i < fileList.Count(); i++)
{
if (!App.OpenedFileList.Contains(fileList[i]))
{
App.mainWindowViewModel.AddTabItem(fileList[i]);
}
ToolMethod.SetFileThumbImg(fileList[i]);
}
}
Settings.Default.Save();
}
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
var width = StkPnlRight.ActualWidth;
BtnAdd.Margin = new Thickness(8,13,width,7);
if (this.WindowState == WindowState.Maximized)
{
ico_max.Visibility = Visibility.Collapsed;
}
else
{
ico_max.Visibility = Visibility.Visible;
}
}
private void TxtRename_PreviewKeyDown(object sender, KeyEventArgs e)
{
if(e.Key == Key.Enter)
{
TabablzControl.Focus();
}
}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (!(DataContext as MainWindowViewModel).closeAllTabItem())
{
e.Cancel = true;
}
}
private void Window_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
//通过转移焦点来使文本框触发失去焦点事件
var uiElement = FocusManager.GetFocusedElement(this);
if (uiElement != null)
{
var textBox = uiElement as TextBox;
//如果是下拉框本身的可输入文本框,则点击下拉框或者下拉选项时不失去焦点
var parent = CommonHelper.FindVisualParent(textBox);
if (parent != null)
{
var visual = VisualTreeHelper.HitTest(parent, e.GetPosition(parent));
if (visual != null)
{
//点击下拉框展开按钮时 不失去焦点
var item = CommonHelper.FindVisualParent(visual.VisualHit);
if (item != null)
{
return;
}
}
//选择下拉选项时,返回,不失去焦点,否则下拉框的其他选项无法选中
if(parent.IsDropDownOpen)
{
return;
}
}
//点击其他非文本框区域时,失去焦点
if (textBox != null)
{
GridRoot.Focusable = true;
GridRoot.Focus();
}
}
}
}
}