[cleanup] 清理和优化代码

This commit is contained in:
Dubi906w 2024-06-05 20:25:26 +08:00
parent 72f703ea0c
commit 2b42a18d1b
23 changed files with 2005 additions and 2563 deletions

View File

@ -13,15 +13,11 @@ using MessageBox = System.Windows.MessageBox;
using System.Runtime.InteropServices;
using System.Windows.Interop;
namespace Ink_Canvas
{
public partial class MainWindow : Window
{
namespace Ink_Canvas {
public partial class MainWindow : Window {
#region Window Initialization
public MainWindow()
{
public MainWindow() {
/*
Topmost == false / currentMode != 0
PPT BtnPPTSlideShowEnd.Visibility
@ -46,39 +42,36 @@ namespace Ink_Canvas
ViewBoxStackPanelMain.Visibility = Visibility.Collapsed;
ViewBoxStackPanelShapes.Visibility = Visibility.Collapsed;
ViewboxFloatingBar.Margin = new Thickness((SystemParameters.WorkArea.Width - 284) / 2, SystemParameters.WorkArea.Height - 60, -2000, -200);
ViewboxFloatingBar.Margin = new Thickness((SystemParameters.WorkArea.Width - 284) / 2,
SystemParameters.WorkArea.Height - 60, -2000, -200);
ViewboxFloatingBarMarginAnimation(100, true);
try
{
try {
if (File.Exists("debug.ini")) Label.Visibility = Visibility.Visible;
}
catch (Exception ex)
{
catch (Exception ex) {
LogHelper.WriteLogToFile(ex.ToString(), LogHelper.LogType.Error);
}
try
{
if (File.Exists("Log.txt"))
{
FileInfo fileInfo = new FileInfo("Log.txt");
long fileSizeInKB = fileInfo.Length / 1024;
try {
if (File.Exists("Log.txt")) {
var fileInfo = new FileInfo("Log.txt");
var fileSizeInKB = fileInfo.Length / 1024;
if (fileSizeInKB > 512)
{
try
{
try {
File.Delete("Log.txt");
LogHelper.WriteLogToFile("The Log.txt file has been successfully deleted. Original file size: " + fileSizeInKB + " KB", LogHelper.LogType.Info);
LogHelper.WriteLogToFile(
"The Log.txt file has been successfully deleted. Original file size: " + fileSizeInKB +
" KB", LogHelper.LogType.Info);
}
catch (Exception ex)
{
LogHelper.WriteLogToFile(ex + " | Can not delete the Log.txt file. File size: " + fileSizeInKB + " KB", LogHelper.LogType.Error);
catch (Exception ex) {
LogHelper.WriteLogToFile(
ex + " | Can not delete the Log.txt file. File size: " + fileSizeInKB + " KB",
LogHelper.LogType.Error);
}
}
}
}
catch (Exception ex)
{
catch (Exception ex) {
LogHelper.WriteLogToFile(ex.ToString(), LogHelper.LogType.Error);
}
@ -88,12 +81,10 @@ namespace Ink_Canvas
inkCanvas.Strokes.StrokesChanged += StrokesOnStrokesChanged;
Microsoft.Win32.SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged;
try
{
try {
if (File.Exists("SpecialVersion.ini")) SpecialVersionResetToSuggestion_Click();
}
catch (Exception ex)
{
catch (Exception ex) {
LogHelper.WriteLogToFile(ex.ToString(), LogHelper.LogType.Error);
}
@ -105,15 +96,13 @@ namespace Ink_Canvas
#region Ink Canvas Functions
Color Ink_DefaultColor = Colors.Red;
private Color Ink_DefaultColor = Colors.Red;
DrawingAttributes drawingAttributes;
private void loadPenCanvas()
{
try
{
private DrawingAttributes drawingAttributes;
double alpha = Settings.Canvas.InkAlpha;
private void loadPenCanvas() {
try {
var alpha = Settings.Canvas.InkAlpha;
Trace.WriteLine(alpha);
//drawingAttributes = new DrawingAttributes();
drawingAttributes = inkCanvas.DefaultDrawingAttributes;
@ -129,51 +118,38 @@ namespace Ink_Canvas
}
catch { }
}
//ApplicationGesture lastApplicationGesture = ApplicationGesture.AllGestures;
DateTime lastGestureTime = DateTime.Now;
private void InkCanvas_Gesture(object sender, InkCanvasGestureEventArgs e)
{
ReadOnlyCollection<GestureRecognitionResult> gestures = e.GetGestureRecognitionResults();
try
{
foreach (GestureRecognitionResult gest in gestures)
{
private DateTime lastGestureTime = DateTime.Now;
private void InkCanvas_Gesture(object sender, InkCanvasGestureEventArgs e) {
var gestures = e.GetGestureRecognitionResults();
try {
foreach (var gest in gestures)
//Trace.WriteLine(string.Format("Gesture: {0}, Confidence: {1}", gest.ApplicationGesture, gest.RecognitionConfidence));
if (StackPanelPPTControls.Visibility == Visibility.Visible)
{
if (StackPanelPPTControls.Visibility == Visibility.Visible) {
if (gest.ApplicationGesture == ApplicationGesture.Left)
{
BtnPPTSlidesDown_Click(BtnPPTSlidesDown, null);
}
if (gest.ApplicationGesture == ApplicationGesture.Right)
{
BtnPPTSlidesUp_Click(BtnPPTSlidesUp, null);
}
}
}
}
catch { }
}
private void inkCanvas_EditingModeChanged(object sender, RoutedEventArgs e)
{
private void inkCanvas_EditingModeChanged(object sender, RoutedEventArgs e) {
var inkCanvas1 = sender as InkCanvas;
if (inkCanvas1 == null) return;
if (Settings.Canvas.IsShowCursor)
{
if (Settings.Canvas.IsShowCursor) {
if (inkCanvas1.EditingMode == InkCanvasEditingMode.Ink || drawingShapeMode != 0)
{
inkCanvas1.ForceCursor = true;
}
else
{
inkCanvas1.ForceCursor = false;
}
}
else
{
else {
inkCanvas1.ForceCursor = false;
}
if (inkCanvas1.EditingMode == InkCanvasEditingMode.Ink) forcePointEraser = !forcePointEraser;
}
@ -183,18 +159,14 @@ namespace Ink_Canvas
public static Settings Settings = new Settings();
public static string settingsFileName = "Settings.json";
bool isLoaded = false;
private bool isLoaded = false;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
private void Window_Loaded(object sender, RoutedEventArgs e) {
loadPenCanvas();
//加载设置
LoadSettings(true);
// HasNewUpdateWindow hasNewUpdateWindow = new HasNewUpdateWindow();
if (Environment.Is64BitProcess)
{
GroupBoxInkRecognition.Visibility = Visibility.Collapsed;
}
if (Environment.Is64BitProcess) GroupBoxInkRecognition.Visibility = Visibility.Collapsed;
ThemeManager.Current.ApplicationTheme = ApplicationTheme.Light;
SystemEvents_UserPreferenceChanged(null, null);
@ -204,65 +176,50 @@ namespace Ink_Canvas
isLoaded = true;
}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) {
LogHelper.WriteLogToFile("Ink Canvas closing", LogHelper.LogType.Event);
if (!CloseIsFromButton && Settings.Advanced.IsSecondConfimeWhenShutdownApp)
{
if (!CloseIsFromButton && Settings.Advanced.IsSecondConfirmWhenShutdownApp) {
e.Cancel = true;
if (MessageBox.Show("是否继续关闭 InkCanvasForClass这将丢失当前未保存的墨迹。", "InkCanvasForClass", MessageBoxButton.OKCancel, MessageBoxImage.Warning) == MessageBoxResult.OK)
{
if (MessageBox.Show("真的狠心关闭 InkCanvasForClass吗", "InkCanvasForClass", MessageBoxButton.OKCancel, MessageBoxImage.Error) == MessageBoxResult.OK)
{
if (MessageBox.Show("是否取消关闭 InkCanvasForClass", "InkCanvasForClass", MessageBoxButton.OKCancel, MessageBoxImage.Error) != MessageBoxResult.OK)
{
if (MessageBox.Show("是否继续关闭 InkCanvasForClass这将丢失当前未保存的墨迹。", "InkCanvasForClass",
MessageBoxButton.OKCancel, MessageBoxImage.Warning) == MessageBoxResult.OK)
if (MessageBox.Show("真的狠心关闭 InkCanvasForClass吗", "InkCanvasForClass", MessageBoxButton.OKCancel,
MessageBoxImage.Error) == MessageBoxResult.OK)
if (MessageBox.Show("是否取消关闭 InkCanvasForClass", "InkCanvasForClass", MessageBoxButton.OKCancel,
MessageBoxImage.Error) != MessageBoxResult.OK)
e.Cancel = false;
}
}
}
}
if (e.Cancel)
{
LogHelper.WriteLogToFile("Ink Canvas closing cancelled", LogHelper.LogType.Event);
}
if (e.Cancel) LogHelper.WriteLogToFile("Ink Canvas closing cancelled", LogHelper.LogType.Event);
}
private void Window_Closed(object sender, EventArgs e)
{
private void Window_Closed(object sender, EventArgs e) {
LogHelper.WriteLogToFile("Ink Canvas closed", LogHelper.LogType.Event);
}
private async void AutoUpdate()
{
private async void AutoUpdate() {
AvailableLatestVersion = await AutoUpdateHelper.CheckForUpdates();
if (AvailableLatestVersion != null)
{
bool IsDownloadSuccessful = false;
if (AvailableLatestVersion != null) {
var IsDownloadSuccessful = false;
IsDownloadSuccessful = await AutoUpdateHelper.DownloadSetupFileAndSaveStatus(AvailableLatestVersion);
if (IsDownloadSuccessful)
{
if (!Settings.Startup.IsAutoUpdateWithSilence)
{
if (MessageBox.Show("InkCanvasForClass 新版本安装包已下载完成,是否立即更新?", "InkCanvasForClass New Version Available", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
{
AutoUpdateHelper.InstallNewVersionApp(AvailableLatestVersion, false);
}
if (IsDownloadSuccessful) {
if (!Settings.Startup.IsAutoUpdateWithSilence) {
if (MessageBox.Show("InkCanvasForClass 新版本安装包已下载完成,是否立即更新?",
"InkCanvasForClass New Version Available", MessageBoxButton.YesNo,
MessageBoxImage.Question) ==
MessageBoxResult.Yes) AutoUpdateHelper.InstallNewVersionApp(AvailableLatestVersion, false);
}
else
{
else {
timerCheckAutoUpdateWithSilence.Start();
}
}
}
else
{
else {
AutoUpdateHelper.DeleteUpdatesFolder();
}
}
#endregion Definations and Loading
}
}

View File

@ -7,23 +7,16 @@ using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
namespace Ink_Canvas
{
public partial class MainWindow : Window
{
bool isFloatingBarFolded = false, isFloatingBarChangingHideMode = false;
namespace Ink_Canvas {
public partial class MainWindow : Window {
private bool isFloatingBarFolded = false, isFloatingBarChangingHideMode = false;
private async void FoldFloatingBar_MouseUp(object sender, MouseButtonEventArgs e)
{
private async void FoldFloatingBar_MouseUp(object sender, MouseButtonEventArgs e) {
// FloatingBarIcons_MouseUp_New(sender);
if (sender == null)
{
foldFloatingBarByUser = false;
}
else
{
foldFloatingBarByUser = true;
}
unfoldFloatingBarByUser = false;
if (isFloatingBarChangingHideMode) return;
@ -33,12 +26,8 @@ namespace Ink_Canvas
isFloatingBarFolded = true;
if (currentMode != 0) ImageBlackboard_MouseUp(null, null);
if (StackPanelCanvasControls.Visibility == Visibility.Visible)
{
if (foldFloatingBarByUser && inkCanvas.Strokes.Count > 2)
{
ShowNotification("正在清空墨迹并收纳至侧边栏,可进入批注模式后通过【撤销】功能来恢复原先墨迹。");
}
}
lastBorderMouseDownObject = sender;
CursorWithDelIcon_Click(sender, null);
SidePannelMarginAnimation(-10);
@ -57,21 +46,17 @@ namespace Ink_Canvas
isFloatingBarChangingHideMode = false;
}
private async void LeftUnFoldButtonDisplayQuickPanel_MouseUp(object sender, MouseButtonEventArgs e)
{
if (Settings.Appearance.IsShowQuickPanel == true)
{
private async void LeftUnFoldButtonDisplayQuickPanel_MouseUp(object sender, MouseButtonEventArgs e) {
if (Settings.Appearance.IsShowQuickPanel == true) {
HideRightQuickPanel();
LeftUnFoldButtonQuickPanel.Visibility = Visibility.Visible;
await Dispatcher.InvokeAsync(() =>
{
ThicknessAnimation marginAnimation = new ThicknessAnimation
{
await Dispatcher.InvokeAsync(() => {
var marginAnimation = new ThicknessAnimation {
Duration = TimeSpan.FromSeconds(0.1),
From = new Thickness(-50, 0, 0, -150),
To = new Thickness(-1, 0, 0, -150)
};
LeftUnFoldButtonQuickPanel.BeginAnimation(FrameworkElement.MarginProperty, marginAnimation);
LeftUnFoldButtonQuickPanel.BeginAnimation(MarginProperty, marginAnimation);
});
await Task.Delay(100);
@ -79,26 +64,22 @@ namespace Ink_Canvas
LeftUnFoldButtonQuickPanel.Margin = new Thickness(-1, 0, 0, -150);
});
}
else
{
else {
UnFoldFloatingBar_MouseUp(sender, e);
}
}
private async void RightUnFoldButtonDisplayQuickPanel_MouseUp(object sender, MouseButtonEventArgs e)
{
if (Settings.Appearance.IsShowQuickPanel == true)
{
private async void RightUnFoldButtonDisplayQuickPanel_MouseUp(object sender, MouseButtonEventArgs e) {
if (Settings.Appearance.IsShowQuickPanel == true) {
HideLeftQuickPanel();
RightUnFoldButtonQuickPanel.Visibility = Visibility.Visible;
await Dispatcher.InvokeAsync(() =>
{
ThicknessAnimation marginAnimation = new ThicknessAnimation
{
await Dispatcher.InvokeAsync(() => {
var marginAnimation = new ThicknessAnimation {
Duration = TimeSpan.FromSeconds(0.1),
From = new Thickness(0, 0, -50, -150),
To = new Thickness(0, 0, -1, -150)
};
RightUnFoldButtonQuickPanel.BeginAnimation(FrameworkElement.MarginProperty, marginAnimation);
RightUnFoldButtonQuickPanel.BeginAnimation(MarginProperty, marginAnimation);
});
await Task.Delay(100);
@ -106,25 +87,20 @@ namespace Ink_Canvas
RightUnFoldButtonQuickPanel.Margin = new Thickness(0, 0, -1, -150);
});
}
else
{
else {
UnFoldFloatingBar_MouseUp(sender, e);
}
}
private async void HideLeftQuickPanel()
{
if (LeftUnFoldButtonQuickPanel.Visibility == Visibility.Visible)
{
await Dispatcher.InvokeAsync(() =>
{
ThicknessAnimation marginAnimation = new ThicknessAnimation
{
private async void HideLeftQuickPanel() {
if (LeftUnFoldButtonQuickPanel.Visibility == Visibility.Visible) {
await Dispatcher.InvokeAsync(() => {
var marginAnimation = new ThicknessAnimation {
Duration = TimeSpan.FromSeconds(0.1),
From = new Thickness(-1, 0, 0, -150),
To = new Thickness(-50, 0, 0, -150)
};
LeftUnFoldButtonQuickPanel.BeginAnimation(FrameworkElement.MarginProperty, marginAnimation);
LeftUnFoldButtonQuickPanel.BeginAnimation(MarginProperty, marginAnimation);
});
await Task.Delay(100);
@ -135,19 +111,15 @@ namespace Ink_Canvas
}
}
private async void HideRightQuickPanel()
{
if (RightUnFoldButtonQuickPanel.Visibility == Visibility.Visible)
{
await Dispatcher.InvokeAsync(() =>
{
ThicknessAnimation marginAnimation = new ThicknessAnimation
{
private async void HideRightQuickPanel() {
if (RightUnFoldButtonQuickPanel.Visibility == Visibility.Visible) {
await Dispatcher.InvokeAsync(() => {
var marginAnimation = new ThicknessAnimation {
Duration = TimeSpan.FromSeconds(0.1),
From = new Thickness(0, 0, -1, -150),
To = new Thickness(0, 0, -50, -150)
};
RightUnFoldButtonQuickPanel.BeginAnimation(FrameworkElement.MarginProperty, marginAnimation);
RightUnFoldButtonQuickPanel.BeginAnimation(MarginProperty, marginAnimation);
});
await Task.Delay(100);
@ -158,27 +130,20 @@ namespace Ink_Canvas
}
}
private void HideQuickPanel_MouseUp(object sender, MouseButtonEventArgs e)
{
private void HideQuickPanel_MouseUp(object sender, MouseButtonEventArgs e) {
HideLeftQuickPanel();
HideRightQuickPanel();
}
private async void UnFoldFloatingBar_MouseUp(object sender, MouseButtonEventArgs e)
{
await Dispatcher.InvokeAsync(() =>
{
private async void UnFoldFloatingBar_MouseUp(object sender, MouseButtonEventArgs e) {
await Dispatcher.InvokeAsync(() => {
LeftUnFoldButtonQuickPanel.Visibility = Visibility.Collapsed;
RightUnFoldButtonQuickPanel.Visibility = Visibility.Collapsed;
});
if (sender == null || StackPanelPPTControls.Visibility == Visibility.Visible)
{
unfoldFloatingBarByUser = false;
}
else
{
unfoldFloatingBarByUser = true;
}
foldFloatingBarByUser = false;
if (isFloatingBarChangingHideMode) return;
@ -191,53 +156,47 @@ namespace Ink_Canvas
await Task.Delay(0);
await Dispatcher.InvokeAsync(() => {
if (StackPanelPPTControls.Visibility == Visibility.Visible)
{
if (Settings.PowerPointSettings.IsShowBottomPPTNavigationPanel && isDisplayingOrHidingBlackboard == false)
{
if (StackPanelPPTControls.Visibility == Visibility.Visible) {
if (Settings.PowerPointSettings.IsShowBottomPPTNavigationPanel &&
isDisplayingOrHidingBlackboard == false)
AnimationsHelper.ShowWithSlideFromBottomAndFade(BottomViewboxPPTSidesControl);
}
if (Settings.PowerPointSettings.IsShowSidePPTNavigationPanel && isDisplayingOrHidingBlackboard == false)
{
if (Settings.PowerPointSettings.IsShowSidePPTNavigationPanel &&
isDisplayingOrHidingBlackboard == false) {
AnimationsHelper.ShowWithScaleFromLeft(LeftSidePanelForPPTNavigation);
AnimationsHelper.ShowWithScaleFromRight(RightSidePanelForPPTNavigation);
}
}
if (BtnPPTSlideShowEnd.Visibility == Visibility.Visible)
{
ViewboxFloatingBarMarginAnimation(60);
}
else
{
ViewboxFloatingBarMarginAnimation(100, true);
}
SidePannelMarginAnimation(-50, !unfoldFloatingBarByUser);
});
isFloatingBarChangingHideMode = false;
}
private async void SidePannelMarginAnimation(int MarginFromEdge, bool isNoAnimation = false) // Possible value: -50, -10
private async void
SidePannelMarginAnimation(int MarginFromEdge, bool isNoAnimation = false) // Possible value: -50, -10
{
await Dispatcher.InvokeAsync(() => {
if (MarginFromEdge == -10) LeftSidePanel.Visibility = Visibility.Visible;
ThicknessAnimation LeftSidePanelmarginAnimation = new ThicknessAnimation
{
var LeftSidePanelmarginAnimation = new ThicknessAnimation {
Duration = isNoAnimation == true ? TimeSpan.FromSeconds(0) : TimeSpan.FromSeconds(0.175),
From = LeftSidePanel.Margin,
To = new Thickness(MarginFromEdge, 0, 0, -150)
};
LeftSidePanelmarginAnimation.EasingFunction = new CubicEase();
ThicknessAnimation RightSidePanelmarginAnimation = new ThicknessAnimation
{
var RightSidePanelmarginAnimation = new ThicknessAnimation {
Duration = isNoAnimation == true ? TimeSpan.FromSeconds(0) : TimeSpan.FromSeconds(0.175),
From = RightSidePanel.Margin,
To = new Thickness(0, 0, MarginFromEdge, -150)
};
RightSidePanelmarginAnimation.EasingFunction = new CubicEase();
LeftSidePanel.BeginAnimation(FrameworkElement.MarginProperty, LeftSidePanelmarginAnimation);
RightSidePanel.BeginAnimation(FrameworkElement.MarginProperty, RightSidePanelmarginAnimation);
LeftSidePanel.BeginAnimation(MarginProperty, LeftSidePanelmarginAnimation);
RightSidePanel.BeginAnimation(MarginProperty, RightSidePanelmarginAnimation);
});
await Task.Delay(600);

View File

@ -6,13 +6,14 @@ namespace Ink_Canvas {
public partial class MainWindow : Window {
public static bool StartAutomaticallyCreate(string exeName) {
try {
WshShell shell = new WshShell();
IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\" + exeName + ".lnk");
var shell = new WshShell();
var shortcut = (IWshShortcut)shell.CreateShortcut(
Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\" + exeName + ".lnk");
//设置快捷方式的目标所在的位置(源程序完整路径)
shortcut.TargetPath = System.Windows.Forms.Application.ExecutablePath;
//应用程序的工作目录
//当用户没有指定一个具体的目录时,快捷方式的目标应用程序将使用该属性所指定的目录来装载或保存文件。
shortcut.WorkingDirectory = System.Environment.CurrentDirectory;
shortcut.WorkingDirectory = Environment.CurrentDirectory;
//目标应用程序窗口类型(1.Normal window普通窗口,3.Maximized最大化窗口,7.Minimized最小化)
shortcut.WindowStyle = 1;
//快捷方式的描述
@ -21,15 +22,20 @@ namespace Ink_Canvas {
//shortcut.Hotkey = "CTRL+ALT+D";
shortcut.Save();
return true;
} catch (Exception) { }
}
catch (Exception) { }
return false;
}
public static bool StartAutomaticallyDel(string exeName) {
try {
System.IO.File.Delete(Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\" + exeName + ".lnk");
System.IO.File.Delete(Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\" + exeName +
".lnk");
return true;
} catch (Exception) { }
}
catch (Exception) { }
return false;
}
}

View File

@ -7,35 +7,44 @@ using Application = System.Windows.Application;
namespace Ink_Canvas {
public partial class MainWindow : Window {
Color FloatBarForegroundColor = Color.FromRgb(102, 102, 102);
private Color FloatBarForegroundColor = Color.FromRgb(102, 102, 102);
private void SetTheme(string theme) {
if (theme == "Light") {
ResourceDictionary rd1 = new ResourceDictionary() { Source = new Uri("Resources/Styles/Light.xaml", UriKind.Relative) };
var rd1 = new ResourceDictionary()
{ Source = new Uri("Resources/Styles/Light.xaml", UriKind.Relative) };
Application.Current.Resources.MergedDictionaries.Add(rd1);
ResourceDictionary rd2 = new ResourceDictionary() { Source = new Uri("Resources/DrawShapeImageDictionary.xaml", UriKind.Relative) };
var rd2 = new ResourceDictionary()
{ Source = new Uri("Resources/DrawShapeImageDictionary.xaml", UriKind.Relative) };
Application.Current.Resources.MergedDictionaries.Add(rd2);
ResourceDictionary rd3 = new ResourceDictionary() { Source = new Uri("Resources/SeewoImageDictionary.xaml", UriKind.Relative) };
var rd3 = new ResourceDictionary()
{ Source = new Uri("Resources/SeewoImageDictionary.xaml", UriKind.Relative) };
Application.Current.Resources.MergedDictionaries.Add(rd3);
ResourceDictionary rd4 = new ResourceDictionary() { Source = new Uri("Resources/IconImageDictionary.xaml", UriKind.Relative) };
var rd4 = new ResourceDictionary()
{ Source = new Uri("Resources/IconImageDictionary.xaml", UriKind.Relative) };
Application.Current.Resources.MergedDictionaries.Add(rd4);
ThemeManager.SetRequestedTheme(window, ElementTheme.Light);
FloatBarForegroundColor = (Color)Application.Current.FindResource("FloatBarForegroundColor");
} else if (theme == "Dark") {
ResourceDictionary rd1 = new ResourceDictionary() { Source = new Uri("Resources/Styles/Dark.xaml", UriKind.Relative) };
}
else if (theme == "Dark") {
var rd1 = new ResourceDictionary() { Source = new Uri("Resources/Styles/Dark.xaml", UriKind.Relative) };
Application.Current.Resources.MergedDictionaries.Add(rd1);
ResourceDictionary rd2 = new ResourceDictionary() { Source = new Uri("Resources/DrawShapeImageDictionary.xaml", UriKind.Relative) };
var rd2 = new ResourceDictionary()
{ Source = new Uri("Resources/DrawShapeImageDictionary.xaml", UriKind.Relative) };
Application.Current.Resources.MergedDictionaries.Add(rd2);
ResourceDictionary rd3 = new ResourceDictionary() { Source = new Uri("Resources/SeewoImageDictionary.xaml", UriKind.Relative) };
var rd3 = new ResourceDictionary()
{ Source = new Uri("Resources/SeewoImageDictionary.xaml", UriKind.Relative) };
Application.Current.Resources.MergedDictionaries.Add(rd3);
ResourceDictionary rd4 = new ResourceDictionary() { Source = new Uri("Resources/IconImageDictionary.xaml", UriKind.Relative) };
var rd4 = new ResourceDictionary()
{ Source = new Uri("Resources/IconImageDictionary.xaml", UriKind.Relative) };
Application.Current.Resources.MergedDictionaries.Add(rd4);
ThemeManager.SetRequestedTheme(window, ElementTheme.Dark);
@ -44,7 +53,7 @@ namespace Ink_Canvas {
}
}
private void SystemEvents_UserPreferenceChanged(object sender, Microsoft.Win32.UserPreferenceChangedEventArgs e) {
private void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e) {
switch (Settings.Appearance.Theme) {
case 0:
SetTheme("Light");
@ -60,16 +69,17 @@ namespace Ink_Canvas {
}
private bool IsSystemThemeLight() {
bool light = false;
var light = false;
try {
RegistryKey registryKey = Registry.CurrentUser;
RegistryKey themeKey = registryKey.OpenSubKey("software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize");
int keyValue = 0;
if (themeKey != null) {
keyValue = (int)themeKey.GetValue("SystemUsesLightTheme");
}
var registryKey = Registry.CurrentUser;
var themeKey =
registryKey.OpenSubKey("software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize");
var keyValue = 0;
if (themeKey != null) keyValue = (int)themeKey.GetValue("SystemUsesLightTheme");
if (keyValue == 1) light = true;
} catch { }
}
catch { }
return light;
}
}

View File

@ -6,21 +6,21 @@ using System.Windows.Media.Imaging;
namespace Ink_Canvas {
public partial class MainWindow : Window {
StrokeCollection[] strokeCollections = new StrokeCollection[101];
bool[] whiteboadLastModeIsRedo = new bool[101];
StrokeCollection lastTouchDownStrokeCollection = new StrokeCollection();
private StrokeCollection[] strokeCollections = new StrokeCollection[101];
private bool[] whiteboadLastModeIsRedo = new bool[101];
private StrokeCollection lastTouchDownStrokeCollection = new StrokeCollection();
int CurrentWhiteboardIndex = 1;
int WhiteboardTotalCount = 1;
TimeMachineHistory[][] TimeMachineHistories = new TimeMachineHistory[101][]; //最多99页0用来存储非白板时的墨迹以便还原
private int CurrentWhiteboardIndex = 1;
private int WhiteboardTotalCount = 1;
private TimeMachineHistory[][] TimeMachineHistories = new TimeMachineHistory[101][]; //最多99页0用来存储非白板时的墨迹以便还原
private void SaveStrokes(bool isBackupMain = false) {
if (isBackupMain) {
var timeMachineHistory = timeMachine.ExportTimeMachineHistory();
TimeMachineHistories[0] = timeMachineHistory;
timeMachine.ClearStrokeHistory();
} else {
}
else {
var timeMachineHistory = timeMachine.ExportTimeMachineHistory();
TimeMachineHistories[CurrentWhiteboardIndex] = timeMachineHistory;
timeMachine.ClearStrokeHistory();
@ -28,7 +28,6 @@ namespace Ink_Canvas {
}
private void ClearStrokes(bool isErasedByCode) {
_currentCommitType = CommitReason.ClearingCanvas;
if (isErasedByCode) _currentCommitType = CommitReason.CodeInput;
inkCanvas.Strokes.Clear();
@ -41,17 +40,17 @@ namespace Ink_Canvas {
if (isBackupMain) {
_currentCommitType = CommitReason.CodeInput;
timeMachine.ImportTimeMachineHistory(TimeMachineHistories[0]);
foreach (var item in TimeMachineHistories[0]) {
ApplyHistoryToCanvas(item);
}
} else {
foreach (var item in TimeMachineHistories[0]) ApplyHistoryToCanvas(item);
}
else {
_currentCommitType = CommitReason.CodeInput;
timeMachine.ImportTimeMachineHistory(TimeMachineHistories[CurrentWhiteboardIndex]);
foreach (var item in TimeMachineHistories[CurrentWhiteboardIndex]) {
ApplyHistoryToCanvas(item);
}
foreach (var item in TimeMachineHistories[CurrentWhiteboardIndex]) ApplyHistoryToCanvas(item);
}
} catch { }
}
catch {
// ignored
}
}
private void BtnWhiteBoardSwitchPrevious_Click(object sender, EventArgs e) {
@ -68,13 +67,13 @@ namespace Ink_Canvas {
}
private void BtnWhiteBoardSwitchNext_Click(object sender, EventArgs e) {
if (Settings.Automation.IsAutoSaveStrokesAtClear && inkCanvas.Strokes.Count > Settings.Automation.MinimumAutomationStrokeNumber) {
SaveScreenShot(true);
}
if (Settings.Automation.IsAutoSaveStrokesAtClear &&
inkCanvas.Strokes.Count > Settings.Automation.MinimumAutomationStrokeNumber) SaveScreenShot(true);
if (CurrentWhiteboardIndex >= WhiteboardTotalCount) {
BtnWhiteBoardAdd_Click(sender, e);
return;
}
SaveStrokes();
@ -88,20 +87,17 @@ namespace Ink_Canvas {
private void BtnWhiteBoardAdd_Click(object sender, EventArgs e) {
if (WhiteboardTotalCount >= 99) return;
if (Settings.Automation.IsAutoSaveStrokesAtClear && inkCanvas.Strokes.Count > Settings.Automation.MinimumAutomationStrokeNumber) {
SaveScreenShot(true);
}
if (Settings.Automation.IsAutoSaveStrokesAtClear &&
inkCanvas.Strokes.Count > Settings.Automation.MinimumAutomationStrokeNumber) SaveScreenShot(true);
SaveStrokes();
ClearStrokes(true);
WhiteboardTotalCount++;
CurrentWhiteboardIndex++;
if (CurrentWhiteboardIndex != WhiteboardTotalCount) {
for (int i = WhiteboardTotalCount; i > CurrentWhiteboardIndex; i--) {
if (CurrentWhiteboardIndex != WhiteboardTotalCount)
for (var i = WhiteboardTotalCount; i > CurrentWhiteboardIndex; i--)
TimeMachineHistories[i] = TimeMachineHistories[i - 1];
}
}
UpdateIndexInfoDisplay();
@ -111,13 +107,11 @@ namespace Ink_Canvas {
private void BtnWhiteBoardDelete_Click(object sender, RoutedEventArgs e) {
ClearStrokes(true);
if (CurrentWhiteboardIndex != WhiteboardTotalCount) {
for (int i = CurrentWhiteboardIndex; i <= WhiteboardTotalCount; i++) {
if (CurrentWhiteboardIndex != WhiteboardTotalCount)
for (var i = CurrentWhiteboardIndex; i <= WhiteboardTotalCount; i++)
TimeMachineHistories[i] = TimeMachineHistories[i + 1];
}
} else {
else
CurrentWhiteboardIndex--;
}
WhiteboardTotalCount--;
@ -129,21 +123,26 @@ namespace Ink_Canvas {
}
private void UpdateIndexInfoDisplay() {
TextBlockWhiteBoardIndexInfo.Text = string.Format("{0} / {1}", CurrentWhiteboardIndex, WhiteboardTotalCount);
TextBlockWhiteBoardIndexInfo.Text =
$"{CurrentWhiteboardIndex} / {WhiteboardTotalCount}";
if (CurrentWhiteboardIndex == WhiteboardTotalCount) {
BitmapImage newImageSource = new BitmapImage();
var newImageSource = new BitmapImage();
newImageSource.BeginInit();
newImageSource.UriSource = new Uri("/Resources/Icons-Fluent/ic_fluent_add_circle_24_regular.png", UriKind.RelativeOrAbsolute);
newImageSource.UriSource = new Uri("/Resources/Icons-Fluent/ic_fluent_add_circle_24_regular.png",
UriKind.RelativeOrAbsolute);
newImageSource.EndInit();
BoardLeftPannelNextPage.Source = newImageSource;
BoardRightPannelNextPage.Source = newImageSource;
BoardRightPannelNextPageTextBlock.Text = "加页";
BoardLeftPannelNextPageTextBlock.Text = "加页";
} else {
BitmapImage newImageSource = new BitmapImage();
}
else {
var newImageSource = new BitmapImage();
newImageSource.BeginInit();
newImageSource.UriSource = new Uri("/Resources/Icons-Fluent/ic_fluent_arrow_circle_right_24_regular.png", UriKind.RelativeOrAbsolute);
newImageSource.UriSource =
new Uri("/Resources/Icons-Fluent/ic_fluent_arrow_circle_right_24_regular.png",
UriKind.RelativeOrAbsolute);
newImageSource.EndInit();
BoardLeftPannelNextPage.Source = newImageSource;
BoardRightPannelNextPage.Source = newImageSource;
@ -151,23 +150,11 @@ namespace Ink_Canvas {
BoardLeftPannelNextPageTextBlock.Text = "下一页";
}
if (CurrentWhiteboardIndex == 1) {
BtnWhiteBoardSwitchPrevious.IsEnabled = false;
} else {
BtnWhiteBoardSwitchPrevious.IsEnabled = true;
}
BtnWhiteBoardSwitchPrevious.IsEnabled = CurrentWhiteboardIndex != 1;
if (CurrentWhiteboardIndex == WhiteboardTotalCount) {
BtnWhiteBoardSwitchNext.IsEnabled = false;
} else {
BtnWhiteBoardSwitchNext.IsEnabled = true;
}
BtnWhiteBoardSwitchNext.IsEnabled = CurrentWhiteboardIndex != WhiteboardTotalCount;
if (WhiteboardTotalCount == 1) {
BtnWhiteBoardDelete.IsEnabled = false;
} else {
BtnWhiteBoardDelete.IsEnabled = true;
}
BtnWhiteBoardDelete.IsEnabled = WhiteboardTotalCount != 1;
}
}
}

View File

@ -13,16 +13,19 @@ namespace Ink_Canvas {
SaveSettingsToFile();
if (Settings.Canvas.UsingWhiteboard) {
if (inkColor == 5) lastBoardInkColor = 0;
} else {
}
else {
if (inkColor == 0) lastBoardInkColor = 5;
}
CheckColorTheme(true);
}
private void BoardEraserIcon_Click(object sender, RoutedEventArgs e) {
if (BoardEraser.Background.ToString() == "#FF679CF4") {
AnimationsHelper.ShowWithSlideFromBottomAndFade(BoardDeleteIcon);
} else {
}
else {
forceEraser = true;
forcePointEraser = true;
double k = 1;
@ -40,6 +43,7 @@ namespace Ink_Canvas {
k = 1.8;
break;
}
inkCanvas.EraserShape = new EllipseStylusShape(k * 90, k * 90);
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint;
drawingShapeMode = 0;
@ -54,7 +58,8 @@ namespace Ink_Canvas {
private void BoardEraserIconByStrokes_Click(object sender, RoutedEventArgs e) {
if (BoardEraserByStrokes.Background.ToString() == "#FF679CF4") {
AnimationsHelper.ShowWithSlideFromBottomAndFade(BoardDeleteIcon);
} else {
}
else {
forceEraser = true;
forcePointEraser = false;
@ -84,6 +89,5 @@ namespace Ink_Canvas {
ImageBlackboard_MouseUp(null, null);
Process.Start("https://www.desmos.com/calculator?lang=zh-CN");
}
}
}

View File

@ -12,42 +12,35 @@ using System.Windows;
using System.Windows.Input;
using System.Windows.Media.Animation;
namespace Ink_Canvas
{
public partial class MainWindow : Window
{
int inkColor = 1;
namespace Ink_Canvas {
public partial class MainWindow : Window {
private int inkColor = 1;
private void ColorSwitchCheck()
{
private void ColorSwitchCheck() {
HideSubPanels("color");
if (GridTransparencyFakeBackground.Background == Brushes.Transparent)
{
if (currentMode == 1)
{
if (GridTransparencyFakeBackground.Background == Brushes.Transparent) {
if (currentMode == 1) {
currentMode = 0;
GridBackgroundCover.Visibility = Visibility.Collapsed;
AnimationsHelper.HideWithSlideAndFade(BlackboardLeftSide);
AnimationsHelper.HideWithSlideAndFade(BlackboardCenterSide);
AnimationsHelper.HideWithSlideAndFade(BlackboardRightSide);
}
BtnHideInkCanvas_Click(BtnHideInkCanvas, null);
}
StrokeCollection strokes = inkCanvas.GetSelectedStrokes();
if (strokes.Count != 0)
{
foreach (Stroke stroke in strokes)
{
try
{
var strokes = inkCanvas.GetSelectedStrokes();
if (strokes.Count != 0) {
foreach (var stroke in strokes)
try {
stroke.DrawingAttributes.Color = inkCanvas.DefaultDrawingAttributes.Color;
}
catch { }
}
catch {
// ignored
}
}
else
{
else {
inkCanvas.IsManipulationEnabled = true;
drawingShapeMode = 0;
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
@ -59,27 +52,22 @@ namespace Ink_Canvas
isLongPressSelected = false;
}
bool isUselightThemeColor = false, isDesktopUselightThemeColor = false;
int penType = 0; // 0是签字笔1是荧光笔
int lastDesktopInkColor = 1, lastBoardInkColor = 5;
int highlighterColor = 102;
private bool isUselightThemeColor = false, isDesktopUselightThemeColor = false;
private int penType = 0; // 0是签字笔1是荧光笔
private int lastDesktopInkColor = 1, lastBoardInkColor = 5;
private int highlighterColor = 102;
private void CheckColorTheme(bool changeColorTheme = false)
{
private void CheckColorTheme(bool changeColorTheme = false) {
if (changeColorTheme)
{
if (currentMode != 0)
{
if (Settings.Canvas.UsingWhiteboard)
{
if (currentMode != 0) {
if (Settings.Canvas.UsingWhiteboard) {
GridBackgroundCover.Background = new SolidColorBrush(Color.FromRgb(234, 235, 237));
WaterMarkTime.Foreground = new SolidColorBrush(Color.FromRgb(22, 41, 36));
WaterMarkDate.Foreground = new SolidColorBrush(Color.FromRgb(22, 41, 36));
BlackBoardWaterMark.Foreground = new SolidColorBrush(Color.FromRgb(22, 41, 36));
isUselightThemeColor = false;
}
else
{
else {
GridBackgroundCover.Background = new SolidColorBrush(Color.FromRgb(22, 41, 36));
WaterMarkTime.Foreground = new SolidColorBrush(Color.FromRgb(234, 235, 237));
WaterMarkDate.Foreground = new SolidColorBrush(Color.FromRgb(234, 235, 237));
@ -87,138 +75,108 @@ namespace Ink_Canvas
isUselightThemeColor = true;
}
}
}
if (currentMode == 0)
{
if (currentMode == 0) {
isUselightThemeColor = isDesktopUselightThemeColor;
inkColor = lastDesktopInkColor;
}
else
{
else {
inkColor = lastBoardInkColor;
}
double alpha = inkCanvas.DefaultDrawingAttributes.Color.A;
if (penType == 0)
{
if (inkColor == 0)
{ // Black
if (penType == 0) {
if (inkColor == 0) {
// Black
inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 0, 0, 0);
}
else if (inkColor == 5)
{ // White
else if (inkColor == 5) {
// White
inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 255, 255, 255);
}
else if (isUselightThemeColor)
{
else if (isUselightThemeColor) {
if (inkColor == 1)
{ // Red
// Red
inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 239, 68, 68);
}
else if (inkColor == 2)
{ // Green
// Green
inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 34, 197, 94);
}
else if (inkColor == 3)
{ // Blue
// Blue
inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 59, 130, 246);
}
else if (inkColor == 4)
{ // Yellow
// Yellow
inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 250, 204, 21);
}
else if (inkColor == 6)
{ // Pink
// Pink
inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 236, 72, 153);
}
else if (inkColor == 7)
{ // Teal (亮色)
// Teal (亮色)
inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 20, 184, 166);
}
else if (inkColor == 8)
{ // Orange (亮色)
// Orange (亮色)
inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 249, 115, 22);
}
}
else
{
else {
if (inkColor == 1)
{ // Red
// Red
inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 220, 38, 38);
}
else if (inkColor == 2)
{ // Green
// Green
inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 22, 163, 74);
}
else if (inkColor == 3)
{ // Blue
// Blue
inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 37, 99, 235);
}
else if (inkColor == 4)
{ // Yellow
// Yellow
inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 234, 179, 8);
}
else if (inkColor == 6)
{ // Pink ( Purple )
// Pink ( Purple )
inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 147, 51, 234);
}
else if (inkColor == 7)
{ // Teal (暗色)
// Teal (暗色)
inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 13, 148, 136);
}
else if (inkColor == 8)
{ // Orange (暗色)
// Orange (暗色)
inkCanvas.DefaultDrawingAttributes.Color = Color.FromArgb((byte)alpha, 234, 88, 12);
}
}
}
else if (penType == 1)
{
else if (penType == 1) {
if (highlighterColor == 100)
{ // Black
// Black
inkCanvas.DefaultDrawingAttributes.Color = Color.FromRgb(0, 0, 0);
}
else if (highlighterColor == 101)
{ // White
// White
inkCanvas.DefaultDrawingAttributes.Color = Color.FromRgb(250, 250, 250);
}
else if (highlighterColor == 102)
{ // Red
// Red
inkCanvas.DefaultDrawingAttributes.Color = Color.FromRgb(239, 68, 68);
}
else if (highlighterColor == 103)
{ // Yellow
// Yellow
inkCanvas.DefaultDrawingAttributes.Color = Color.FromRgb(253, 224, 71);
}
else if (highlighterColor == 104)
{ // Green
// Green
inkCanvas.DefaultDrawingAttributes.Color = Color.FromRgb(74, 222, 128);
}
else if (highlighterColor == 105)
{ // Zinc
// Zinc
inkCanvas.DefaultDrawingAttributes.Color = Color.FromRgb(113, 113, 122);
}
else if (highlighterColor == 106)
{ // Blue
// Blue
inkCanvas.DefaultDrawingAttributes.Color = Color.FromRgb(59, 130, 246);
}
else if (highlighterColor == 107)
{ // Purple
// Purple
inkCanvas.DefaultDrawingAttributes.Color = Color.FromRgb(168, 85, 247);
}
else if (highlighterColor == 108)
{ // teal
// teal
inkCanvas.DefaultDrawingAttributes.Color = Color.FromRgb(45, 212, 191);
}
else if (highlighterColor == 109)
{ // Orange
// Orange
inkCanvas.DefaultDrawingAttributes.Color = Color.FromRgb(249, 115, 22);
}
}
if (isUselightThemeColor)
{ // 亮系
if (isUselightThemeColor) {
// 亮系
// 亮色的红色
BorderPenColorRed.Background = new SolidColorBrush(Color.FromRgb(239, 68, 68));
BoardBorderPenColorRed.Background = new SolidColorBrush(Color.FromRgb(239, 68, 68));
@ -239,9 +197,10 @@ namespace Ink_Canvas
// 亮色的Orange
BorderPenColorOrange.Background = new SolidColorBrush(Color.FromRgb(249, 115, 22));
BitmapImage newImageSource = new BitmapImage();
var newImageSource = new BitmapImage();
newImageSource.BeginInit();
newImageSource.UriSource = new Uri("/Resources/Icons-Fluent/ic_fluent_weather_moon_24_regular.png", UriKind.RelativeOrAbsolute);
newImageSource.UriSource = new Uri("/Resources/Icons-Fluent/ic_fluent_weather_moon_24_regular.png",
UriKind.RelativeOrAbsolute);
newImageSource.EndInit();
ColorThemeSwitchIcon.Source = newImageSource;
BoardColorThemeSwitchIcon.Source = newImageSource;
@ -249,8 +208,8 @@ namespace Ink_Canvas
ColorThemeSwitchTextBlock.Text = "暗系";
BoardColorThemeSwitchTextBlock.Text = "暗系";
}
else
{ // 暗系
else {
// 暗系
// 暗色的红色
BorderPenColorRed.Background = new SolidColorBrush(Color.FromRgb(220, 38, 38));
BoardBorderPenColorRed.Background = new SolidColorBrush(Color.FromRgb(220, 38, 38));
@ -271,9 +230,10 @@ namespace Ink_Canvas
// 暗色的Orange
BorderPenColorOrange.Background = new SolidColorBrush(Color.FromRgb(234, 88, 12));
BitmapImage newImageSource = new BitmapImage();
var newImageSource = new BitmapImage();
newImageSource.BeginInit();
newImageSource.UriSource = new Uri("/Resources/Icons-Fluent/ic_fluent_weather_sunny_24_regular.png", UriKind.RelativeOrAbsolute);
newImageSource.UriSource = new Uri("/Resources/Icons-Fluent/ic_fluent_weather_sunny_24_regular.png",
UriKind.RelativeOrAbsolute);
newImageSource.EndInit();
ColorThemeSwitchIcon.Source = newImageSource;
BoardColorThemeSwitchIcon.Source = newImageSource;
@ -311,8 +271,7 @@ namespace Ink_Canvas
HighlighterPenViewboxBtnColorYellowContent.Visibility = Visibility.Collapsed;
HighlighterPenViewboxBtnColorZincContent.Visibility = Visibility.Collapsed;
switch (inkColor)
{
switch (inkColor) {
case 0:
ViewboxBtnColorBlackContent.Visibility = Visibility.Visible;
BoardViewboxBtnColorBlackContent.Visibility = Visibility.Visible;
@ -349,8 +308,7 @@ namespace Ink_Canvas
break;
}
switch (highlighterColor)
{
switch (highlighterColor) {
case 100:
HighlighterPenViewboxBtnColorBlackContent.Visibility = Visibility.Visible;
break;
@ -382,27 +340,20 @@ namespace Ink_Canvas
HighlighterPenViewboxBtnColorOrangeContent.Visibility = Visibility.Visible;
break;
}
}
private void CheckLastColor(int inkColor, bool isHighlighter = false)
{
if (isHighlighter == true)
{
private void CheckLastColor(int inkColor, bool isHighlighter = false) {
if (isHighlighter == true) {
highlighterColor = inkColor;
}
else
{
else {
if (currentMode == 0) lastDesktopInkColor = inkColor;
else lastBoardInkColor = inkColor;
}
}
private async void CheckPenTypeUIState()
{
if (penType == 0)
{
private async void CheckPenTypeUIState() {
if (penType == 0) {
DefaultPenPropsPanel.Visibility = Visibility.Visible;
DefaultPenColorsPanel.Visibility = Visibility.Visible;
HighlighterPenColorsPanel.Visibility = Visibility.Collapsed;
@ -421,25 +372,21 @@ namespace Ink_Canvas
HighlightPenTabButtonIndicator.Visibility = Visibility.Collapsed;
// PenPalette.Margin = new Thickness(-160, -200, -33, 32);
await Dispatcher.InvokeAsync(() =>
{
ThicknessAnimation marginAnimation = new ThicknessAnimation
await Dispatcher.InvokeAsync(() => {
var marginAnimation = new ThicknessAnimation
{
Duration = TimeSpan.FromSeconds(0.1),
From = PenPalette.Margin,
To = new Thickness(-160, -200, -33, 32)
To = new Thickness(-160, -200, -33, 32),
EasingFunction = new CubicEase()
};
marginAnimation.EasingFunction = new CubicEase();
PenPalette.BeginAnimation(FrameworkElement.MarginProperty, marginAnimation);
PenPalette.BeginAnimation(MarginProperty, marginAnimation);
});
await Task.Delay(100);
await Dispatcher.InvokeAsync(() => {
PenPalette.Margin = new Thickness(-160, -200, -33, 32);
});
await Dispatcher.InvokeAsync(() => { PenPalette.Margin = new Thickness(-160, -200, -33, 32); });
}
else if (penType == 1)
{
else if (penType == 1) {
DefaultPenPropsPanel.Visibility = Visibility.Collapsed;
DefaultPenColorsPanel.Visibility = Visibility.Collapsed;
HighlighterPenColorsPanel.Visibility = Visibility.Visible;
@ -458,27 +405,23 @@ namespace Ink_Canvas
HighlightPenTabButtonIndicator.Visibility = Visibility.Visible;
// PenPalette.Margin = new Thickness(-160, -157, -33, 32);
await Dispatcher.InvokeAsync(() =>
{
ThicknessAnimation marginAnimation = new ThicknessAnimation
await Dispatcher.InvokeAsync(() => {
var marginAnimation = new ThicknessAnimation
{
Duration = TimeSpan.FromSeconds(0.1),
From = PenPalette.Margin,
To = new Thickness(-160, -157, -33, 32)
To = new Thickness(-160, -157, -33, 32),
EasingFunction = new CubicEase()
};
marginAnimation.EasingFunction = new CubicEase();
PenPalette.BeginAnimation(FrameworkElement.MarginProperty, marginAnimation);
PenPalette.BeginAnimation(MarginProperty, marginAnimation);
});
await Task.Delay(100);
await Dispatcher.InvokeAsync(() => {
PenPalette.Margin = new Thickness(-160, -157, -33, 32);
});
await Dispatcher.InvokeAsync(() => { PenPalette.Margin = new Thickness(-160, -157, -33, 32); });
}
}
private void SwitchToDefaultPen(object sender, MouseButtonEventArgs e)
{
private void SwitchToDefaultPen(object sender, MouseButtonEventArgs e) {
penType = 0;
CheckPenTypeUIState();
CheckColorTheme();
@ -488,8 +431,7 @@ namespace Ink_Canvas
drawingAttributes.IsHighlighter = false;
}
private void SwitchToHighlighterPen(object sender, MouseButtonEventArgs e)
{
private void SwitchToHighlighterPen(object sender, MouseButtonEventArgs e) {
penType = 1;
CheckPenTypeUIState();
CheckColorTheme();
@ -499,143 +441,133 @@ namespace Ink_Canvas
drawingAttributes.IsHighlighter = true;
}
private void BtnColorBlack_Click(object sender, RoutedEventArgs e)
{
private void BtnColorBlack_Click(object sender, RoutedEventArgs e) {
CheckLastColor(0);
forceEraser = false;
ColorSwitchCheck();
}
private void BtnColorRed_Click(object sender, RoutedEventArgs e)
{
private void BtnColorRed_Click(object sender, RoutedEventArgs e) {
CheckLastColor(1);
forceEraser = false;
ColorSwitchCheck();
}
private void BtnColorGreen_Click(object sender, RoutedEventArgs e)
{
private void BtnColorGreen_Click(object sender, RoutedEventArgs e) {
CheckLastColor(2);
forceEraser = false;
ColorSwitchCheck();
}
private void BtnColorBlue_Click(object sender, RoutedEventArgs e)
{
private void BtnColorBlue_Click(object sender, RoutedEventArgs e) {
CheckLastColor(3);
forceEraser = false;
ColorSwitchCheck();
}
private void BtnColorYellow_Click(object sender, RoutedEventArgs e)
{
private void BtnColorYellow_Click(object sender, RoutedEventArgs e) {
CheckLastColor(4);
forceEraser = false;
ColorSwitchCheck();
}
private void BtnColorWhite_Click(object sender, RoutedEventArgs e)
{
private void BtnColorWhite_Click(object sender, RoutedEventArgs e) {
CheckLastColor(5);
forceEraser = false;
ColorSwitchCheck();
}
private void BtnColorPink_Click(object sender, RoutedEventArgs e)
{
private void BtnColorPink_Click(object sender, RoutedEventArgs e) {
CheckLastColor(6);
forceEraser = false;
ColorSwitchCheck();
}
private void BtnColorOrange_Click(object sender, RoutedEventArgs e)
{
private void BtnColorOrange_Click(object sender, RoutedEventArgs e) {
CheckLastColor(8);
forceEraser = false;
ColorSwitchCheck();
}
private void BtnColorTeal_Click(object sender, RoutedEventArgs e)
{
private void BtnColorTeal_Click(object sender, RoutedEventArgs e) {
CheckLastColor(7);
forceEraser = false;
ColorSwitchCheck();
}
private void BtnHighlighterColorBlack_Click(object sender, RoutedEventArgs e)
{
private void BtnHighlighterColorBlack_Click(object sender, RoutedEventArgs e) {
CheckLastColor(100, true);
penType = 1;
forceEraser = false;
CheckPenTypeUIState();
ColorSwitchCheck();
}
private void BtnHighlighterColorWhite_Click(object sender, RoutedEventArgs e)
{
private void BtnHighlighterColorWhite_Click(object sender, RoutedEventArgs e) {
CheckLastColor(101, true);
penType = 1;
forceEraser = false;
CheckPenTypeUIState();
ColorSwitchCheck();
}
private void BtnHighlighterColorRed_Click(object sender, RoutedEventArgs e)
{
private void BtnHighlighterColorRed_Click(object sender, RoutedEventArgs e) {
CheckLastColor(102, true);
penType = 1;
forceEraser = false;
CheckPenTypeUIState();
ColorSwitchCheck();
}
private void BtnHighlighterColorYellow_Click(object sender, RoutedEventArgs e)
{
private void BtnHighlighterColorYellow_Click(object sender, RoutedEventArgs e) {
CheckLastColor(103, true);
penType = 1;
forceEraser = false;
CheckPenTypeUIState();
ColorSwitchCheck();
}
private void BtnHighlighterColorGreen_Click(object sender, RoutedEventArgs e)
{
private void BtnHighlighterColorGreen_Click(object sender, RoutedEventArgs e) {
CheckLastColor(104, true);
penType = 1;
forceEraser = false;
CheckPenTypeUIState();
ColorSwitchCheck();
}
private void BtnHighlighterColorZinc_Click(object sender, RoutedEventArgs e)
{
private void BtnHighlighterColorZinc_Click(object sender, RoutedEventArgs e) {
CheckLastColor(105, true);
penType = 1;
forceEraser = false;
CheckPenTypeUIState();
ColorSwitchCheck();
}
private void BtnHighlighterColorBlue_Click(object sender, RoutedEventArgs e)
{
private void BtnHighlighterColorBlue_Click(object sender, RoutedEventArgs e) {
CheckLastColor(106, true);
penType = 1;
forceEraser = false;
CheckPenTypeUIState();
ColorSwitchCheck();
}
private void BtnHighlighterColorPurple_Click(object sender, RoutedEventArgs e)
{
private void BtnHighlighterColorPurple_Click(object sender, RoutedEventArgs e) {
CheckLastColor(107, true);
penType = 1;
forceEraser = false;
CheckPenTypeUIState();
ColorSwitchCheck();
}
private void BtnHighlighterColorTeal_Click(object sender, RoutedEventArgs e)
{
private void BtnHighlighterColorTeal_Click(object sender, RoutedEventArgs e) {
CheckLastColor(108, true);
penType = 1;
forceEraser = false;
CheckPenTypeUIState();
ColorSwitchCheck();
}
private void BtnHighlighterColorOrange_Click(object sender, RoutedEventArgs e)
{
private void BtnHighlighterColorOrange_Click(object sender, RoutedEventArgs e) {
CheckLastColor(109, true);
penType = 1;
forceEraser = false;
@ -643,23 +575,21 @@ namespace Ink_Canvas
ColorSwitchCheck();
}
private Color StringToColor(string colorStr)
{
Byte[] argb = new Byte[4];
for (int i = 0; i < 4; i++)
{
char[] charArray = colorStr.Substring(i * 2 + 1, 2).ToCharArray();
Byte b1 = toByte(charArray[0]);
Byte b2 = toByte(charArray[1]);
argb[i] = (Byte)(b2 | (b1 << 4));
private Color StringToColor(string colorStr) {
var argb = new byte[4];
for (var i = 0; i < 4; i++) {
var charArray = colorStr.Substring(i * 2 + 1, 2).ToCharArray();
var b1 = toByte(charArray[0]);
var b2 = toByte(charArray[1]);
argb[i] = (byte)(b2 | (b1 << 4));
}
return Color.FromArgb(argb[0], argb[1], argb[2], argb[3]);//#FFFFFFFF
return Color.FromArgb(argb[0], argb[1], argb[2], argb[3]); //#FFFFFFFF
}
private static byte toByte(char c)
{
byte b = (byte)"0123456789ABCDEF".IndexOf(c);
private static byte toByte(char c) {
var b = (byte)"0123456789ABCDEF".IndexOf(c);
return b;
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -5,28 +5,22 @@ namespace Ink_Canvas {
public partial class MainWindow : Window {
private void Window_MouseWheel(object sender, MouseWheelEventArgs e) {
if (StackPanelPPTControls.Visibility != Visibility.Visible || currentMode != 0) return;
if (e.Delta >= 120) {
if (e.Delta >= 120)
BtnPPTSlidesUp_Click(BtnPPTSlidesUp, null);
} else if (e.Delta <= -120) {
BtnPPTSlidesDown_Click(BtnPPTSlidesDown, null);
}
else if (e.Delta <= -120) BtnPPTSlidesDown_Click(BtnPPTSlidesDown, null);
}
private void Main_Grid_PreviewKeyDown(object sender, KeyEventArgs e) {
if (StackPanelPPTControls.Visibility != Visibility.Visible || currentMode != 0) return;
if (e.Key == Key.Down || e.Key == Key.PageDown || e.Key == Key.Right || e.Key == Key.N || e.Key == Key.Space) {
BtnPPTSlidesDown_Click(BtnPPTSlidesDown, null);
}
if (e.Key == Key.Up || e.Key == Key.PageUp || e.Key == Key.Left || e.Key == Key.P) {
if (e.Key == Key.Down || e.Key == Key.PageDown || e.Key == Key.Right || e.Key == Key.N ||
e.Key == Key.Space) BtnPPTSlidesDown_Click(BtnPPTSlidesDown, null);
if (e.Key == Key.Up || e.Key == Key.PageUp || e.Key == Key.Left || e.Key == Key.P)
BtnPPTSlidesUp_Click(BtnPPTSlidesUp, null);
}
}
private void Window_KeyDown(object sender, KeyEventArgs e) {
if (e.Key == Key.Escape) {
KeyExit(null, null);
}
if (e.Key == Key.Escape) KeyExit(null, null);
}
private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e) {
@ -36,13 +30,15 @@ namespace Ink_Canvas {
private void HotKey_Undo(object sender, ExecutedRoutedEventArgs e) {
try {
SymbolIconUndo_MouseUp(lastBorderMouseDownObject, null);
} catch { }
}
catch { }
}
private void HotKey_Redo(object sender, ExecutedRoutedEventArgs e) {
try {
SymbolIconRedo_MouseUp(lastBorderMouseDownObject, null);
} catch { }
}
catch { }
}
private void HotKey_Clear(object sender, ExecutedRoutedEventArgs e) {
@ -59,25 +55,21 @@ namespace Ink_Canvas {
}
private void KeyChangeToQuitDrawTool(object sender, ExecutedRoutedEventArgs e) {
if (currentMode != 0) {
ImageBlackboard_MouseUp(lastBorderMouseDownObject, null);
}
if (currentMode != 0) ImageBlackboard_MouseUp(lastBorderMouseDownObject, null);
CursorIcon_Click(lastBorderMouseDownObject, null);
}
private void KeyChangeToSelect(object sender, ExecutedRoutedEventArgs e) {
if (StackPanelCanvasControls.Visibility == Visibility.Visible) {
if (StackPanelCanvasControls.Visibility == Visibility.Visible)
SymbolIconSelect_MouseUp(lastBorderMouseDownObject, null);
}
}
private void KeyChangeToEraser(object sender, ExecutedRoutedEventArgs e) {
if (StackPanelCanvasControls.Visibility == Visibility.Visible) {
if (Eraser_Icon.Background != null) {
if (Eraser_Icon.Background != null)
EraserIconByStrokes_Click(lastBorderMouseDownObject, null);
} else {
else
EraserIcon_Click(lastBorderMouseDownObject, null);
}
}
}
@ -90,13 +82,11 @@ namespace Ink_Canvas {
}
private void KeyDrawLine(object sender, ExecutedRoutedEventArgs e) {
if (StackPanelCanvasControls.Visibility == Visibility.Visible) {
BtnDrawLine_Click(lastMouseDownSender, null);
}
if (StackPanelCanvasControls.Visibility == Visibility.Visible) BtnDrawLine_Click(lastMouseDownSender, null);
}
private void KeyHide(object sender, ExecutedRoutedEventArgs e) {
SymbolIconEmoji_MouseUp(null, null);
}
}
}
}

View File

@ -4,10 +4,8 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ink_Canvas
{
public static class XamlGraphicsIconGeometries
{
namespace Ink_Canvas {
public static class XamlGraphicsIconGeometries {
public static string LinedCursorIcon =
"F0 M24,24z M0,0z M3.85151,2.7073C3.52422,2.57095 3.147,2.64558 2.89629,2.89629 2.64558,3.147 2.57095,3.52422 2.7073,3.85151L9.7773,20.8215C9.91729,21.1575 10.2507,21.3718 10.6145,21.3595 10.9783,21.3473 11.2965,21.1111 11.4135,20.7664L13.4711,14.7085 18.8963,20.1337C19.238,20.4754 19.792,20.4754 20.1337,20.1337 20.4754,19.792 20.4754,19.238 20.1337,18.8963L14.7085,13.4711 20.7664,11.4135C21.1111,11.2965 21.3473,10.9783 21.3595,10.6145 21.3718,10.2507 21.1575,9.91729 20.8215,9.7773L3.85151,2.7073z M10.5017,18.0097L5.13984,5.13984 18.0097,10.5017 12.8136,12.2665C12.5561,12.3539,12.3539,12.5561,12.2665,12.8136L10.5017,18.0097z";
@ -38,4 +36,4 @@ namespace Ink_Canvas
public static string SolidLassoSelectIcon =
"F1 M24,24z M0,0z M14.6618,10.9193C14.4981,10.784 14.2733,10.6788 14.0025,10.6788 13.9951,10.6788 13.9877,10.6789 13.9803,10.6791 13.7083,10.6872 13.4502,10.8008 13.2607,10.9961 13.0712,11.1913 12.9653,11.4526 12.9653,11.7246L12.9653,20.3314C12.9653,20.3403 12.9655,20.3491 12.9658,20.358 12.9734,20.5733 13.0468,20.7811 13.176,20.9534 13.3053,21.1258 13.4842,21.2544 13.6888,21.3219 13.765,21.3471 13.8447,21.36 13.925,21.36L14.0025,21.36C14.1661,21.36 14.3276,21.3218 14.474,21.2486 14.6204,21.1754 14.7477,21.0692 14.8459,20.9382 14.8542,20.9272 14.8622,20.9159 14.8698,20.9045L16.8582,17.9258 20.3145,17.9258C20.5287,17.9281 20.7384,17.8641 20.9149,17.7424 21.0941,17.6187 21.2299,17.4417 21.3029,17.2365 21.3759,17.0313 21.3825,16.8084 21.3217,16.5993 21.262,16.3936 21.14,16.2117 20.9729,16.0782L14.6618,10.9193z M8.14548,20.0044C7.70454,19.6737 7.34665,19.2448 7.10016,18.7519 6.94658,18.4447 6.83888,18.1179 6.7795,17.7818 7.131,17.6605 7.45404,17.4604 7.72196,17.1924 7.74959,17.1648 7.77649,17.1366 7.80267,17.1078 8.5567,17.4118 9.3392,17.6365 10.1444,17.7694 10.5548,17.8372 10.9424,17.5594 11.0101,17.149 11.0779,16.7387 10.8001,16.3511 10.3897,16.2833 9.72172,16.1731 9.06686,15.9883 8.42926,15.7362 8.44084,15.6393 8.44672,15.5413 8.44672,15.4427 8.44672,14.7865 8.18602,14.1571 7.72196,13.693 7.25791,13.229 6.62852,12.9682 5.97224,12.9682 5.65536,12.9682 5.34474,13.029 5.05598,13.1441 4.47073,12.3026 4.15196,11.303 4.14328,10.2756 4.14532,7.03688 7.49758,4.1462 11.9971,4.1462 16.4941,4.1462 19.8451,7.03371 19.8508,10.2703 19.8388,10.7807 19.7549,11.2869 19.6016,11.7739 19.4767,12.1706 19.697,12.5934 20.0938,12.7183 20.4905,12.8432 20.9134,12.6228 21.0383,12.2261 21.2351,11.6008 21.3424,10.9507 21.3568,10.2952L21.357,10.2786C21.357,5.91009 16.9982,2.64 11.9971,2.64 6.9959,2.64 2.63705,5.91009 2.63705,10.2786L2.6371,10.2845C2.6479,11.6579 3.08647,12.993 3.89074,14.1047 3.63615,14.5007 3.49777,14.9646 3.49777,15.4427 3.49777,16.099 3.75847,16.7284 4.22252,17.1924 4.51465,17.4846 4.87229,17.6961 5.26092,17.8128 5.33333,18.3726 5.49917,18.9178 5.75297,19.4255 6.10404,20.1276 6.61375,20.7383 7.24176,21.2093 7.5745,21.4589 8.04654,21.3915 8.2961,21.0587 8.54566,20.726 8.47822,20.2539 8.14548,20.0044z";
}
}
}

View File

@ -6,16 +6,16 @@ using System.Windows;
namespace Ink_Canvas {
public partial class MainWindow : Window {
int lastNotificationShowTime = 0;
int notificationShowTime = 2500;
private int lastNotificationShowTime = 0;
private int notificationShowTime = 2500;
public static void ShowNewMessage(string notice, bool isShowImmediately = true) {
(Application.Current?.Windows.Cast<Window>().FirstOrDefault(window => window is MainWindow) as MainWindow)?.ShowNotification(notice, isShowImmediately);
(Application.Current?.Windows.Cast<Window>().FirstOrDefault(window => window is MainWindow) as MainWindow)
?.ShowNotification(notice, isShowImmediately);
}
public void ShowNotification(string notice, bool isShowImmediately = true) {
try
{
try {
lastNotificationShowTime = Environment.TickCount;
TextBlockNotice.Text = notice;
@ -24,14 +24,12 @@ namespace Ink_Canvas {
new Thread(new ThreadStart(() => {
Thread.Sleep(notificationShowTime + 300);
if (Environment.TickCount - lastNotificationShowTime >= notificationShowTime)
{
Application.Current.Dispatcher.Invoke(() => {
AnimationsHelper.HideWithSlideAndFade(GridNotifications);
});
}
})).Start();
}
catch { }
}
}
}
}

View File

@ -21,14 +21,15 @@ using iNKORE.UI.WPF.Modern;
namespace Ink_Canvas {
public partial class MainWindow : Window {
public static Microsoft.Office.Interop.PowerPoint.Application pptApplication = null;
public static Microsoft.Office.Interop.PowerPoint.Presentation presentation = null;
public static Microsoft.Office.Interop.PowerPoint.Slides slides = null;
public static Microsoft.Office.Interop.PowerPoint.Slide slide = null;
public static Presentation presentation = null;
public static Slides slides = null;
public static Slide slide = null;
public static int slidescount = 0;
private void BtnCheckPPT_Click(object sender, RoutedEventArgs e) {
try {
pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("PowerPoint.Application");
pptApplication =
(Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("PowerPoint.Application");
//pptApplication.SlideShowWindows[1].View.Next();
if (pptApplication != null) {
//获得演示文稿对象
@ -46,7 +47,8 @@ namespace Ink_Canvas {
// 在普通视图下这种方式可以获得当前选中的幻灯片对象
// 然而在阅读模式下,这种方式会出现异常
slide = slides[pptApplication.ActiveWindow.Selection.SlideRange.SlideNumber];
} catch {
}
catch {
// 在阅读模式下出现异常时,通过下面的方式来获得当前选中的幻灯片对象
slide = pptApplication.SlideShowWindows[1].View.Slide;
}
@ -55,7 +57,8 @@ namespace Ink_Canvas {
if (pptApplication == null) throw new Exception();
//BtnCheckPPT.Visibility = Visibility.Collapsed;
StackPanelPPTControls.Visibility = Visibility.Visible;
} catch {
}
catch {
//BtnCheckPPT.Visibility = Visibility.Visible;
StackPanelPPTControls.Visibility = Visibility.Collapsed;
BottomViewboxPPTSidesControl.Visibility = Visibility.Collapsed;
@ -72,18 +75,16 @@ namespace Ink_Canvas {
SaveSettingsToFile();
}
public static bool isWPSSupportOn => Settings.PowerPointSettings.IsSupportWPS;
private static bool isWPSSupportOn => Settings.PowerPointSettings.IsSupportWPS;
public static bool IsShowingRestoreHiddenSlidesWindow = false;
public static bool IsShowingAutoplaySlidesWindow = false;
private static bool IsShowingAutoplaySlidesWindow = false;
private void TimerCheckPPT_Elapsed(object sender, ElapsedEventArgs e) {
if (IsShowingRestoreHiddenSlidesWindow) return;
try {
Process[] processes = Process.GetProcessesByName("wpp");
if (processes.Length > 0 && !isWPSSupportOn) {
return;
}
var processes = Process.GetProcessesByName("wpp");
if (processes.Length > 0 && !isWPSSupportOn) return;
//使用下方提前创建 PowerPoint 实例,将导致 PowerPoint 不再有启动界面
//pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Activator.CreateInstance(Marshal.GetTypeFromCLSID(new Guid("91493441-5A91-11CF-8700-00AA0060263B")));
@ -92,7 +93,8 @@ namespace Ink_Canvas {
//new ComAwareEventInfo(typeof(EApplication_Event), "SlideShowNextSlide").AddEventHandler(pptApplication, new EApplication_SlideShowNextSlideEventHandler(this.PptApplication_SlideShowNextSlide));
//ConfigHelper.Instance.IsInitApplicationSuccessful = true;
pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("PowerPoint.Application");
pptApplication =
(Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("PowerPoint.Application");
if (pptApplication != null) {
timerCheckPPT.Stop();
@ -113,7 +115,8 @@ namespace Ink_Canvas {
// 在普通视图下这种方式可以获得当前选中的幻灯片对象
// 然而在阅读模式下,这种方式会出现异常
slide = slides[pptApplication.ActiveWindow.Selection.SlideRange.SlideNumber];
} catch {
}
catch {
// 在阅读模式下出现异常时,通过下面的方式来获得当前选中的幻灯片对象
slide = pptApplication.SlideShowWindows[1].View.Slide;
}
@ -125,22 +128,22 @@ namespace Ink_Canvas {
// 跳转到上次播放页
if (Settings.PowerPointSettings.IsNotifyPreviousPage)
Application.Current.Dispatcher.BeginInvoke(() => {
string folderPath = Settings.Automation.AutoSavedStrokesLocation + @"\Auto Saved - Presentations\" + presentation.Name + "_" + presentation.Slides.Count;
var folderPath = Settings.Automation.AutoSavedStrokesLocation +
@"\Auto Saved - Presentations\" + presentation.Name + "_" +
presentation.Slides.Count;
try {
if (File.Exists(folderPath + "/Position")) {
if (int.TryParse(File.ReadAllText(folderPath + "/Position"), out var page)) {
if (page <= 0) return;
new YesOrNoNotificationWindow($"上次播放到了第 {page} 页, 是否立即跳转", () => {
if (pptApplication.SlideShowWindows.Count >= 1) {
// 如果已经播放了的话, 跳转
presentation.SlideShowWindow.View.GotoSlide(page);
} else {
presentation.Windows[1].View.GotoSlide(page);
}
}).ShowDialog();
}
}
} catch (Exception ex) {
if (!File.Exists(folderPath + "/Position")) return;
if (!int.TryParse(File.ReadAllText(folderPath + "/Position"), out var page)) return;
if (page <= 0) return;
new YesOrNoNotificationWindow($"上次播放到了第 {page} 页, 是否立即跳转", () => {
if (pptApplication.SlideShowWindows.Count >= 1)
// 如果已经播放了的话, 跳转
presentation.SlideShowWindow.View.GotoSlide(page);
else
presentation.Windows[1].View.GotoSlide(page);
}).ShowDialog();
}
catch (Exception ex) {
LogHelper.WriteLogToFile(ex.ToString(), LogHelper.LogType.Error);
}
}, DispatcherPriority.Normal);
@ -148,26 +151,23 @@ namespace Ink_Canvas {
//检查是否有隐藏幻灯片
if (Settings.PowerPointSettings.IsNotifyHiddenPage) {
bool isHaveHiddenSlide = false;
foreach (Slide slide in slides) {
var isHaveHiddenSlide = false;
foreach (Slide slide in slides)
if (slide.SlideShowTransition.Hidden == Microsoft.Office.Core.MsoTriState.msoTrue) {
isHaveHiddenSlide = true;
break;
}
}
Application.Current.Dispatcher.BeginInvoke(() => {
if (isHaveHiddenSlide && !IsShowingRestoreHiddenSlidesWindow) {
IsShowingRestoreHiddenSlidesWindow = true;
new YesOrNoNotificationWindow("检测到此演示文档中包含隐藏的幻灯片,是否取消隐藏?",
() => {
foreach (Slide slide in slides) {
foreach (Slide slide in slides)
if (slide.SlideShowTransition.Hidden ==
Microsoft.Office.Core.MsoTriState.msoTrue) {
Microsoft.Office.Core.MsoTriState.msoTrue)
slide.SlideShowTransition.Hidden =
Microsoft.Office.Core.MsoTriState.msoFalse;
}
}
}).ShowDialog();
}
@ -177,33 +177,30 @@ namespace Ink_Canvas {
//检测是否有自动播放
if (Settings.PowerPointSettings.IsNotifyAutoPlayPresentation)
{
Application.Current.Dispatcher.BeginInvoke(() => {
bool isHaveAutoPlaySettings = false;
isHaveAutoPlaySettings = presentation.SlideShowSettings.AdvanceMode != PpSlideShowAdvanceMode.ppSlideShowManualAdvance;
if (isHaveAutoPlaySettings && !IsShowingAutoplaySlidesWindow)
{
var isHaveAutoPlaySettings = false;
isHaveAutoPlaySettings = presentation.SlideShowSettings.AdvanceMode !=
PpSlideShowAdvanceMode.ppSlideShowManualAdvance;
if (isHaveAutoPlaySettings && !IsShowingAutoplaySlidesWindow) {
IsShowingAutoplaySlidesWindow = true;
new YesOrNoNotificationWindow("检测到此演示文档中有自动播放或排练计时已经启用,是否取消?",
() => {
presentation.SlideShowSettings.AdvanceMode = PpSlideShowAdvanceMode.ppSlideShowManualAdvance;
presentation.SlideShowSettings.AdvanceMode =
PpSlideShowAdvanceMode.ppSlideShowManualAdvance;
}).ShowDialog();
}
BtnPPTSlideShow.Visibility = Visibility.Visible;
}, DispatcherPriority.Normal);
}
//如果检测到已经开始放映,则立即进入画板模式
if (pptApplication.SlideShowWindows.Count >= 1) {
if (pptApplication.SlideShowWindows.Count >= 1)
PptApplication_SlideShowBegin(pptApplication.SlideShowWindows[1]);
}
} catch {
}
catch {
//StackPanelPPTControls.Visibility = Visibility.Collapsed;
Application.Current.Dispatcher.Invoke(() => {
BtnPPTSlideShow.Visibility = Visibility.Collapsed;
});
Application.Current.Dispatcher.Invoke(() => { BtnPPTSlideShow.Visibility = Visibility.Collapsed; });
timerCheckPPT.Start();
}
}
@ -221,25 +218,22 @@ namespace Ink_Canvas {
});
}
bool isPresentationHaveBlackSpace = false;
private bool isPresentationHaveBlackSpace = false;
private string pptName = null;
private void PptApplication_SlideShowBegin(SlideShowWindow Wn) {
if (Settings.Automation.IsAutoFoldInPPTSlideShow && !isFloatingBarFolded) {
if (Settings.Automation.IsAutoFoldInPPTSlideShow && !isFloatingBarFolded)
FoldFloatingBar_MouseUp(null, null);
} else if (isFloatingBarFolded) {
UnFoldFloatingBar_MouseUp(null, null);
}
else if (isFloatingBarFolded) UnFoldFloatingBar_MouseUp(null, null);
LogHelper.WriteLogToFile("PowerPoint Application Slide Show Begin", LogHelper.LogType.Event);
Application.Current.Dispatcher.Invoke(() => {
if (currentMode != 0) {
ImageBlackboard_MouseUp(null, null);
}
if (currentMode != 0) ImageBlackboard_MouseUp(null, null);
//调整颜色
double screenRatio = SystemParameters.PrimaryScreenWidth / SystemParameters.PrimaryScreenHeight;
var screenRatio = SystemParameters.PrimaryScreenWidth / SystemParameters.PrimaryScreenHeight;
if (Math.Abs(screenRatio - 16.0 / 9) <= -0.01) {
if (Wn.Presentation.PageSetup.SlideWidth / Wn.Presentation.PageSetup.SlideHeight < 1.65) {
isPresentationHaveBlackSpace = true;
@ -251,14 +245,15 @@ namespace Ink_Canvas {
//SymbolIconBtnColorBlackContent.Foreground = Brushes.White;
ThemeManager.Current.ApplicationTheme = ApplicationTheme.Dark;
//BtnExit.Background = new SolidColorBrush(StringToColor("#AACCCCCC"));
} else {
}
else {
//Dark
//BtnExit.Background = new SolidColorBrush(StringToColor("#AA555555"));
}
}
} else if (screenRatio == -256 / 135) {
}
else if (screenRatio == -256 / 135) { }
lastDesktopInkColor = 1;
@ -271,39 +266,45 @@ namespace Ink_Canvas {
LogHelper.NewLog("Slides Count: " + slidescount.ToString());
//检查是否有已有墨迹,并加载
if (Settings.PowerPointSettings.IsAutoSaveStrokesInPowerPoint) {
if (Directory.Exists(Settings.Automation.AutoSavedStrokesLocation + @"\Auto Saved - Presentations\" + Wn.Presentation.Name + "_" + Wn.Presentation.Slides.Count)) {
if (Settings.PowerPointSettings.IsAutoSaveStrokesInPowerPoint)
if (Directory.Exists(Settings.Automation.AutoSavedStrokesLocation +
@"\Auto Saved - Presentations\" + Wn.Presentation.Name + "_" +
Wn.Presentation.Slides.Count)) {
LogHelper.WriteLogToFile("Found saved strokes", LogHelper.LogType.Trace);
FileInfo[] files = new DirectoryInfo(Settings.Automation.AutoSavedStrokesLocation + @"\Auto Saved - Presentations\" + Wn.Presentation.Name + "_" + Wn.Presentation.Slides.Count).GetFiles();
int count = 0;
foreach (FileInfo file in files) {
var files = new DirectoryInfo(Settings.Automation.AutoSavedStrokesLocation +
@"\Auto Saved - Presentations\" + Wn.Presentation.Name + "_" +
Wn.Presentation.Slides.Count).GetFiles();
var count = 0;
foreach (var file in files)
if (file.Name != "Position") {
int i = -1;
var i = -1;
try {
i = int.Parse(System.IO.Path.GetFileNameWithoutExtension(file.Name));
i = int.Parse(Path.GetFileNameWithoutExtension(file.Name));
memoryStreams[i] = new MemoryStream(File.ReadAllBytes(file.FullName));
memoryStreams[i].Position = 0;
count++;
} catch (Exception ex) {
LogHelper.WriteLogToFile(string.Format("Failed to load strokes on Slide {0}\n{1}", i, ex.ToString()), LogHelper.LogType.Error);
}
catch (Exception ex) {
LogHelper.WriteLogToFile(
$"Failed to load strokes on Slide {i}\n{ex.ToString()}",
LogHelper.LogType.Error);
}
}
}
LogHelper.WriteLogToFile(string.Format("Loaded {0} saved strokes", count.ToString()));
LogHelper.WriteLogToFile($"Loaded {count.ToString()} saved strokes");
}
}
StackPanelPPTControls.Visibility = Visibility.Visible;
if (Settings.PowerPointSettings.IsShowBottomPPTNavigationPanel) {
if (Settings.PowerPointSettings.IsShowBottomPPTNavigationPanel)
AnimationsHelper.ShowWithSlideFromBottomAndFade(BottomViewboxPPTSidesControl);
} else {
else
BottomViewboxPPTSidesControl.Visibility = Visibility.Collapsed;
}
if (Settings.PowerPointSettings.IsShowSidePPTNavigationPanel) {
AnimationsHelper.ShowWithScaleFromLeft(LeftSidePanelForPPTNavigation);
AnimationsHelper.ShowWithScaleFromRight(RightSidePanelForPPTNavigation);
} else {
}
else {
LeftSidePanelForPPTNavigation.Visibility = Visibility.Collapsed;
RightSidePanelForPPTNavigation.Visibility = Visibility.Collapsed;
}
@ -312,13 +313,10 @@ namespace Ink_Canvas {
BtnPPTSlideShowEnd.Visibility = Visibility.Visible;
ViewBoxStackPanelMain.Margin = new Thickness(10, 10, 10, 10);
if (Settings.Appearance.IsColorfulViewboxFloatingBar) {
ViewboxFloatingBar.Opacity = 0.8;
} else {
ViewboxFloatingBar.Opacity = 0.5;
}
ViewboxFloatingBar.Opacity = Settings.Appearance.IsColorfulViewboxFloatingBar ? 0.8 : 0.5;
if (Settings.PowerPointSettings.IsShowCanvasAtNewSlideShow && GridTransparencyFakeBackground.Background == Brushes.Transparent) {
if (Settings.PowerPointSettings.IsShowCanvasAtNewSlideShow &&
GridTransparencyFakeBackground.Background == Brushes.Transparent) {
if (currentMode != 0) {
currentMode = 0;
GridBackgroundCover.Visibility = Visibility.Collapsed;
@ -329,13 +327,10 @@ namespace Ink_Canvas {
//SaveStrokes();
ClearStrokes(true);
if (BtnSwitchTheme.Content.ToString() == "浅色") {
BtnSwitch.Content = "黑板";
} else {
BtnSwitch.Content = "白板";
}
BtnSwitch.Content = BtnSwitchTheme.Content.ToString() == "浅色" ? "黑板" : "白板";
StackPanelPPTButtons.Visibility = Visibility.Visible;
}
BtnHideInkCanvas_Click(BtnHideInkCanvas, null);
}
@ -343,9 +338,8 @@ namespace Ink_Canvas {
BorderFloatingBarMainControls.Visibility = Visibility.Visible;
if (Settings.PowerPointSettings.IsShowCanvasAtNewSlideShow) {
if (Settings.PowerPointSettings.IsShowCanvasAtNewSlideShow)
BorderPenColorRed_MouseUp(BorderPenColorRed, null);
}
isEnteredSlideShowEndEvent = false;
PptNavigationTextBlock.Text = $"{Wn.View.CurrentShowPosition}/{Wn.Presentation.Slides.Count}";
@ -353,14 +347,13 @@ namespace Ink_Canvas {
new Thread(new ThreadStart(() => {
Thread.Sleep(100);
Application.Current.Dispatcher.Invoke(() => {
ViewboxFloatingBarMarginAnimation(60);
});
Application.Current.Dispatcher.Invoke(() => { ViewboxFloatingBarMarginAnimation(60); });
})).Start();
});
}
bool isEnteredSlideShowEndEvent = false; //防止重复调用本函数导致墨迹保存失效
private bool isEnteredSlideShowEndEvent = false; //防止重复调用本函数导致墨迹保存失效
private async void PptApplication_SlideShowEnd(Presentation Pres) {
if (isFloatingBarFolded) UnFoldFloatingBar_MouseUp(null, null);
@ -369,32 +362,38 @@ namespace Ink_Canvas {
LogHelper.WriteLogToFile("Detected previous entrance, returning");
return;
}
isEnteredSlideShowEndEvent = true;
if (Settings.PowerPointSettings.IsAutoSaveStrokesInPowerPoint) {
string folderPath = Settings.Automation.AutoSavedStrokesLocation + @"\Auto Saved - Presentations\" + Pres.Name + "_" + Pres.Slides.Count;
if (!Directory.Exists(folderPath)) {
Directory.CreateDirectory(folderPath);
}
var folderPath = Settings.Automation.AutoSavedStrokesLocation + @"\Auto Saved - Presentations\" +
Pres.Name + "_" + Pres.Slides.Count;
if (!Directory.Exists(folderPath)) Directory.CreateDirectory(folderPath);
try {
File.WriteAllText(folderPath + "/Position", previousSlideID.ToString());
} catch { }
for (int i = 1; i <= Pres.Slides.Count; i++) {
if (memoryStreams[i] != null) {
}
catch { }
for (var i = 1; i <= Pres.Slides.Count; i++)
if (memoryStreams[i] != null)
try {
if (memoryStreams[i].Length > 8) {
byte[] srcBuf = new Byte[memoryStreams[i].Length];
int byteLength = memoryStreams[i].Read(srcBuf, 0, srcBuf.Length);
var srcBuf = new byte[memoryStreams[i].Length];
var byteLength = memoryStreams[i].Read(srcBuf, 0, srcBuf.Length);
File.WriteAllBytes(folderPath + @"\" + i.ToString("0000") + ".icstk", srcBuf);
LogHelper.WriteLogToFile(string.Format("Saved strokes for Slide {0}, size={1}, byteLength={2}", i.ToString(), memoryStreams[i].Length, byteLength));
} else {
LogHelper.WriteLogToFile(string.Format(
"Saved strokes for Slide {0}, size={1}, byteLength={2}", i.ToString(),
memoryStreams[i].Length, byteLength));
}
else {
File.Delete(folderPath + @"\" + i.ToString("0000") + ".icstk");
}
} catch (Exception ex) {
LogHelper.WriteLogToFile(string.Format("Failed to save strokes for Slide {0}\n{1}", i, ex.ToString()), LogHelper.LogType.Error);
}
catch (Exception ex) {
LogHelper.WriteLogToFile(
$"Failed to save strokes for Slide {i}\n{ex.ToString()}",
LogHelper.LogType.Error);
File.Delete(folderPath + @"\" + i.ToString("0000") + ".icstk");
}
}
}
}
Application.Current.Dispatcher.Invoke(() => {
@ -405,7 +404,8 @@ namespace Ink_Canvas {
BtnExit.Foreground = Brushes.Black;
//SymbolIconBtnColorBlackContent.Foreground = Brushes.White;
ThemeManager.Current.ApplicationTheme = ApplicationTheme.Light;
} else {
}
else {
//Dark
}
@ -429,61 +429,58 @@ namespace Ink_Canvas {
ClearStrokes(true);
//RestoreStrokes(true);
if (BtnSwitchTheme.Content.ToString() == "浅色") {
BtnSwitch.Content = "黑板";
} else {
BtnSwitch.Content = "白板";
}
BtnSwitch.Content = BtnSwitchTheme.Content.ToString() == "浅色" ? "黑板" : "白板";
StackPanelPPTButtons.Visibility = Visibility.Visible;
}
ClearStrokes(true);
if (GridTransparencyFakeBackground.Background != Brushes.Transparent) {
if (GridTransparencyFakeBackground.Background != Brushes.Transparent)
BtnHideInkCanvas_Click(BtnHideInkCanvas, null);
}
if (Settings.Appearance.IsColorfulViewboxFloatingBar) {
if (Settings.Appearance.IsColorfulViewboxFloatingBar)
ViewboxFloatingBar.Opacity = 0.95;
} else {
else
ViewboxFloatingBar.Opacity = 1;
}
});
await Task.Delay(150);
ViewboxFloatingBarMarginAnimation(100,true);
ViewboxFloatingBarMarginAnimation(100, true);
}
int previousSlideID = 0;
MemoryStream[] memoryStreams = new MemoryStream[50];
private int previousSlideID = 0;
private MemoryStream[] memoryStreams = new MemoryStream[50];
private void PptApplication_SlideShowNextSlide(SlideShowWindow Wn) {
LogHelper.WriteLogToFile(string.Format("PowerPoint Next Slide (Slide {0})", Wn.View.CurrentShowPosition), LogHelper.LogType.Event);
if (Wn.View.CurrentShowPosition != previousSlideID) {
Application.Current.Dispatcher.Invoke(() => {
MemoryStream ms = new MemoryStream();
inkCanvas.Strokes.Save(ms);
ms.Position = 0;
memoryStreams[previousSlideID] = ms;
LogHelper.WriteLogToFile($"PowerPoint Next Slide (Slide {Wn.View.CurrentShowPosition})",
LogHelper.LogType.Event);
if (Wn.View.CurrentShowPosition == previousSlideID) return;
Application.Current.Dispatcher.Invoke(() => {
var ms = new MemoryStream();
inkCanvas.Strokes.Save(ms);
ms.Position = 0;
memoryStreams[previousSlideID] = ms;
if (inkCanvas.Strokes.Count > Settings.Automation.MinimumAutomationStrokeNumber && Settings.PowerPointSettings.IsAutoSaveScreenShotInPowerPoint && !_isPptClickingBtnTurned)
SaveScreenShot(true, Wn.Presentation.Name + "/" + Wn.View.CurrentShowPosition);
_isPptClickingBtnTurned = false;
if (inkCanvas.Strokes.Count > Settings.Automation.MinimumAutomationStrokeNumber &&
Settings.PowerPointSettings.IsAutoSaveScreenShotInPowerPoint && !_isPptClickingBtnTurned)
SaveScreenShot(true, Wn.Presentation.Name + "/" + Wn.View.CurrentShowPosition);
_isPptClickingBtnTurned = false;
ClearStrokes(true);
timeMachine.ClearStrokeHistory();
ClearStrokes(true);
timeMachine.ClearStrokeHistory();
try {
if (memoryStreams[Wn.View.CurrentShowPosition] != null && memoryStreams[Wn.View.CurrentShowPosition].Length > 0) {
inkCanvas.Strokes.Add(new StrokeCollection(memoryStreams[Wn.View.CurrentShowPosition]));
}
} catch { }
try {
if (memoryStreams[Wn.View.CurrentShowPosition] != null &&
memoryStreams[Wn.View.CurrentShowPosition].Length > 0)
inkCanvas.Strokes.Add(new StrokeCollection(memoryStreams[Wn.View.CurrentShowPosition]));
}
catch {
// ignored
}
PptNavigationTextBlock.Text = $"{Wn.View.CurrentShowPosition}/{Wn.Presentation.Slides.Count}";
});
previousSlideID = Wn.View.CurrentShowPosition;
}
PptNavigationTextBlock.Text = $"{Wn.View.CurrentShowPosition}/{Wn.Presentation.Slides.Count}";
});
previousSlideID = Wn.View.CurrentShowPosition;
}
private bool _isPptClickingBtnTurned = false;
@ -501,18 +498,28 @@ namespace Ink_Canvas {
if (inkCanvas.Strokes.Count > Settings.Automation.MinimumAutomationStrokeNumber &&
Settings.PowerPointSettings.IsAutoSaveScreenShotInPowerPoint)
SaveScreenShot(true, pptApplication.SlideShowWindows[1].Presentation.Name + "/" + pptApplication.SlideShowWindows[1].View.CurrentShowPosition);
SaveScreenShot(true,
pptApplication.SlideShowWindows[1].Presentation.Name + "/" +
pptApplication.SlideShowWindows[1].View.CurrentShowPosition);
try {
new Thread(new ThreadStart(() => {
try {
pptApplication.SlideShowWindows[1].Activate();
} catch { }
}
catch {
// ignored
}
try {
pptApplication.SlideShowWindows[1].View.Previous();
} catch { } // Without this catch{}, app will crash when click the pre-page button in the fir page in some special env.
}
catch {
// ignored
} // Without this catch{}, app will crash when click the pre-page button in the fir page in some special env.
})).Start();
} catch {
}
catch {
StackPanelPPTControls.Visibility = Visibility.Collapsed;
BottomViewboxPPTSidesControl.Visibility = Visibility.Collapsed;
LeftSidePanelForPPTNavigation.Visibility = Visibility.Collapsed;
@ -528,20 +535,31 @@ namespace Ink_Canvas {
AnimationsHelper.HideWithSlideAndFade(BlackboardRightSide);
currentMode = 0;
}
_isPptClickingBtnTurned = true;
if (inkCanvas.Strokes.Count > Settings.Automation.MinimumAutomationStrokeNumber &&
Settings.PowerPointSettings.IsAutoSaveScreenShotInPowerPoint)
SaveScreenShot(true, pptApplication.SlideShowWindows[1].Presentation.Name + "/" + pptApplication.SlideShowWindows[1].View.CurrentShowPosition);
SaveScreenShot(true,
pptApplication.SlideShowWindows[1].Presentation.Name + "/" +
pptApplication.SlideShowWindows[1].View.CurrentShowPosition);
try {
new Thread(new ThreadStart(() => {
try {
pptApplication.SlideShowWindows[1].Activate();
} catch { }
}
catch {
// ignored
}
try {
pptApplication.SlideShowWindows[1].View.Next();
} catch { }
}
catch {
// ignored
}
})).Start();
} catch {
}
catch {
StackPanelPPTControls.Visibility = Visibility.Collapsed;
BottomViewboxPPTSidesControl.Visibility = Visibility.Collapsed;
LeftSidePanelForPPTNavigation.Visibility = Visibility.Collapsed;
@ -557,7 +575,9 @@ namespace Ink_Canvas {
CursorIcon_Click(null, null);
try {
pptApplication.SlideShowWindows[1].SlideNavigation.Visible = true;
} catch { }
}
catch { }
// 控制居中
if (!isFloatingBarFolded) {
await Task.Delay(100);
@ -569,24 +589,31 @@ namespace Ink_Canvas {
new Thread(new ThreadStart(() => {
try {
presentation.SlideShowSettings.Run();
} catch { }
}
catch { }
})).Start();
}
private async void BtnPPTSlideShowEnd_Click(object sender, RoutedEventArgs e) {
Application.Current.Dispatcher.Invoke(() => {
try {
MemoryStream ms = new MemoryStream();
var ms = new MemoryStream();
inkCanvas.Strokes.Save(ms);
ms.Position = 0;
memoryStreams[pptApplication.SlideShowWindows[1].View.CurrentShowPosition] = ms;
timeMachine.ClearStrokeHistory();
} catch { }
}
catch {
// ignored
}
});
new Thread(new ThreadStart(() => {
try {
pptApplication.SlideShowWindows[1].View.Exit();
} catch { }
}
catch {
// ignored
}
})).Start();
HideSubPanels("cursor");
@ -608,4 +635,4 @@ namespace Ink_Canvas {
BtnPPTSlideShowEnd_Click(BtnPPTSlideShowEnd, null);
}
}
}
}

View File

@ -22,27 +22,24 @@ namespace Ink_Canvas {
private void SaveInkCanvasStrokes(bool newNotice = true, bool saveByUser = false) {
try {
string savePath = Settings.Automation.AutoSavedStrokesLocation
+ (saveByUser ? @"\User Saved - " : @"\Auto Saved - ")
+ (currentMode == 0 ? "Annotation Strokes" : "BlackBoard Strokes");
if (!Directory.Exists(savePath)) {
Directory.CreateDirectory(savePath);
}
var savePath = Settings.Automation.AutoSavedStrokesLocation
+ (saveByUser ? @"\User Saved - " : @"\Auto Saved - ")
+ (currentMode == 0 ? "Annotation Strokes" : "BlackBoard Strokes");
if (!Directory.Exists(savePath)) Directory.CreateDirectory(savePath);
string savePathWithName;
if (currentMode != 0) { // 黑板模式下
savePathWithName = savePath + @"\" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss-fff") + " Page-" + CurrentWhiteboardIndex + " StrokesCount-" + inkCanvas.Strokes.Count + ".icstk";
} else {
if (currentMode != 0) // 黑板模式下
savePathWithName = savePath + @"\" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss-fff") + " Page-" +
CurrentWhiteboardIndex + " StrokesCount-" + inkCanvas.Strokes.Count + ".icstk";
else
//savePathWithName = savePath + @"\" + DateTime.Now.ToString("u").Replace(':', '-') + ".icstk";
savePathWithName = savePath + @"\" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss-fff") + ".icstk";
}
FileStream fs = new FileStream(savePathWithName, FileMode.Create);
var fs = new FileStream(savePathWithName, FileMode.Create);
inkCanvas.Strokes.Save(fs);
if (newNotice) {
ShowNotification("墨迹成功保存至 " + savePathWithName);
}
} catch (Exception Ex) {
if (newNotice) ShowNotification("墨迹成功保存至 " + savePathWithName);
}
catch (Exception ex) {
ShowNotification("墨迹保存失败");
LogHelper.WriteLogToFile("墨迹保存失败 | " + Ex.ToString(), LogHelper.LogType.Error);
LogHelper.WriteLogToFile("墨迹保存失败 | " + ex.ToString(), LogHelper.LogType.Error);
}
}
@ -51,42 +48,41 @@ namespace Ink_Canvas {
AnimationsHelper.HideWithSlideAndFade(BorderTools);
AnimationsHelper.HideWithSlideAndFade(BoardBorderTools);
OpenFileDialog openFileDialog = new OpenFileDialog();
var openFileDialog = new OpenFileDialog();
openFileDialog.InitialDirectory = Settings.Automation.AutoSavedStrokesLocation;
openFileDialog.Title = "打开墨迹文件";
openFileDialog.Filter = "Ink Canvas Strokes File (*.icstk)|*.icstk";
if (openFileDialog.ShowDialog() == true) {
LogHelper.WriteLogToFile(string.Format("Strokes Insert: Name: {0}", openFileDialog.FileName), LogHelper.LogType.Event);
try {
var fileStreamHasNoStroke = false;
using (var fs = new FileStream(openFileDialog.FileName, FileMode.Open, FileAccess.Read)) {
var strokes = new StrokeCollection(fs);
fileStreamHasNoStroke = strokes.Count == 0;
if (!fileStreamHasNoStroke) {
ClearStrokes(true);
timeMachine.ClearStrokeHistory();
inkCanvas.Strokes.Add(strokes);
LogHelper.NewLog(string.Format("Strokes Insert: Strokes Count: {0}", inkCanvas.Strokes.Count.ToString()));
}
if (openFileDialog.ShowDialog() != true) return;
LogHelper.WriteLogToFile($"Strokes Insert: Name: {openFileDialog.FileName}",
LogHelper.LogType.Event);
try {
var fileStreamHasNoStroke = false;
using (var fs = new FileStream(openFileDialog.FileName, FileMode.Open, FileAccess.Read)) {
var strokes = new StrokeCollection(fs);
fileStreamHasNoStroke = strokes.Count == 0;
if (!fileStreamHasNoStroke) {
ClearStrokes(true);
timeMachine.ClearStrokeHistory();
inkCanvas.Strokes.Add(strokes);
LogHelper.NewLog($"Strokes Insert: Strokes Count: {inkCanvas.Strokes.Count.ToString()}");
}
if (fileStreamHasNoStroke) {
using (var ms = new MemoryStream(File.ReadAllBytes(openFileDialog.FileName))) {
ms.Seek(0, SeekOrigin.Begin);
var strokes = new StrokeCollection(ms);
ClearStrokes(true);
timeMachine.ClearStrokeHistory();
inkCanvas.Strokes.Add(strokes);
LogHelper.NewLog(string.Format("Strokes Insert (2): Strokes Count: {0}", strokes.Count.ToString()));
}
}
if (fileStreamHasNoStroke)
using (var ms = new MemoryStream(File.ReadAllBytes(openFileDialog.FileName))) {
ms.Seek(0, SeekOrigin.Begin);
var strokes = new StrokeCollection(ms);
ClearStrokes(true);
timeMachine.ClearStrokeHistory();
inkCanvas.Strokes.Add(strokes);
LogHelper.NewLog($"Strokes Insert (2): Strokes Count: {strokes.Count.ToString()}");
}
if (inkCanvas.Visibility != Visibility.Visible) {
SymbolIconCursor_Click(sender, null);
}
} catch {
ShowNotification("墨迹打开失败");
}
if (inkCanvas.Visibility != Visibility.Visible) SymbolIconCursor_Click(sender, null);
}
catch {
ShowNotification("墨迹打开失败");
}
}
}
}
}

View File

@ -6,47 +6,46 @@ using System.Windows;
namespace Ink_Canvas {
public partial class MainWindow : Window {
private void SaveScreenShot(bool isHideNotification, string fileName = null) {
System.Drawing.Rectangle rc = System.Windows.Forms.SystemInformation.VirtualScreen;
var bitmap = new System.Drawing.Bitmap(rc.Width, rc.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
var rc = System.Windows.Forms.SystemInformation.VirtualScreen;
var bitmap = new System.Drawing.Bitmap(rc.Width, rc.Height, PixelFormat.Format32bppArgb);
using (System.Drawing.Graphics memoryGrahics = System.Drawing.Graphics.FromImage(bitmap)) {
using (var memoryGrahics = System.Drawing.Graphics.FromImage(bitmap)) {
memoryGrahics.CopyFromScreen(rc.X, rc.Y, 0, 0, rc.Size, System.Drawing.CopyPixelOperation.SourceCopy);
}
if (Settings.Automation.IsSaveScreenshotsInDateFolders) {
if (string.IsNullOrWhiteSpace(fileName)) fileName = DateTime.Now.ToString("HH-mm-ss");
string savePath = Settings.Automation.AutoSavedStrokesLocation + @"\Auto Saved - Screenshots\{DateTime.Now.Date:yyyyMMdd}\{fileName}.png";
if (!Directory.Exists(Path.GetDirectoryName(savePath))) {
var savePath = Settings.Automation.AutoSavedStrokesLocation +
@"\Auto Saved - Screenshots\{DateTime.Now.Date:yyyyMMdd}\{fileName}.png";
if (!Directory.Exists(Path.GetDirectoryName(savePath)))
Directory.CreateDirectory(Path.GetDirectoryName(savePath));
}
bitmap.Save(savePath, ImageFormat.Png);
if (!isHideNotification) {
ShowNotification("截图成功保存至 " + savePath);
}
} else {
string savePath = Settings.Automation.AutoSavedStrokesLocation + @"\Auto Saved - Screenshots";
if (!Directory.Exists(savePath)) {
Directory.CreateDirectory(savePath);
}
bitmap.Save(savePath + @"\" + DateTime.Now.ToString("u").Replace(':', '-') + ".png", ImageFormat.Png);
if (!isHideNotification) {
ShowNotification("截图成功保存至 " + savePath + @"\" + DateTime.Now.ToString("u").Replace(':', '-') + ".png");
}
if (!isHideNotification) ShowNotification("截图成功保存至 " + savePath);
}
else {
var savePath = Settings.Automation.AutoSavedStrokesLocation + @"\Auto Saved - Screenshots";
if (!Directory.Exists(savePath)) Directory.CreateDirectory(savePath);
bitmap.Save(savePath + @"\" + DateTime.Now.ToString("u").Replace(':', '-') + ".png", ImageFormat.Png);
if (!isHideNotification)
ShowNotification("截图成功保存至 " + savePath + @"\" + DateTime.Now.ToString("u").Replace(':', '-') +
".png");
}
if (Settings.Automation.IsAutoSaveStrokesAtScreenshot) SaveInkCanvasStrokes(false, false);
}
private void SaveScreenShotToDesktop() {
System.Drawing.Rectangle rc = System.Windows.Forms.SystemInformation.VirtualScreen;
var bitmap = new System.Drawing.Bitmap(rc.Width, rc.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
var rc = System.Windows.Forms.SystemInformation.VirtualScreen;
var bitmap = new System.Drawing.Bitmap(rc.Width, rc.Height, PixelFormat.Format32bppArgb);
using (System.Drawing.Graphics memoryGrahics = System.Drawing.Graphics.FromImage(bitmap)) {
using (var memoryGrahics = System.Drawing.Graphics.FromImage(bitmap)) {
memoryGrahics.CopyFromScreen(rc.X, rc.Y, 0, 0, rc.Size, System.Drawing.CopyPixelOperation.SourceCopy);
}
string savePath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
var savePath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
bitmap.Save(savePath + @"\" + DateTime.Now.ToString("u").Replace(':', '-') + ".png", ImageFormat.Png);
ShowNotification("截图成功保存至【桌面" + @"\" + DateTime.Now.ToString("u").Replace(':', '-') + ".png】");
if (Settings.Automation.IsAutoSaveStrokesAtScreenshot) SaveInkCanvasStrokes(false, false);
}
}
}
}

View File

@ -12,25 +12,23 @@ namespace Ink_Canvas {
public partial class MainWindow : Window {
#region Floating Control
object lastBorderMouseDownObject;
private object lastBorderMouseDownObject;
private void Border_MouseDown(object sender, MouseButtonEventArgs e) {
lastBorderMouseDownObject = sender;
}
bool isStrokeSelectionCloneOn = false;
private void BorderStrokeSelectionClone_MouseUp(object sender, MouseButtonEventArgs e)
{
private bool isStrokeSelectionCloneOn = false;
private void BorderStrokeSelectionClone_MouseUp(object sender, MouseButtonEventArgs e) {
if (lastBorderMouseDownObject != sender) return;
if (isStrokeSelectionCloneOn)
{
if (isStrokeSelectionCloneOn) {
BorderStrokeSelectionClone.Background = Brushes.Transparent;
isStrokeSelectionCloneOn = false;
}
else
{
else {
BorderStrokeSelectionClone.Background = new SolidColorBrush(StringToColor("#FF1ED760"));
isStrokeSelectionCloneOn = true;
@ -63,21 +61,21 @@ namespace Ink_Canvas {
}
private void ChangeStrokeThickness(double multipler) {
foreach (Stroke stroke in inkCanvas.GetSelectedStrokes()) {
foreach (var stroke in inkCanvas.GetSelectedStrokes()) {
var newWidth = stroke.DrawingAttributes.Width * multipler;
var newHeight = stroke.DrawingAttributes.Height * multipler;
if (newWidth >= DrawingAttributes.MinWidth && newWidth <= DrawingAttributes.MaxWidth
&& newHeight >= DrawingAttributes.MinHeight && newHeight <= DrawingAttributes.MaxHeight) {
stroke.DrawingAttributes.Width = newWidth;
stroke.DrawingAttributes.Height = newHeight;
}
if (!(newWidth >= DrawingAttributes.MinWidth) || !(newWidth <= DrawingAttributes.MaxWidth)
|| !(newHeight >= DrawingAttributes.MinHeight) ||
!(newHeight <= DrawingAttributes.MaxHeight)) continue;
stroke.DrawingAttributes.Width = newWidth;
stroke.DrawingAttributes.Height = newHeight;
}
}
private void GridPenWidthRestore_MouseUp(object sender, MouseButtonEventArgs e) {
if (lastBorderMouseDownObject != sender) return;
foreach (Stroke stroke in inkCanvas.GetSelectedStrokes()) {
foreach (var stroke in inkCanvas.GetSelectedStrokes()) {
stroke.DrawingAttributes.Width = inkCanvas.DefaultDrawingAttributes.Width;
stroke.DrawingAttributes.Height = inkCanvas.DefaultDrawingAttributes.Height;
}
@ -86,23 +84,20 @@ namespace Ink_Canvas {
private void ImageFlipHorizontal_MouseUp(object sender, MouseButtonEventArgs e) {
if (lastBorderMouseDownObject != sender) return;
Matrix m = new Matrix();
var m = new Matrix();
// Find center of element and then transform to get current location of center
FrameworkElement fe = e.Source as FrameworkElement;
Point center = new Point(fe.ActualWidth / 2, fe.ActualHeight / 2);
var fe = e.Source as FrameworkElement;
var center = new Point(fe.ActualWidth / 2, fe.ActualHeight / 2);
center = new Point(inkCanvas.GetSelectionBounds().Left + inkCanvas.GetSelectionBounds().Width / 2,
inkCanvas.GetSelectionBounds().Top + inkCanvas.GetSelectionBounds().Height / 2);
center = m.Transform(center); // 转换为矩阵缩放和旋转的中心点
center = m.Transform(center); // 转换为矩阵缩放和旋转的中心点
// Update matrix to reflect translation/rotation
m.ScaleAt(-1, 1, center.X, center.Y); // 缩放
m.ScaleAt(-1, 1, center.X, center.Y); // 缩放
StrokeCollection targetStrokes = inkCanvas.GetSelectedStrokes();
StrokeCollection resultStrokes = targetStrokes.Clone();
foreach (Stroke stroke in targetStrokes) {
stroke.Transform(m, false);
}
var targetStrokes = inkCanvas.GetSelectedStrokes();
foreach (var stroke in targetStrokes) stroke.Transform(m, false);
timeMachine.CommitStrokeManipulationHistory(targetStrokes, m);
//updateBorderStrokeSelectionControlLocation();
@ -111,87 +106,76 @@ namespace Ink_Canvas {
private void ImageFlipVertical_MouseUp(object sender, MouseButtonEventArgs e) {
if (lastBorderMouseDownObject != sender) return;
Matrix m = new Matrix();
var m = new Matrix();
// Find center of element and then transform to get current location of center
FrameworkElement fe = e.Source as FrameworkElement;
Point center = new Point(fe.ActualWidth / 2, fe.ActualHeight / 2);
var fe = e.Source as FrameworkElement;
var center = new Point(fe.ActualWidth / 2, fe.ActualHeight / 2);
center = new Point(inkCanvas.GetSelectionBounds().Left + inkCanvas.GetSelectionBounds().Width / 2,
inkCanvas.GetSelectionBounds().Top + inkCanvas.GetSelectionBounds().Height / 2);
center = m.Transform(center); // 转换为矩阵缩放和旋转的中心点
center = m.Transform(center); // 转换为矩阵缩放和旋转的中心点
// Update matrix to reflect translation/rotation
m.ScaleAt(1, -1, center.X, center.Y); // 缩放
m.ScaleAt(1, -1, center.X, center.Y); // 缩放
StrokeCollection targetStrokes = inkCanvas.GetSelectedStrokes();
StrokeCollection resultStrokes = targetStrokes.Clone();
foreach (Stroke stroke in targetStrokes) {
stroke.Transform(m, false);
}
var targetStrokes = inkCanvas.GetSelectedStrokes();
foreach (var stroke in targetStrokes) stroke.Transform(m, false);
timeMachine.CommitStrokeManipulationHistory(targetStrokes, m);
}
private void ImageRotate45_MouseUp(object sender, MouseButtonEventArgs e) {
if (lastBorderMouseDownObject != sender) return;
Matrix m = new Matrix();
var m = new Matrix();
// Find center of element and then transform to get current location of center
FrameworkElement fe = e.Source as FrameworkElement;
Point center = new Point(fe.ActualWidth / 2, fe.ActualHeight / 2);
var fe = e.Source as FrameworkElement;
var center = new Point(fe.ActualWidth / 2, fe.ActualHeight / 2);
center = new Point(inkCanvas.GetSelectionBounds().Left + inkCanvas.GetSelectionBounds().Width / 2,
inkCanvas.GetSelectionBounds().Top + inkCanvas.GetSelectionBounds().Height / 2);
center = m.Transform(center); // 转换为矩阵缩放和旋转的中心点
center = m.Transform(center); // 转换为矩阵缩放和旋转的中心点
// Update matrix to reflect translation/rotation
m.RotateAt(45, center.X, center.Y); // 旋转
m.RotateAt(45, center.X, center.Y); // 旋转
StrokeCollection targetStrokes = inkCanvas.GetSelectedStrokes();
StrokeCollection resultStrokes = targetStrokes.Clone();
foreach (Stroke stroke in targetStrokes) {
stroke.Transform(m, false);
}
var targetStrokes = inkCanvas.GetSelectedStrokes();
foreach (var stroke in targetStrokes) stroke.Transform(m, false);
timeMachine.CommitStrokeManipulationHistory(targetStrokes, m);
}
private void ImageRotate90_MouseUp(object sender, MouseButtonEventArgs e) {
if (lastBorderMouseDownObject != sender) return;
Matrix m = new Matrix();
var m = new Matrix();
// Find center of element and then transform to get current location of center
FrameworkElement fe = e.Source as FrameworkElement;
Point center = new Point(fe.ActualWidth / 2, fe.ActualHeight / 2);
var fe = e.Source as FrameworkElement;
var center = new Point(fe.ActualWidth / 2, fe.ActualHeight / 2);
center = new Point(inkCanvas.GetSelectionBounds().Left + inkCanvas.GetSelectionBounds().Width / 2,
inkCanvas.GetSelectionBounds().Top + inkCanvas.GetSelectionBounds().Height / 2);
center = m.Transform(center); // 转换为矩阵缩放和旋转的中心点
center = m.Transform(center); // 转换为矩阵缩放和旋转的中心点
// Update matrix to reflect translation/rotation
m.RotateAt(90, center.X, center.Y); // 旋转
m.RotateAt(90, center.X, center.Y); // 旋转
StrokeCollection targetStrokes = inkCanvas.GetSelectedStrokes();
StrokeCollection resultStrokes = targetStrokes.Clone();
foreach (Stroke stroke in targetStrokes) {
stroke.Transform(m, false);
}
var targetStrokes = inkCanvas.GetSelectedStrokes();
foreach (var stroke in targetStrokes) stroke.Transform(m, false);
timeMachine.CommitStrokeManipulationHistory(targetStrokes, m);
}
#endregion
bool isGridInkCanvasSelectionCoverMouseDown = false;
StrokeCollection StrokesSelectionClone = new StrokeCollection();
private bool isGridInkCanvasSelectionCoverMouseDown = false;
private StrokeCollection StrokesSelectionClone = new StrokeCollection();
private void GridInkCanvasSelectionCover_MouseDown(object sender, MouseButtonEventArgs e) {
isGridInkCanvasSelectionCoverMouseDown = true;
}
private void GridInkCanvasSelectionCover_MouseUp(object sender, MouseButtonEventArgs e) {
if (isGridInkCanvasSelectionCoverMouseDown) {
isGridInkCanvasSelectionCoverMouseDown = false;
GridInkCanvasSelectionCover.Visibility = Visibility.Collapsed;
}
if (!isGridInkCanvasSelectionCoverMouseDown) return;
isGridInkCanvasSelectionCoverMouseDown = false;
GridInkCanvasSelectionCover.Visibility = Visibility.Collapsed;
}
private void BtnSelect_Click(object sender, RoutedEventArgs e) {
@ -202,29 +186,30 @@ namespace Ink_Canvas {
if (inkCanvas.GetSelectedStrokes().Count == inkCanvas.Strokes.Count) {
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
inkCanvas.EditingMode = InkCanvasEditingMode.Select;
} else {
StrokeCollection selectedStrokes = new StrokeCollection();
foreach (Stroke stroke in inkCanvas.Strokes) {
if (stroke.GetBounds().Width > 0 && stroke.GetBounds().Height > 0) {
}
else {
var selectedStrokes = new StrokeCollection();
foreach (var stroke in inkCanvas.Strokes)
if (stroke.GetBounds().Width > 0 && stroke.GetBounds().Height > 0)
selectedStrokes.Add(stroke);
}
}
inkCanvas.Select(selectedStrokes);
}
} else {
}
else {
inkCanvas.EditingMode = InkCanvasEditingMode.Select;
}
}
double BorderStrokeSelectionControlWidth = 490.0;
double BorderStrokeSelectionControlHeight = 80.0;
bool isProgramChangeStrokeSelection = false;
private double BorderStrokeSelectionControlWidth = 490.0;
private double BorderStrokeSelectionControlHeight = 80.0;
private bool isProgramChangeStrokeSelection = false;
private void inkCanvas_SelectionChanged(object sender, EventArgs e) {
if (isProgramChangeStrokeSelection) return;
if (inkCanvas.GetSelectedStrokes().Count == 0) {
GridInkCanvasSelectionCover.Visibility = Visibility.Collapsed;
} else {
}
else {
GridInkCanvasSelectionCover.Visibility = Visibility.Visible;
BorderStrokeSelectionClone.Background = Brushes.Transparent;
isStrokeSelectionCloneOn = false;
@ -233,12 +218,15 @@ namespace Ink_Canvas {
}
private void updateBorderStrokeSelectionControlLocation() {
double borderLeft = (inkCanvas.GetSelectionBounds().Left + inkCanvas.GetSelectionBounds().Right - BorderStrokeSelectionControlWidth) / 2;
double borderTop = inkCanvas.GetSelectionBounds().Bottom + 1;
var borderLeft = (inkCanvas.GetSelectionBounds().Left + inkCanvas.GetSelectionBounds().Right -
BorderStrokeSelectionControlWidth) / 2;
var borderTop = inkCanvas.GetSelectionBounds().Bottom + 1;
if (borderLeft < 0) borderLeft = 0;
if (borderTop < 0) borderTop = 0;
if (Width - borderLeft < BorderStrokeSelectionControlWidth || double.IsNaN(borderLeft)) borderLeft = Width - BorderStrokeSelectionControlWidth;
if (Height - borderTop < BorderStrokeSelectionControlHeight || double.IsNaN(borderTop)) borderTop = Height - BorderStrokeSelectionControlHeight;
if (Width - borderLeft < BorderStrokeSelectionControlWidth || double.IsNaN(borderLeft))
borderLeft = Width - BorderStrokeSelectionControlWidth;
if (Height - borderTop < BorderStrokeSelectionControlHeight || double.IsNaN(borderTop))
borderTop = Height - BorderStrokeSelectionControlHeight;
if (borderTop > 60) borderTop -= 60;
BorderStrokeSelectionControl.Margin = new Thickness(borderLeft, borderTop, 0, 0);
@ -248,77 +236,75 @@ namespace Ink_Canvas {
e.Mode = ManipulationModes.All;
}
private void GridInkCanvasSelectionCover_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e) {
}
private void
GridInkCanvasSelectionCover_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e) { }
private void GridInkCanvasSelectionCover_ManipulationDelta(object sender, ManipulationDeltaEventArgs e) {
try {
if (dec.Count >= 1) {
ManipulationDelta md = e.DeltaManipulation;
Vector trans = md.Translation; // 获得位移矢量
double rotate = md.Rotation; // 获得旋转角度
Vector scale = md.Scale; // 获得缩放倍数
var md = e.DeltaManipulation;
var trans = md.Translation; // 获得位移矢量
var rotate = md.Rotation; // 获得旋转角度
var scale = md.Scale; // 获得缩放倍数
Matrix m = new Matrix();
var m = new Matrix();
// Find center of element and then transform to get current location of center
FrameworkElement fe = e.Source as FrameworkElement;
Point center = new Point(fe.ActualWidth / 2, fe.ActualHeight / 2);
var fe = e.Source as FrameworkElement;
var center = new Point(fe.ActualWidth / 2, fe.ActualHeight / 2);
center = new Point(inkCanvas.GetSelectionBounds().Left + inkCanvas.GetSelectionBounds().Width / 2,
inkCanvas.GetSelectionBounds().Top + inkCanvas.GetSelectionBounds().Height / 2);
center = m.Transform(center); // 转换为矩阵缩放和旋转的中心点
center = m.Transform(center); // 转换为矩阵缩放和旋转的中心点
// Update matrix to reflect translation/rotation
m.Translate(trans.X, trans.Y); // 移动
m.ScaleAt(scale.X, scale.Y, center.X, center.Y); // 缩放
m.Translate(trans.X, trans.Y); // 移动
m.ScaleAt(scale.X, scale.Y, center.X, center.Y); // 缩放
StrokeCollection strokes = inkCanvas.GetSelectedStrokes();
if (StrokesSelectionClone.Count != 0) {
var strokes = inkCanvas.GetSelectedStrokes();
if (StrokesSelectionClone.Count != 0)
strokes = StrokesSelectionClone;
} else if (Settings.Gesture.IsEnableTwoFingerRotationOnSelection) {
m.RotateAt(rotate, center.X, center.Y); // 旋转
}
foreach (Stroke stroke in strokes) {
else if (Settings.Gesture.IsEnableTwoFingerRotationOnSelection)
m.RotateAt(rotate, center.X, center.Y); // 旋转
foreach (var stroke in strokes) {
stroke.Transform(m, false);
try {
stroke.DrawingAttributes.Width *= md.Scale.X;
stroke.DrawingAttributes.Height *= md.Scale.Y;
} catch { }
}
catch { }
}
if (lastTempManiputlaionMatrix == null)
{
if (lastTempManiputlaionMatrix == null) {
lastTempManiputlaionMatrix = m;
lastTempStrokeCollection = strokes;
}
else
{
else {
lastTempManiputlaionMatrix?.Append(m);
}
updateBorderStrokeSelectionControlLocation();
}
} catch { }
}
catch { }
}
private void GridInkCanvasSelectionCover_TouchDown(object sender, TouchEventArgs e) {
}
private void GridInkCanvasSelectionCover_TouchDown(object sender, TouchEventArgs e) { }
private void GridInkCanvasSelectionCover_TouchUp(object sender, TouchEventArgs e) {
}
private void GridInkCanvasSelectionCover_TouchUp(object sender, TouchEventArgs e) { }
private Point lastTouchPointOnGridInkCanvasCover = new Point(0, 0);
Point lastTouchPointOnGridInkCanvasCover = new Point(0, 0);
private void GridInkCanvasSelectionCover_PreviewTouchDown(object sender, TouchEventArgs e) {
dec.Add(e.TouchDevice.Id);
//设备1个的时候记录中心点
if (dec.Count == 1) {
TouchPoint touchPoint = e.GetTouchPoint(null);
var touchPoint = e.GetTouchPoint(null);
centerPoint = touchPoint.Position;
lastTouchPointOnGridInkCanvasCover = touchPoint.Position;
if (isStrokeSelectionCloneOn) {
StrokeCollection strokes = inkCanvas.GetSelectedStrokes();
var strokes = inkCanvas.GetSelectedStrokes();
isProgramChangeStrokeSelection = true;
inkCanvas.Select(new StrokeCollection());
StrokesSelectionClone = strokes.Clone();
@ -334,20 +320,21 @@ namespace Ink_Canvas {
if (dec.Count >= 1) return;
isProgramChangeStrokeSelection = false;
if (lastTouchPointOnGridInkCanvasCover == e.GetTouchPoint(null).Position) {
if (lastTouchPointOnGridInkCanvasCover.X < inkCanvas.GetSelectionBounds().Left ||
lastTouchPointOnGridInkCanvasCover.Y < inkCanvas.GetSelectionBounds().Top ||
lastTouchPointOnGridInkCanvasCover.X > inkCanvas.GetSelectionBounds().Right ||
lastTouchPointOnGridInkCanvasCover.Y > inkCanvas.GetSelectionBounds().Bottom) {
inkCanvas.Select(new StrokeCollection());
StrokesSelectionClone = new StrokeCollection();
}
} else if (inkCanvas.GetSelectedStrokes().Count == 0) {
if (!(lastTouchPointOnGridInkCanvasCover.X < inkCanvas.GetSelectionBounds().Left) &&
!(lastTouchPointOnGridInkCanvasCover.Y < inkCanvas.GetSelectionBounds().Top) &&
!(lastTouchPointOnGridInkCanvasCover.X > inkCanvas.GetSelectionBounds().Right) &&
!(lastTouchPointOnGridInkCanvasCover.Y > inkCanvas.GetSelectionBounds().Bottom)) return;
inkCanvas.Select(new StrokeCollection());
StrokesSelectionClone = new StrokeCollection();
}
else if (inkCanvas.GetSelectedStrokes().Count == 0) {
GridInkCanvasSelectionCover.Visibility = Visibility.Collapsed;
StrokesSelectionClone = new StrokeCollection();
} else {
}
else {
GridInkCanvasSelectionCover.Visibility = Visibility.Visible;
StrokesSelectionClone = new StrokeCollection();
}
}
}
}
}

View File

@ -18,19 +18,23 @@ namespace Ink_Canvas {
private void ToggleSwitchIsAutoUpdate_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.Startup.IsAutoUpdate = ToggleSwitchIsAutoUpdate.IsOn;
ToggleSwitchIsAutoUpdateWithSilence.Visibility = ToggleSwitchIsAutoUpdate.IsOn ? Visibility.Visible : Visibility.Collapsed;
ToggleSwitchIsAutoUpdateWithSilence.Visibility =
ToggleSwitchIsAutoUpdate.IsOn ? Visibility.Visible : Visibility.Collapsed;
SaveSettingsToFile();
}
private void ToggleSwitchIsAutoUpdateWithSilence_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.Startup.IsAutoUpdateWithSilence = ToggleSwitchIsAutoUpdateWithSilence.IsOn;
AutoUpdateTimePeriodBlock.Visibility = Settings.Startup.IsAutoUpdateWithSilence ? Visibility.Visible : Visibility.Collapsed;
AutoUpdateTimePeriodBlock.Visibility =
Settings.Startup.IsAutoUpdateWithSilence ? Visibility.Visible : Visibility.Collapsed;
SaveSettingsToFile();
}
private void AutoUpdateWithSilenceStartTimeComboBox_SelectionChanged(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.Startup.AutoUpdateWithSilenceStartTime = (string)AutoUpdateWithSilenceStartTimeComboBox.SelectedItem;
Settings.Startup.AutoUpdateWithSilenceStartTime =
(string)AutoUpdateWithSilenceStartTimeComboBox.SelectedItem;
SaveSettingsToFile();
}
@ -45,7 +49,8 @@ namespace Ink_Canvas {
if (ToggleSwitchRunAtStartup.IsOn) {
StartAutomaticallyDel("InkCanvas");
StartAutomaticallyCreate("Ink Canvas Annotation");
} else {
}
else {
StartAutomaticallyDel("InkCanvas");
StartAutomaticallyDel("Ink Canvas Annotation");
}
@ -63,11 +68,10 @@ namespace Ink_Canvas {
Settings.PowerPointSettings.PowerPointSupport = ToggleSwitchSupportPowerPoint.IsOn;
SaveSettingsToFile();
if (Settings.PowerPointSettings.PowerPointSupport) {
if (Settings.PowerPointSettings.PowerPointSupport)
timerCheckPPT.Start();
} else {
else
timerCheckPPT.Stop();
}
}
private void ToggleSwitchShowCanvasAtNewSlideShow_Toggled(object sender, RoutedEventArgs e) {
@ -83,20 +87,19 @@ namespace Ink_Canvas {
private void ToggleSwitchEnableNibMode_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
if (sender == ToggleSwitchEnableNibMode) {
if (sender == ToggleSwitchEnableNibMode)
ToggleSwitchBoardEnableNibMode.IsOn = ToggleSwitchEnableNibMode.IsOn;
} else {
else
ToggleSwitchEnableNibMode.IsOn = ToggleSwitchBoardEnableNibMode.IsOn;
}
Settings.Startup.IsEnableNibMode = ToggleSwitchEnableNibMode.IsOn;
if (Settings.Startup.IsEnableNibMode) {
if (Settings.Startup.IsEnableNibMode)
BoundsWidth = Settings.Advanced.NibModeBoundsWidth;
} else {
else
BoundsWidth = Settings.Advanced.FingerModeBoundsWidth;
}
SaveSettingsToFile();
}
#endregion
#region Appearance
@ -105,13 +108,11 @@ namespace Ink_Canvas {
if (!isLoaded) return;
Settings.Appearance.IsEnableDisPlayNibModeToggler = ToggleSwitchEnableDisPlayNibModeToggle.IsOn;
SaveSettingsToFile();
if (!ToggleSwitchEnableDisPlayNibModeToggle.IsOn)
{
if (!ToggleSwitchEnableDisPlayNibModeToggle.IsOn) {
NibModeSimpleStackPanel.Visibility = Visibility.Collapsed;
BoardNibModeSimpleStackPanel.Visibility = Visibility.Collapsed;
}
else
{
else {
NibModeSimpleStackPanel.Visibility = Visibility.Visible;
BoardNibModeSimpleStackPanel.Visibility = Visibility.Visible;
}
@ -123,8 +124,7 @@ namespace Ink_Canvas {
// SaveSettingsToFile();
//}
private void ToggleSwitchEnableQuickPanel_Toggled(object sender, RoutedEventArgs e)
{
private void ToggleSwitchEnableQuickPanel_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.Appearance.IsShowQuickPanel = ToggleSwitchEnableQuickPanel.IsOn;
SaveSettingsToFile();
@ -132,45 +132,45 @@ namespace Ink_Canvas {
private void ViewboxFloatingBarScaleTransformValueSlider_ValueChanged(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.Appearance.ViewboxFloatingBarScaleTransformValue = ViewboxFloatingBarScaleTransformValueSlider.Value;
Settings.Appearance.ViewboxFloatingBarScaleTransformValue =
ViewboxFloatingBarScaleTransformValueSlider.Value;
SaveSettingsToFile();
double val = ViewboxFloatingBarScaleTransformValueSlider.Value;
ViewboxFloatingBarScaleTransform.ScaleX = (val > 0.5 && val < 1.25) ? val : val <= 0.5 ? 0.5 : val >= 1.25 ? 1.25 : 1;
ViewboxFloatingBarScaleTransform.ScaleY = (val > 0.5 && val < 1.25) ? val : val <= 0.5 ? 0.5 : val >= 1.25 ? 1.25 : 1;
var val = ViewboxFloatingBarScaleTransformValueSlider.Value;
ViewboxFloatingBarScaleTransform.ScaleX =
val > 0.5 && val < 1.25 ? val : val <= 0.5 ? 0.5 : val >= 1.25 ? 1.25 : 1;
ViewboxFloatingBarScaleTransform.ScaleY =
val > 0.5 && val < 1.25 ? val : val <= 0.5 ? 0.5 : val >= 1.25 ? 1.25 : 1;
// auto align
if (BtnPPTSlideShowEnd.Visibility == Visibility.Visible)
{
ViewboxFloatingBarMarginAnimation(60);
}
else
{
ViewboxFloatingBarMarginAnimation(100,true);
}
ViewboxFloatingBarMarginAnimation(100, true);
}
private void ComboBoxUnFoldBtnImg_SelectionChanged(object sender, RoutedEventArgs e)
{
private void ComboBoxUnFoldBtnImg_SelectionChanged(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.Appearance.UnFoldButtonImageType = ComboBoxUnFoldBtnImg.SelectedIndex;
SaveSettingsToFile();
if (ComboBoxUnFoldBtnImg.SelectedIndex == 0)
{
RightUnFoldBtnImgChevron.Source = new BitmapImage(new Uri("pack://application:,,,/Resources/new-icons/unfold-chevron.png"));
if (ComboBoxUnFoldBtnImg.SelectedIndex == 0) {
RightUnFoldBtnImgChevron.Source =
new BitmapImage(new Uri("pack://application:,,,/Resources/new-icons/unfold-chevron.png"));
RightUnFoldBtnImgChevron.Width = 14;
RightUnFoldBtnImgChevron.Height = 14;
RightUnFoldBtnImgChevron.RenderTransform = new RotateTransform(180);
LeftUnFoldBtnImgChevron.Source = new BitmapImage(new Uri("pack://application:,,,/Resources/new-icons/unfold-chevron.png"));
LeftUnFoldBtnImgChevron.Source =
new BitmapImage(new Uri("pack://application:,,,/Resources/new-icons/unfold-chevron.png"));
LeftUnFoldBtnImgChevron.Width = 14;
LeftUnFoldBtnImgChevron.Height = 14;
LeftUnFoldBtnImgChevron.RenderTransform = null;
}
else if (ComboBoxUnFoldBtnImg.SelectedIndex == 1)
{
RightUnFoldBtnImgChevron.Source = new BitmapImage(new Uri("pack://application:,,,/Resources/new-icons/pen-white.png"));
else if (ComboBoxUnFoldBtnImg.SelectedIndex == 1) {
RightUnFoldBtnImgChevron.Source =
new BitmapImage(new Uri("pack://application:,,,/Resources/new-icons/pen-white.png"));
RightUnFoldBtnImgChevron.Width = 18;
RightUnFoldBtnImgChevron.Height = 18;
RightUnFoldBtnImgChevron.RenderTransform = null;
LeftUnFoldBtnImgChevron.Source = new BitmapImage(new Uri("pack://application:,,,/Resources/new-icons/pen-white.png"));
LeftUnFoldBtnImgChevron.Source =
new BitmapImage(new Uri("pack://application:,,,/Resources/new-icons/pen-white.png"));
LeftUnFoldBtnImgChevron.Width = 18;
LeftUnFoldBtnImgChevron.Height = 18;
LeftUnFoldBtnImgChevron.RenderTransform = null;
@ -179,13 +179,13 @@ namespace Ink_Canvas {
private void ToggleSwitchEnableViewboxBlackBoardScaleTransform_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.Appearance.EnableViewboxBlackBoardScaleTransform = ToggleSwitchEnableViewboxBlackBoardScaleTransform.IsOn;
Settings.Appearance.EnableViewboxBlackBoardScaleTransform =
ToggleSwitchEnableViewboxBlackBoardScaleTransform.IsOn;
SaveSettingsToFile();
LoadSettings();
}
private void ToggleSwitchEnableTimeDisplayInWhiteboardMode_Toggled(object sender, RoutedEventArgs e)
{
private void ToggleSwitchEnableTimeDisplayInWhiteboardMode_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.Appearance.EnableTimeDisplayInWhiteboardMode = ToggleSwitchEnableTimeDisplayInWhiteboardMode.IsOn;
SaveSettingsToFile();
@ -195,16 +195,19 @@ namespace Ink_Canvas {
private void ToggleSwitchShowButtonPPTNavigation_OnToggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.PowerPointSettings.IsShowPPTNavigation = ToggleSwitchShowButtonPPTNavigation.IsOn;
PptNavigationBtn.Visibility = Settings.PowerPointSettings.IsShowPPTNavigation ? Visibility.Visible : Visibility.Collapsed;
PptNavigationBtn.Visibility = Settings.PowerPointSettings.IsShowPPTNavigation
? Visibility.Visible
: Visibility.Collapsed;
SaveSettingsToFile();
}
private void ToggleSwitchShowBottomPPTNavigationPanel_OnToggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.PowerPointSettings.IsShowBottomPPTNavigationPanel = ToggleSwitchShowBottomPPTNavigationPanel.IsOn;
if (BtnPPTSlideShowEnd.Visibility == Visibility.Visible) {
BottomViewboxPPTSidesControl.Visibility = Settings.PowerPointSettings.IsShowBottomPPTNavigationPanel ? Visibility.Visible : Visibility.Collapsed;
}
if (BtnPPTSlideShowEnd.Visibility == Visibility.Visible)
BottomViewboxPPTSidesControl.Visibility = Settings.PowerPointSettings.IsShowBottomPPTNavigationPanel
? Visibility.Visible
: Visibility.Collapsed;
SaveSettingsToFile();
}
@ -212,9 +215,14 @@ namespace Ink_Canvas {
if (!isLoaded) return;
Settings.PowerPointSettings.IsShowSidePPTNavigationPanel = ToggleSwitchShowSidePPTNavigationPanel.IsOn;
if (BtnPPTSlideShowEnd.Visibility == Visibility.Visible) {
LeftSidePanelForPPTNavigation.Visibility = Settings.PowerPointSettings.IsShowSidePPTNavigationPanel ? Visibility.Visible : Visibility.Collapsed;
RightSidePanelForPPTNavigation.Visibility = Settings.PowerPointSettings.IsShowSidePPTNavigationPanel ? Visibility.Visible : Visibility.Collapsed;
LeftSidePanelForPPTNavigation.Visibility = Settings.PowerPointSettings.IsShowSidePPTNavigationPanel
? Visibility.Visible
: Visibility.Collapsed;
RightSidePanelForPPTNavigation.Visibility = Settings.PowerPointSettings.IsShowSidePPTNavigationPanel
? Visibility.Visible
: Visibility.Collapsed;
}
SaveSettingsToFile();
}
@ -236,10 +244,12 @@ namespace Ink_Canvas {
if (sender == ComboBoxPenStyle) {
Settings.Canvas.InkStyle = ComboBoxPenStyle.SelectedIndex;
BoardComboBoxPenStyle.SelectedIndex = ComboBoxPenStyle.SelectedIndex;
} else {
}
else {
Settings.Canvas.InkStyle = BoardComboBoxPenStyle.SelectedIndex;
ComboBoxPenStyle.SelectedIndex = BoardComboBoxPenStyle.SelectedIndex;
}
SaveSettingsToFile();
}
@ -249,16 +259,13 @@ namespace Ink_Canvas {
SaveSettingsToFile();
}
private void ComboBoxEraserSizeFloatingBar_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
private void ComboBoxEraserSizeFloatingBar_SelectionChanged(object sender, SelectionChangedEventArgs e) {
if (!isLoaded) return;
Settings.Canvas.EraserSize = ComboBoxEraserSizeFloatingBar.SelectedIndex;
ComboBoxEraserSize.SelectedIndex = ComboBoxEraserSizeFloatingBar.SelectedIndex;
if (Settings.Canvas.EraserShapeType == 0)
{
if (Settings.Canvas.EraserShapeType == 0) {
double k = 1;
switch (ComboBoxEraserSizeFloatingBar.SelectedIndex)
{
switch (ComboBoxEraserSizeFloatingBar.SelectedIndex) {
case 0:
k = 0.5;
break;
@ -272,13 +279,12 @@ namespace Ink_Canvas {
k = 1.8;
break;
}
inkCanvas.EraserShape = new EllipseStylusShape(k * 90, k * 90);
}
else if (Settings.Canvas.EraserShapeType == 1)
{
else if (Settings.Canvas.EraserShapeType == 1) {
double k = 1;
switch (ComboBoxEraserSizeFloatingBar.SelectedIndex)
{
switch (ComboBoxEraserSizeFloatingBar.SelectedIndex) {
case 0:
k = 0.7;
break;
@ -292,22 +298,22 @@ namespace Ink_Canvas {
k = 1.6;
break;
}
inkCanvas.EraserShape = new RectangleStylusShape(k * 90 * 0.6, k * 90);
}
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint;
SaveSettingsToFile();
}
private void SwitchToCircleEraser(object sender, MouseButtonEventArgs e)
{
private void SwitchToCircleEraser(object sender, MouseButtonEventArgs e) {
if (!isLoaded) return;
Settings.Canvas.EraserShapeType = 0;
SaveSettingsToFile();
CheckEraserTypeTab();
double k = 1;
switch (ComboBoxEraserSizeFloatingBar.SelectedIndex)
{
switch (ComboBoxEraserSizeFloatingBar.SelectedIndex) {
case 0:
k = 0.5;
break;
@ -321,20 +327,19 @@ namespace Ink_Canvas {
k = 1.8;
break;
}
inkCanvas.EraserShape = new EllipseStylusShape(k * 90, k * 90);
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint;
}
private void SwitchToRectangleEraser(object sender, MouseButtonEventArgs e)
{
private void SwitchToRectangleEraser(object sender, MouseButtonEventArgs e) {
if (!isLoaded) return;
Settings.Canvas.EraserShapeType = 1;
SaveSettingsToFile();
CheckEraserTypeTab();
double k = 1;
switch (ComboBoxEraserSizeFloatingBar.SelectedIndex)
{
switch (ComboBoxEraserSizeFloatingBar.SelectedIndex) {
case 0:
k = 0.7;
break;
@ -348,6 +353,7 @@ namespace Ink_Canvas {
k = 1.6;
break;
}
inkCanvas.EraserShape = new RectangleStylusShape(k * 90 * 0.6, k * 90);
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint;
@ -364,8 +370,7 @@ namespace Ink_Canvas {
SaveSettingsToFile();
}
private void HighlighterWidthSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
private void HighlighterWidthSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) {
if (!isLoaded) return;
// if (sender == BoardInkWidthSlider) InkWidthSlider.Value = ((Slider)sender).Value;
// if (sender == InkWidthSlider) BoardInkWidthSlider.Value = ((Slider)sender).Value;
@ -375,16 +380,15 @@ namespace Ink_Canvas {
SaveSettingsToFile();
}
private void InkAlphaSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
private void InkAlphaSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) {
if (!isLoaded) return;
// if (sender == BoardInkWidthSlider) InkWidthSlider.Value = ((Slider)sender).Value;
// if (sender == InkWidthSlider) BoardInkWidthSlider.Value = ((Slider)sender).Value;
byte NowR = drawingAttributes.Color.R;
byte NowG = drawingAttributes.Color.G;
byte NowB = drawingAttributes.Color.B;
var NowR = drawingAttributes.Color.R;
var NowG = drawingAttributes.Color.G;
var NowB = drawingAttributes.Color.B;
// Trace.WriteLine(BitConverter.GetBytes(((Slider)sender).Value));
drawingAttributes.Color = Color.FromArgb((byte)(((Slider)sender).Value), NowR, NowG, NowB);
drawingAttributes.Color = Color.FromArgb((byte)((Slider)sender).Value, NowR, NowG, NowB);
// drawingAttributes.Width = ((Slider)sender).Value / 2;
// Settings.Canvas.InkAlpha = ((Slider)sender).Value;
// SaveSettingsToFile();
@ -392,7 +396,8 @@ namespace Ink_Canvas {
private void ComboBoxHyperbolaAsymptoteOption_SelectionChanged(object sender, SelectionChangedEventArgs e) {
if (!isLoaded) return;
Settings.Canvas.HyperbolaAsymptoteOption = (OptionalOperation)ComboBoxHyperbolaAsymptoteOption.SelectedIndex;
Settings.Canvas.HyperbolaAsymptoteOption =
(OptionalOperation)ComboBoxHyperbolaAsymptoteOption.SelectedIndex;
SaveSettingsToFile();
}
@ -401,11 +406,10 @@ namespace Ink_Canvas {
#region Automation
private void StartOrStoptimerCheckAutoFold() {
if (Settings.Automation.IsEnableAutoFold) {
if (Settings.Automation.IsEnableAutoFold)
timerCheckAutoFold.Start();
} else {
else
timerCheckAutoFold.Stop();
}
}
private void ToggleSwitchAutoFoldInEasiNote_Toggled(object sender, RoutedEventArgs e) {
@ -417,7 +421,8 @@ namespace Ink_Canvas {
private void ToggleSwitchAutoFoldInEasiNoteIgnoreDesktopAnno_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.Automation.IsAutoFoldInEasiNoteIgnoreDesktopAnno = ToggleSwitchAutoFoldInEasiNoteIgnoreDesktopAnno.IsOn;
Settings.Automation.IsAutoFoldInEasiNoteIgnoreDesktopAnno =
ToggleSwitchAutoFoldInEasiNoteIgnoreDesktopAnno.IsOn;
SaveSettingsToFile();
}
@ -435,8 +440,7 @@ namespace Ink_Canvas {
StartOrStoptimerCheckAutoFold();
}
private void ToggleSwitchAutoFoldInEasiNote5C_Toggled(object sender, RoutedEventArgs e)
{
private void ToggleSwitchAutoFoldInEasiNote5C_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.Automation.IsAutoFoldInEasiNote5C = ToggleSwitchAutoFoldInEasiNote5C.IsOn;
SaveSettingsToFile();
@ -457,8 +461,7 @@ namespace Ink_Canvas {
StartOrStoptimerCheckAutoFold();
}
private void ToggleSwitchAutoFoldInHiteLightBoard_Toggled(object sender, RoutedEventArgs e)
{
private void ToggleSwitchAutoFoldInHiteLightBoard_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.Automation.IsAutoFoldInHiteLightBoard = ToggleSwitchAutoFoldInHiteLightBoard.IsOn;
SaveSettingsToFile();
@ -505,37 +508,32 @@ namespace Ink_Canvas {
Settings.Automation.IsAutoKillPptService = ToggleSwitchAutoKillPptService.IsOn;
SaveSettingsToFile();
if (Settings.Automation.IsAutoKillEasiNote || Settings.Automation.IsAutoKillPptService) {
if (Settings.Automation.IsAutoKillEasiNote || Settings.Automation.IsAutoKillPptService)
timerKillProcess.Start();
} else {
else
timerKillProcess.Stop();
}
}
private void ToggleSwitchAutoKillEasiNote_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.Automation.IsAutoKillEasiNote = ToggleSwitchAutoKillEasiNote.IsOn;
SaveSettingsToFile();
if (Settings.Automation.IsAutoKillEasiNote || Settings.Automation.IsAutoKillPptService || Settings.Automation.IsAutoKillHiteAnnotation) {
if (Settings.Automation.IsAutoKillEasiNote || Settings.Automation.IsAutoKillPptService ||
Settings.Automation.IsAutoKillHiteAnnotation)
timerKillProcess.Start();
} else {
else
timerKillProcess.Stop();
}
}
private void ToggleSwitchAutoKillHiteAnnotation_Toggled(object sender, RoutedEventArgs e)
{
private void ToggleSwitchAutoKillHiteAnnotation_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.Automation.IsAutoKillHiteAnnotation = ToggleSwitchAutoKillHiteAnnotation.IsOn;
SaveSettingsToFile();
if (Settings.Automation.IsAutoKillEasiNote || Settings.Automation.IsAutoKillPptService || Settings.Automation.IsAutoKillHiteAnnotation)
{
if (Settings.Automation.IsAutoKillEasiNote || Settings.Automation.IsAutoKillPptService ||
Settings.Automation.IsAutoKillHiteAnnotation)
timerKillProcess.Start();
}
else
{
timerKillProcess.Stop();
}
}
private void ToggleSwitchSaveScreenshotsInDateFolders_Toggled(object sender, RoutedEventArgs e) {
@ -547,7 +545,8 @@ namespace Ink_Canvas {
private void ToggleSwitchAutoSaveStrokesAtScreenshot_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.Automation.IsAutoSaveStrokesAtScreenshot = ToggleSwitchAutoSaveStrokesAtScreenshot.IsOn;
ToggleSwitchAutoSaveStrokesAtClear.Header = ToggleSwitchAutoSaveStrokesAtScreenshot.IsOn ? "清屏时自动截图并保存墨迹" : "清屏时自动截图";
ToggleSwitchAutoSaveStrokesAtClear.Header =
ToggleSwitchAutoSaveStrokesAtScreenshot.IsOn ? "清屏时自动截图并保存墨迹" : "清屏时自动截图";
SaveSettingsToFile();
}
@ -563,15 +562,13 @@ namespace Ink_Canvas {
SaveSettingsToFile();
}
private void ToggleSwitchClearCanvasAndClearTimeMachine_Toggled(object sender, RoutedEventArgs e)
{
private void ToggleSwitchClearCanvasAndClearTimeMachine_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.Canvas.ClearCanvasAndClearTimeMachine = ToggleSwitchClearCanvasAndClearTimeMachine.IsOn;
SaveSettingsToFile();
}
private void ToggleSwitchFitToCurve_Toggled(object sender, RoutedEventArgs e)
{
private void ToggleSwitchFitToCurve_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
drawingAttributes.FitToCurve = ToggleSwitchFitToCurve.IsOn;
Settings.Canvas.FitToCurve = ToggleSwitchFitToCurve.IsOn;
@ -596,8 +593,7 @@ namespace Ink_Canvas {
SaveSettingsToFile();
}
private void ToggleSwitchNotifyAutoPlayPresentation_Toggled(object sender, RoutedEventArgs e)
{
private void ToggleSwitchNotifyAutoPlayPresentation_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.PowerPointSettings.IsNotifyAutoPlayPresentation = ToggleSwitchNotifyAutoPlayPresentation.IsOn;
SaveSettingsToFile();
@ -616,7 +612,7 @@ namespace Ink_Canvas {
}
private void AutoSavedStrokesLocationButton_Click(object sender, RoutedEventArgs e) {
System.Windows.Forms.FolderBrowserDialog folderBrowser = new System.Windows.Forms.FolderBrowserDialog();
var folderBrowser = new System.Windows.Forms.FolderBrowserDialog();
folderBrowser.ShowDialog();
if (folderBrowser.SelectedPath.Length > 0) AutoSavedStrokesLocation.Text = folderBrowser.SelectedPath;
}
@ -626,7 +622,8 @@ namespace Ink_Canvas {
}
private void SetAutoSavedStrokesLocationToDocumentFolderButton_Click(object sender, RoutedEventArgs e) {
AutoSavedStrokesLocation.Text = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\Ink Canvas";
AutoSavedStrokesLocation.Text =
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\Ink Canvas";
}
private void ToggleSwitchAutoDelSavedFiles_Toggled(object sender, RoutedEventArgs e) {
@ -635,15 +632,18 @@ namespace Ink_Canvas {
SaveSettingsToFile();
}
private void ComboBoxAutoDelSavedFilesDaysThreshold_SelectionChanged(object sender, SelectionChangedEventArgs e) {
private void
ComboBoxAutoDelSavedFilesDaysThreshold_SelectionChanged(object sender, SelectionChangedEventArgs e) {
if (!isLoaded) return;
Settings.Automation.AutoDelSavedFilesDaysThreshold = int.Parse(((ComboBoxItem)ComboBoxAutoDelSavedFilesDaysThreshold.SelectedItem).Content.ToString());
Settings.Automation.AutoDelSavedFilesDaysThreshold =
int.Parse(((ComboBoxItem)ComboBoxAutoDelSavedFilesDaysThreshold.SelectedItem).Content.ToString());
SaveSettingsToFile();
}
private void ToggleSwitchAutoSaveScreenShotInPowerPoint_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.PowerPointSettings.IsAutoSaveScreenShotInPowerPoint = ToggleSwitchAutoSaveScreenShotInPowerPoint.IsOn;
Settings.PowerPointSettings.IsAutoSaveScreenShotInPowerPoint =
ToggleSwitchAutoSaveScreenShotInPowerPoint.IsOn;
SaveSettingsToFile();
}
@ -653,7 +653,8 @@ namespace Ink_Canvas {
private void ToggleSwitchEnableFingerGestureSlideShowControl_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.PowerPointSettings.IsEnableFingerGestureSlideShowControl = ToggleSwitchEnableFingerGestureSlideShowControl.IsOn;
Settings.PowerPointSettings.IsEnableFingerGestureSlideShowControl =
ToggleSwitchEnableFingerGestureSlideShowControl.IsOn;
SaveSettingsToFile();
}
@ -665,11 +666,10 @@ namespace Ink_Canvas {
private void ToggleSwitchEnableTwoFingerZoom_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
if (sender == ToggleSwitchEnableTwoFingerZoom) {
if (sender == ToggleSwitchEnableTwoFingerZoom)
BoardToggleSwitchEnableTwoFingerZoom.IsOn = ToggleSwitchEnableTwoFingerZoom.IsOn;
} else {
else
ToggleSwitchEnableTwoFingerZoom.IsOn = BoardToggleSwitchEnableTwoFingerZoom.IsOn;
}
Settings.Gesture.IsEnableTwoFingerZoom = ToggleSwitchEnableTwoFingerZoom.IsOn;
CheckEnableTwoFingerGestureBtnColorPrompt();
SaveSettingsToFile();
@ -677,14 +677,12 @@ namespace Ink_Canvas {
private void ToggleSwitchEnableMultiTouchMode_Toggled(object sender, RoutedEventArgs e) {
//if (!isLoaded) return;
if (sender == ToggleSwitchEnableMultiTouchMode) {
if (sender == ToggleSwitchEnableMultiTouchMode)
BoardToggleSwitchEnableMultiTouchMode.IsOn = ToggleSwitchEnableMultiTouchMode.IsOn;
} else {
else
ToggleSwitchEnableMultiTouchMode.IsOn = BoardToggleSwitchEnableMultiTouchMode.IsOn;
}
if (ToggleSwitchEnableMultiTouchMode.IsOn) {
if (!isInMultiTouchMode)
{
if (!isInMultiTouchMode) {
inkCanvas.StylusDown += MainWindow_StylusDown;
inkCanvas.StylusMove += MainWindow_StylusMove;
inkCanvas.StylusUp += MainWindow_StylusUp;
@ -695,9 +693,9 @@ namespace Ink_Canvas {
inkCanvas.Children.Clear();
isInMultiTouchMode = true;
}
} else {
if (isInMultiTouchMode)
{
}
else {
if (isInMultiTouchMode) {
inkCanvas.StylusDown -= MainWindow_StylusDown;
inkCanvas.StylusMove -= MainWindow_StylusMove;
inkCanvas.StylusUp -= MainWindow_StylusUp;
@ -709,6 +707,7 @@ namespace Ink_Canvas {
isInMultiTouchMode = false;
}
}
Settings.Gesture.IsEnableMultiTouchMode = ToggleSwitchEnableMultiTouchMode.IsOn;
CheckEnableTwoFingerGestureBtnColorPrompt();
SaveSettingsToFile();
@ -716,11 +715,10 @@ namespace Ink_Canvas {
private void ToggleSwitchEnableTwoFingerTranslate_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
if (sender == ToggleSwitchEnableTwoFingerTranslate) {
if (sender == ToggleSwitchEnableTwoFingerTranslate)
BoardToggleSwitchEnableTwoFingerTranslate.IsOn = ToggleSwitchEnableTwoFingerTranslate.IsOn;
} else {
else
ToggleSwitchEnableTwoFingerTranslate.IsOn = BoardToggleSwitchEnableTwoFingerTranslate.IsOn;
}
Settings.Gesture.IsEnableTwoFingerTranslate = ToggleSwitchEnableTwoFingerTranslate.IsOn;
CheckEnableTwoFingerGestureBtnColorPrompt();
SaveSettingsToFile();
@ -729,11 +727,10 @@ namespace Ink_Canvas {
private void ToggleSwitchEnableTwoFingerRotation_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
if (sender == ToggleSwitchEnableTwoFingerRotation) {
if (sender == ToggleSwitchEnableTwoFingerRotation)
BoardToggleSwitchEnableTwoFingerRotation.IsOn = ToggleSwitchEnableTwoFingerRotation.IsOn;
} else {
else
ToggleSwitchEnableTwoFingerRotation.IsOn = BoardToggleSwitchEnableTwoFingerRotation.IsOn;
}
Settings.Gesture.IsEnableTwoFingerRotation = ToggleSwitchEnableTwoFingerRotation.IsOn;
Settings.Gesture.IsEnableTwoFingerRotationOnSelection = ToggleSwitchEnableTwoFingerRotationOnSelection.IsOn;
CheckEnableTwoFingerGestureBtnColorPrompt();
@ -742,7 +739,8 @@ namespace Ink_Canvas {
private void ToggleSwitchEnableTwoFingerGestureInPresentationMode_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.PowerPointSettings.IsEnableTwoFingerGestureInPresentationMode = ToggleSwitchEnableTwoFingerGestureInPresentationMode.IsOn;
Settings.PowerPointSettings.IsEnableTwoFingerGestureInPresentationMode =
ToggleSwitchEnableTwoFingerGestureInPresentationMode.IsOn;
SaveSettingsToFile();
}
@ -751,8 +749,8 @@ namespace Ink_Canvas {
#region Reset
public static void SetSettingsToRecommendation() {
bool AutoDelSavedFilesDays = Settings.Automation.AutoDelSavedFiles;
int AutoDelSavedFilesDaysThreshold = Settings.Automation.AutoDelSavedFilesDaysThreshold;
var AutoDelSavedFilesDays = Settings.Automation.AutoDelSavedFiles;
var AutoDelSavedFilesDaysThreshold = Settings.Automation.AutoDelSavedFilesDaysThreshold;
Settings = new Settings();
Settings.Advanced.IsSpecialScreen = true;
Settings.Advanced.IsQuadIR = false;
@ -761,7 +759,7 @@ namespace Ink_Canvas {
Settings.Advanced.FingerModeBoundsWidth = 20;
Settings.Advanced.EraserBindTouchMultiplier = true;
Settings.Advanced.IsLogEnabled = true;
Settings.Advanced.IsSecondConfimeWhenShutdownApp = false;
Settings.Advanced.IsSecondConfirmWhenShutdownApp = false;
Settings.Appearance.IsEnableDisPlayNibModeToggler = false;
Settings.Appearance.IsColorfulViewboxFloatingBar = false;
@ -857,7 +855,9 @@ namespace Ink_Canvas {
isLoaded = true;
ToggleSwitchRunAtStartup.IsOn = true;
} catch { }
}
catch { }
ShowNotification("设置已重置为默认推荐设置~");
}
@ -872,7 +872,8 @@ namespace Ink_Canvas {
SaveSettingsToFile();
LoadSettings();
isLoaded = true;
} catch { }
}
catch { }
}
#endregion
@ -885,36 +886,33 @@ namespace Ink_Canvas {
SaveSettingsToFile();
}
private void ToggleSwitchEnableInkToShapeNoFakePressureTriangle_Toggled(object sender, RoutedEventArgs e)
{
private void ToggleSwitchEnableInkToShapeNoFakePressureTriangle_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.InkToShape.IsInkToShapeNoFakePressureTriangle = ToggleSwitchEnableInkToShapeNoFakePressureTriangle.IsOn;
Settings.InkToShape.IsInkToShapeNoFakePressureTriangle =
ToggleSwitchEnableInkToShapeNoFakePressureTriangle.IsOn;
SaveSettingsToFile();
}
private void ToggleSwitchEnableInkToShapeNoFakePressureRectangle_Toggled(object sender, RoutedEventArgs e)
{
private void ToggleSwitchEnableInkToShapeNoFakePressureRectangle_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.InkToShape.IsInkToShapeNoFakePressureRectangle = ToggleSwitchEnableInkToShapeNoFakePressureRectangle.IsOn;
Settings.InkToShape.IsInkToShapeNoFakePressureRectangle =
ToggleSwitchEnableInkToShapeNoFakePressureRectangle.IsOn;
SaveSettingsToFile();
}
private void ToggleCheckboxEnableInkToShapeTriangle_CheckedChanged(object sender, RoutedEventArgs e)
{
private void ToggleCheckboxEnableInkToShapeTriangle_CheckedChanged(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.InkToShape.IsInkToShapeTriangle = (bool)ToggleCheckboxEnableInkToShapeTriangle.IsChecked;
SaveSettingsToFile();
}
private void ToggleCheckboxEnableInkToShapeRectangle_CheckedChanged(object sender, RoutedEventArgs e)
{
private void ToggleCheckboxEnableInkToShapeRectangle_CheckedChanged(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.InkToShape.IsInkToShapeRectangle = (bool)ToggleCheckboxEnableInkToShapeRectangle.IsChecked;
SaveSettingsToFile();
}
private void ToggleCheckboxEnableInkToShapeRounded_CheckedChanged(object sender, RoutedEventArgs e)
{
private void ToggleCheckboxEnableInkToShapeRounded_CheckedChanged(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.InkToShape.IsInkToShapeRounded = (bool)ToggleCheckboxEnableInkToShapeRounded.IsChecked;
SaveSettingsToFile();
@ -927,7 +925,8 @@ namespace Ink_Canvas {
private void ToggleSwitchIsSpecialScreen_OnToggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.Advanced.IsSpecialScreen = ToggleSwitchIsSpecialScreen.IsOn;
TouchMultiplierSlider.Visibility = ToggleSwitchIsSpecialScreen.IsOn ? Visibility.Visible : Visibility.Collapsed;
TouchMultiplierSlider.Visibility =
ToggleSwitchIsSpecialScreen.IsOn ? Visibility.Visible : Visibility.Collapsed;
SaveSettingsToFile();
}
@ -956,11 +955,10 @@ namespace Ink_Canvas {
if (!isLoaded) return;
Settings.Advanced.NibModeBoundsWidth = (int)e.NewValue;
if (Settings.Startup.IsEnableNibMode) {
if (Settings.Startup.IsEnableNibMode)
BoundsWidth = Settings.Advanced.NibModeBoundsWidth;
} else {
else
BoundsWidth = Settings.Advanced.FingerModeBoundsWidth;
}
SaveSettingsToFile();
}
@ -969,11 +967,10 @@ namespace Ink_Canvas {
if (!isLoaded) return;
Settings.Advanced.FingerModeBoundsWidth = (int)e.NewValue;
if (Settings.Startup.IsEnableNibMode) {
if (Settings.Startup.IsEnableNibMode)
BoundsWidth = Settings.Advanced.NibModeBoundsWidth;
} else {
else
BoundsWidth = Settings.Advanced.FingerModeBoundsWidth;
}
SaveSettingsToFile();
}
@ -992,25 +989,25 @@ namespace Ink_Canvas {
private void ToggleSwitchIsSecondConfimeWhenShutdownApp_Toggled(object sender, RoutedEventArgs e) {
if (!isLoaded) return;
Settings.Advanced.IsSecondConfimeWhenShutdownApp = ToggleSwitchIsSecondConfimeWhenShutdownApp.IsOn;
Settings.Advanced.IsSecondConfirmWhenShutdownApp = ToggleSwitchIsSecondConfimeWhenShutdownApp.IsOn;
SaveSettingsToFile();
}
#endregion
public static void SaveSettingsToFile() {
string text = JsonConvert.SerializeObject(Settings, Formatting.Indented);
var text = JsonConvert.SerializeObject(Settings, Formatting.Indented);
try {
File.WriteAllText(App.RootPath + settingsFileName, text);
} catch { }
}
catch { }
}
private void SCManipulationBoundaryFeedback(object sender, ManipulationBoundaryFeedbackEventArgs e) {
e.Handled = true;
}
private void HyperlinkSourceToICCRepository_Click(object sender, RoutedEventArgs e)
{
private void HyperlinkSourceToICCRepository_Click(object sender, RoutedEventArgs e) {
Process.Start("https://gitea.bliemhax.com/kriastans/InkCanvasForClass");
HideSubPanels();
}

View File

@ -593,7 +593,7 @@ namespace Ink_Canvas
ToggleSwitchIsLogEnabled.IsOn = false;
}
if (Settings.Advanced.IsSecondConfimeWhenShutdownApp)
if (Settings.Advanced.IsSecondConfirmWhenShutdownApp)
{
ToggleSwitchIsSecondConfimeWhenShutdownApp.IsOn = true;
}

File diff suppressed because it is too large Load Diff

View File

@ -9,50 +9,36 @@ using System.Windows.Input;
using System.Windows.Media;
using Point = System.Windows.Point;
namespace Ink_Canvas
{
public partial class MainWindow : Window
{
StrokeCollection newStrokes = new StrokeCollection();
List<Circle> circles = new List<Circle>();
namespace Ink_Canvas {
public partial class MainWindow : Window {
private StrokeCollection newStrokes = new StrokeCollection();
private List<Circle> circles = new List<Circle>();
private void inkCanvas_StrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e)
{
if (Settings.Canvas.FitToCurve == true)
{
drawingAttributes.FitToCurve = false;
}
private void inkCanvas_StrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e) {
if (Settings.Canvas.FitToCurve == true) drawingAttributes.FitToCurve = false;
try
{
try {
inkCanvas.Opacity = 1;
if (Settings.InkToShape.IsInkToShapeEnabled && !Environment.Is64BitProcess)
{
void InkToShapeProcess()
{
try
{
if (Settings.InkToShape.IsInkToShapeEnabled && !Environment.Is64BitProcess) {
void InkToShapeProcess() {
try {
newStrokes.Add(e.Stroke);
if (newStrokes.Count > 4) newStrokes.RemoveAt(0);
for (int i = 0; i < newStrokes.Count; i++)
{
if (!inkCanvas.Strokes.Contains(newStrokes[i])) newStrokes.RemoveAt(i--);
}
for (var i = 0; i < newStrokes.Count; i++)
if (!inkCanvas.Strokes.Contains(newStrokes[i]))
newStrokes.RemoveAt(i--);
for (int i = 0; i < circles.Count; i++)
{
if (!inkCanvas.Strokes.Contains(circles[i].Stroke)) circles.RemoveAt(i);
}
for (var i = 0; i < circles.Count; i++)
if (!inkCanvas.Strokes.Contains(circles[i].Stroke))
circles.RemoveAt(i);
var strokeReco = new StrokeCollection();
var result = InkRecognizeHelper.RecognizeShape(newStrokes);
for (int i = newStrokes.Count - 1; i >= 0; i--)
{
for (var i = newStrokes.Count - 1; i >= 0; i--) {
strokeReco.Add(newStrokes[i]);
var newResult = InkRecognizeHelper.RecognizeShape(strokeReco);
if (newResult.InkDrawingNode.GetShapeName() == "Circle" ||
newResult.InkDrawingNode.GetShapeName() == "Ellipse")
{
newResult.InkDrawingNode.GetShapeName() == "Ellipse") {
result = newResult;
break;
}
@ -61,59 +47,50 @@ namespace Ink_Canvas
}
if (result.InkDrawingNode.GetShapeName() == "Circle" &&
Settings.InkToShape.IsInkToShapeRounded == true)
{
Settings.InkToShape.IsInkToShapeRounded == true) {
var shape = result.InkDrawingNode.GetShape();
if (shape.Width > 75)
{
foreach (Circle circle in circles)
{
if (shape.Width > 75) {
foreach (var circle in circles)
//判断是否画同心圆
if (Math.Abs(result.Centroid.X - circle.Centroid.X) / shape.Width < 0.12 &&
Math.Abs(result.Centroid.Y - circle.Centroid.Y) / shape.Width < 0.12)
{
Math.Abs(result.Centroid.Y - circle.Centroid.Y) / shape.Width < 0.12) {
result.Centroid = circle.Centroid;
break;
}
else
{
double d = (result.Centroid.X - circle.Centroid.X) *
(result.Centroid.X - circle.Centroid.X) +
(result.Centroid.Y - circle.Centroid.Y) *
(result.Centroid.Y - circle.Centroid.Y);
else {
var d = (result.Centroid.X - circle.Centroid.X) *
(result.Centroid.X - circle.Centroid.X) +
(result.Centroid.Y - circle.Centroid.Y) *
(result.Centroid.Y - circle.Centroid.Y);
d = Math.Sqrt(d);
//判断是否画外切圆
double x = shape.Width / 2.0 + circle.R - d;
if (Math.Abs(x) / shape.Width < 0.1)
{
double sinTheta = (result.Centroid.Y - circle.Centroid.Y) / d;
double cosTheta = (result.Centroid.X - circle.Centroid.X) / d;
double newX = result.Centroid.X + x * cosTheta;
double newY = result.Centroid.Y + x * sinTheta;
var x = shape.Width / 2.0 + circle.R - d;
if (Math.Abs(x) / shape.Width < 0.1) {
var sinTheta = (result.Centroid.Y - circle.Centroid.Y) / d;
var cosTheta = (result.Centroid.X - circle.Centroid.X) / d;
var newX = result.Centroid.X + x * cosTheta;
var newY = result.Centroid.Y + x * sinTheta;
result.Centroid = new Point(newX, newY);
}
//判断是否画外切圆
x = Math.Abs(circle.R - shape.Width / 2.0) - d;
if (Math.Abs(x) / shape.Width < 0.1)
{
double sinTheta = (result.Centroid.Y - circle.Centroid.Y) / d;
double cosTheta = (result.Centroid.X - circle.Centroid.X) / d;
double newX = result.Centroid.X + x * cosTheta;
double newY = result.Centroid.Y + x * sinTheta;
if (Math.Abs(x) / shape.Width < 0.1) {
var sinTheta = (result.Centroid.Y - circle.Centroid.Y) / d;
var cosTheta = (result.Centroid.X - circle.Centroid.X) / d;
var newX = result.Centroid.X + x * cosTheta;
var newY = result.Centroid.Y + x * sinTheta;
result.Centroid = new Point(newX, newY);
}
}
}
Point iniP = new Point(result.Centroid.X - shape.Width / 2,
var iniP = new Point(result.Centroid.X - shape.Width / 2,
result.Centroid.Y - shape.Height / 2);
Point endP = new Point(result.Centroid.X + shape.Width / 2,
var endP = new Point(result.Centroid.X + shape.Width / 2,
result.Centroid.Y + shape.Height / 2);
var pointList = GenerateEllipseGeometry(iniP, endP);
var point = new StylusPointCollection(pointList);
var stroke = new Stroke(point)
{
var stroke = new Stroke(point) {
DrawingAttributes = inkCanvas.DefaultDrawingAttributes.Clone()
};
circles.Add(new Circle(result.Centroid, shape.Width / 2.0, stroke));
@ -126,38 +103,33 @@ namespace Ink_Canvas
}
}
else if (result.InkDrawingNode.GetShapeName().Contains("Ellipse") &&
Settings.InkToShape.IsInkToShapeRounded == true)
{
Settings.InkToShape.IsInkToShapeRounded == true) {
var shape = result.InkDrawingNode.GetShape();
//var shape1 = result.InkDrawingNode.GetShape();
//shape1.Fill = Brushes.Gray;
//Canvas.Children.Add(shape1);
var p = result.InkDrawingNode.HotPoints;
double a = GetDistance(p[0], p[2]) / 2; //长半轴
double b = GetDistance(p[1], p[3]) / 2; //短半轴
if (a < b)
{
double t = a;
var a = GetDistance(p[0], p[2]) / 2; //长半轴
var b = GetDistance(p[1], p[3]) / 2; //短半轴
if (a < b) {
var t = a;
a = b;
b = t;
}
result.Centroid = new Point((p[0].X + p[2].X) / 2, (p[0].Y + p[2].Y) / 2);
bool needRotation = true;
var needRotation = true;
if (shape.Width > 75 || shape.Height > 75 && p.Count == 4)
{
Point iniP = new Point(result.Centroid.X - shape.Width / 2,
if (shape.Width > 75 || (shape.Height > 75 && p.Count == 4)) {
var iniP = new Point(result.Centroid.X - shape.Width / 2,
result.Centroid.Y - shape.Height / 2);
Point endP = new Point(result.Centroid.X + shape.Width / 2,
var endP = new Point(result.Centroid.X + shape.Width / 2,
result.Centroid.Y + shape.Height / 2);
foreach (Circle circle in circles)
{
foreach (var circle in circles)
//判断是否画同心椭圆
if (Math.Abs(result.Centroid.X - circle.Centroid.X) / a < 0.2 &&
Math.Abs(result.Centroid.Y - circle.Centroid.Y) / a < 0.2)
{
Math.Abs(result.Centroid.Y - circle.Centroid.Y) / a < 0.2) {
result.Centroid = circle.Centroid;
iniP = new Point(result.Centroid.X - shape.Width / 2,
result.Centroid.Y - shape.Height / 2);
@ -165,17 +137,14 @@ namespace Ink_Canvas
result.Centroid.Y + shape.Height / 2);
//再判断是否与圆相切
if (Math.Abs(a - circle.R) / a < 0.2)
{
if (shape.Width >= shape.Height)
{
if (Math.Abs(a - circle.R) / a < 0.2) {
if (shape.Width >= shape.Height) {
iniP.X = result.Centroid.X - circle.R;
endP.X = result.Centroid.X + circle.R;
iniP.Y = result.Centroid.Y - b;
endP.Y = result.Centroid.Y + b;
}
else
{
else {
iniP.Y = result.Centroid.Y - circle.R;
endP.Y = result.Centroid.Y + circle.R;
iniP.X = result.Centroid.X - a;
@ -185,21 +154,19 @@ namespace Ink_Canvas
break;
}
else if (Math.Abs(result.Centroid.X - circle.Centroid.X) / a < 0.2)
{
double sinTheta = Math.Abs(circle.Centroid.Y - result.Centroid.Y) /
circle.R;
double cosTheta = Math.Sqrt(1 - sinTheta * sinTheta);
double newA = circle.R * cosTheta;
else if (Math.Abs(result.Centroid.X - circle.Centroid.X) / a < 0.2) {
var sinTheta = Math.Abs(circle.Centroid.Y - result.Centroid.Y) /
circle.R;
var cosTheta = Math.Sqrt(1 - sinTheta * sinTheta);
var newA = circle.R * cosTheta;
if (circle.R * sinTheta / circle.R < 0.9 && a / b > 2 &&
Math.Abs(newA - a) / newA < 0.3)
{
Math.Abs(newA - a) / newA < 0.3) {
iniP.X = circle.Centroid.X - newA;
endP.X = circle.Centroid.X + newA;
iniP.Y = result.Centroid.Y - newA / 5;
endP.Y = result.Centroid.Y + newA / 5;
double topB = endP.Y - iniP.Y;
var topB = endP.Y - iniP.Y;
SetNewBackupOfStroke();
_currentCommitType = CommitReason.ShapeRecognition;
@ -208,14 +175,12 @@ namespace Ink_Canvas
var _pointList = GenerateEllipseGeometry(iniP, endP, false, true);
var _point = new StylusPointCollection(_pointList);
var _stroke = new Stroke(_point)
{
var _stroke = new Stroke(_point) {
DrawingAttributes = inkCanvas.DefaultDrawingAttributes.Clone()
};
var _dashedLineStroke =
GenerateDashedLineEllipseStrokeCollection(iniP, endP, true, false);
StrokeCollection strokes = new StrokeCollection()
{
var strokes = new StrokeCollection() {
_stroke,
_dashedLineStroke
};
@ -224,15 +189,13 @@ namespace Ink_Canvas
return;
}
}
else if (Math.Abs(result.Centroid.Y - circle.Centroid.Y) / a < 0.2)
{
double cosTheta = Math.Abs(circle.Centroid.X - result.Centroid.X) /
circle.R;
double sinTheta = Math.Sqrt(1 - cosTheta * cosTheta);
double newA = circle.R * sinTheta;
else if (Math.Abs(result.Centroid.Y - circle.Centroid.Y) / a < 0.2) {
var cosTheta = Math.Abs(circle.Centroid.X - result.Centroid.X) /
circle.R;
var sinTheta = Math.Sqrt(1 - cosTheta * cosTheta);
var newA = circle.R * sinTheta;
if (circle.R * sinTheta / circle.R < 0.9 && a / b > 2 &&
Math.Abs(newA - a) / newA < 0.3)
{
Math.Abs(newA - a) / newA < 0.3) {
iniP.X = result.Centroid.X - newA / 5;
endP.X = result.Centroid.X + newA / 5;
iniP.Y = circle.Centroid.Y - newA;
@ -240,7 +203,6 @@ namespace Ink_Canvas
needRotation = false;
}
}
}
//纠正垂直与水平关系
var newPoints = FixPointsDirection(p[0], p[2]);
@ -252,17 +214,15 @@ namespace Ink_Canvas
var pointList = GenerateEllipseGeometry(iniP, endP);
var point = new StylusPointCollection(pointList);
var stroke = new Stroke(point)
{
var stroke = new Stroke(point) {
DrawingAttributes = inkCanvas.DefaultDrawingAttributes.Clone()
};
if (needRotation)
{
Matrix m = new Matrix();
FrameworkElement fe = e.Source as FrameworkElement;
double tanTheta = (p[2].Y - p[0].Y) / (p[2].X - p[0].X);
double theta = Math.Atan(tanTheta);
if (needRotation) {
var m = new Matrix();
var fe = e.Source as FrameworkElement;
var tanTheta = (p[2].Y - p[0].Y) / (p[2].X - p[0].X);
var theta = Math.Atan(tanTheta);
m.RotateAt(theta * 180.0 / Math.PI, result.Centroid.X, result.Centroid.Y);
stroke.Transform(m, false);
}
@ -277,16 +237,14 @@ namespace Ink_Canvas
}
}
else if (result.InkDrawingNode.GetShapeName().Contains("Triangle") &&
Settings.InkToShape.IsInkToShapeTriangle == true)
{
Settings.InkToShape.IsInkToShapeTriangle == true) {
var shape = result.InkDrawingNode.GetShape();
var p = result.InkDrawingNode.HotPoints;
if ((Math.Max(Math.Max(p[0].X, p[1].X), p[2].X) -
Math.Min(Math.Min(p[0].X, p[1].X), p[2].X) >= 100 ||
Math.Max(Math.Max(p[0].Y, p[1].Y), p[2].Y) -
Math.Min(Math.Min(p[0].Y, p[1].Y), p[2].Y) >= 100) &&
result.InkDrawingNode.HotPoints.Count == 3)
{
result.InkDrawingNode.HotPoints.Count == 3) {
//纠正垂直与水平关系
var newPoints = FixPointsDirection(p[0], p[1]);
p[0] = newPoints[0];
@ -301,8 +259,7 @@ namespace Ink_Canvas
var pointList = p.ToList();
//pointList.Add(p[0]);
var point = new StylusPointCollection(pointList);
var stroke = new Stroke(GenerateFakePressureTriangle(point))
{
var stroke = new Stroke(GenerateFakePressureTriangle(point)) {
DrawingAttributes = inkCanvas.DefaultDrawingAttributes.Clone()
};
SetNewBackupOfStroke();
@ -319,16 +276,14 @@ namespace Ink_Canvas
result.InkDrawingNode.GetShapeName().Contains("Parallelogram") ||
result.InkDrawingNode.GetShapeName().Contains("Square") ||
result.InkDrawingNode.GetShapeName().Contains("Trapezoid")) &&
Settings.InkToShape.IsInkToShapeRectangle == true)
{
Settings.InkToShape.IsInkToShapeRectangle == true) {
var shape = result.InkDrawingNode.GetShape();
var p = result.InkDrawingNode.HotPoints;
if ((Math.Max(Math.Max(Math.Max(p[0].X, p[1].X), p[2].X), p[3].X) -
Math.Min(Math.Min(Math.Min(p[0].X, p[1].X), p[2].X), p[3].X) >= 100 ||
Math.Max(Math.Max(Math.Max(p[0].Y, p[1].Y), p[2].Y), p[3].Y) -
Math.Min(Math.Min(Math.Min(p[0].Y, p[1].Y), p[2].Y), p[3].Y) >= 100) &&
result.InkDrawingNode.HotPoints.Count == 4)
{
result.InkDrawingNode.HotPoints.Count == 4) {
//纠正垂直与水平关系
var newPoints = FixPointsDirection(p[0], p[1]);
p[0] = newPoints[0];
@ -346,8 +301,7 @@ namespace Ink_Canvas
var pointList = p.ToList();
pointList.Add(p[0]);
var point = new StylusPointCollection(pointList);
var stroke = new Stroke(GenerateFakePressureRectangle(point))
{
var stroke = new Stroke(GenerateFakePressureRectangle(point)) {
DrawingAttributes = inkCanvas.DefaultDrawingAttributes.Clone()
};
SetNewBackupOfStroke();
@ -360,32 +314,24 @@ namespace Ink_Canvas
}
}
}
catch
{
}
catch { }
}
InkToShapeProcess();
}
foreach (StylusPoint stylusPoint in e.Stroke.StylusPoints)
{
foreach (var stylusPoint in e.Stroke.StylusPoints)
//LogHelper.WriteLogToFile(stylusPoint.PressureFactor.ToString(), LogHelper.LogType.Info);
// 检查是否是压感笔书写
//if (stylusPoint.PressureFactor != 0.5 && stylusPoint.PressureFactor != 0)
if ((stylusPoint.PressureFactor > 0.501 || stylusPoint.PressureFactor < 0.5) &&
stylusPoint.PressureFactor != 0)
{
return;
}
}
try
{
if (e.Stroke.StylusPoints.Count > 3)
{
Random random = new Random();
double _speed = GetPointSpeed(
try {
if (e.Stroke.StylusPoints.Count > 3) {
var random = new Random();
var _speed = GetPointSpeed(
e.Stroke.StylusPoints[random.Next(0, e.Stroke.StylusPoints.Count - 1)].ToPoint(),
e.Stroke.StylusPoints[random.Next(0, e.Stroke.StylusPoints.Count - 1)].ToPoint(),
e.Stroke.StylusPoints[random.Next(0, e.Stroke.StylusPoints.Count - 1)].ToPoint());
@ -393,40 +339,28 @@ namespace Ink_Canvas
RandWindow.randSeed = (int)(_speed * 100000 * 1000);
}
}
catch
{
}
catch { }
switch (Settings.Canvas.InkStyle)
{
switch (Settings.Canvas.InkStyle) {
case 1:
if (penType == 0)
{
try
{
StylusPointCollection stylusPoints = new StylusPointCollection();
int n = e.Stroke.StylusPoints.Count - 1;
string s = "";
try {
var stylusPoints = new StylusPointCollection();
var n = e.Stroke.StylusPoints.Count - 1;
var s = "";
for (int i = 0; i <= n; i++)
{
double speed = GetPointSpeed(e.Stroke.StylusPoints[Math.Max(i - 1, 0)].ToPoint(),
for (var i = 0; i <= n; i++) {
var speed = GetPointSpeed(e.Stroke.StylusPoints[Math.Max(i - 1, 0)].ToPoint(),
e.Stroke.StylusPoints[i].ToPoint(),
e.Stroke.StylusPoints[Math.Min(i + 1, n)].ToPoint());
s += speed.ToString() + "\t";
StylusPoint point = new StylusPoint();
var point = new StylusPoint();
if (speed >= 0.25)
{
point.PressureFactor = (float)(0.5 - 0.3 * (Math.Min(speed, 1.5) - 0.3) / 1.2);
}
else if (speed >= 0.05)
{
point.PressureFactor = (float)0.5;
}
else
{
point.PressureFactor = (float)(0.5 + 0.4 * (0.05 - speed) / 0.05);
}
point.X = e.Stroke.StylusPoints[i].X;
point.Y = e.Stroke.StylusPoints[i].Y;
@ -435,27 +369,20 @@ namespace Ink_Canvas
e.Stroke.StylusPoints = stylusPoints;
}
catch
{
}
}
catch { }
break;
case 0:
if (penType == 0)
{
try
{
StylusPointCollection stylusPoints = new StylusPointCollection();
int n = e.Stroke.StylusPoints.Count - 1;
double pressure = 0.1;
int x = 10;
try {
var stylusPoints = new StylusPointCollection();
var n = e.Stroke.StylusPoints.Count - 1;
var pressure = 0.1;
var x = 10;
if (n == 1) return;
if (n >= x)
{
for (int i = 0; i < n - x; i++)
{
StylusPoint point = new StylusPoint();
if (n >= x) {
for (var i = 0; i < n - x; i++) {
var point = new StylusPoint();
point.PressureFactor = (float)0.5;
point.X = e.Stroke.StylusPoints[i].X;
@ -463,9 +390,8 @@ namespace Ink_Canvas
stylusPoints.Add(point);
}
for (int i = n - x; i <= n; i++)
{
StylusPoint point = new StylusPoint();
for (var i = n - x; i <= n; i++) {
var point = new StylusPoint();
point.PressureFactor = (float)((0.5 - pressure) * (n - i) / x + pressure);
point.X = e.Stroke.StylusPoints[i].X;
@ -473,11 +399,9 @@ namespace Ink_Canvas
stylusPoints.Add(point);
}
}
else
{
for (int i = 0; i <= n; i++)
{
StylusPoint point = new StylusPoint();
else {
for (var i = 0; i <= n; i++) {
var point = new StylusPoint();
point.PressureFactor = (float)(0.4 * (n - i) / n + pressure);
point.X = e.Stroke.StylusPoints[i].X;
@ -488,44 +412,30 @@ namespace Ink_Canvas
e.Stroke.StylusPoints = stylusPoints;
}
catch
{
}
}
catch { }
break;
}
}
catch
{
}
catch { }
if (Settings.Canvas.FitToCurve == true)
{
drawingAttributes.FitToCurve = true;
}
if (Settings.Canvas.FitToCurve == true) drawingAttributes.FitToCurve = true;
}
private void SetNewBackupOfStroke()
{
private void SetNewBackupOfStroke() {
lastTouchDownStrokeCollection = inkCanvas.Strokes.Clone();
int whiteboardIndex = CurrentWhiteboardIndex;
if (currentMode == 0)
{
whiteboardIndex = 0;
}
var whiteboardIndex = CurrentWhiteboardIndex;
if (currentMode == 0) whiteboardIndex = 0;
strokeCollections[whiteboardIndex] = lastTouchDownStrokeCollection;
}
public double GetDistance(Point point1, Point point2)
{
public double GetDistance(Point point1, Point point2) {
return Math.Sqrt((point1.X - point2.X) * (point1.X - point2.X) +
(point1.Y - point2.Y) * (point1.Y - point2.Y));
}
public double GetPointSpeed(Point point1, Point point2, Point point3)
{
public double GetPointSpeed(Point point1, Point point2, Point point3) {
return (Math.Sqrt((point1.X - point2.X) * (point1.X - point2.X) +
(point1.Y - point2.Y) * (point1.Y - point2.Y))
+ Math.Sqrt((point3.X - point2.X) * (point3.X - point2.X) +
@ -533,34 +443,27 @@ namespace Ink_Canvas
/ 20;
}
public Point[] FixPointsDirection(Point p1, Point p2)
{
if (Math.Abs(p1.X - p2.X) / Math.Abs(p1.Y - p2.Y) > 8)
{
public Point[] FixPointsDirection(Point p1, Point p2) {
if (Math.Abs(p1.X - p2.X) / Math.Abs(p1.Y - p2.Y) > 8) {
//水平
double x = Math.Abs(p1.Y - p2.Y) / 2;
if (p1.Y > p2.Y)
{
var x = Math.Abs(p1.Y - p2.Y) / 2;
if (p1.Y > p2.Y) {
p1.Y -= x;
p2.Y += x;
}
else
{
else {
p1.Y += x;
p2.Y -= x;
}
}
else if (Math.Abs(p1.Y - p2.Y) / Math.Abs(p1.X - p2.X) > 8)
{
else if (Math.Abs(p1.Y - p2.Y) / Math.Abs(p1.X - p2.X) > 8) {
//垂直
double x = Math.Abs(p1.X - p2.X) / 2;
if (p1.X > p2.X)
{
var x = Math.Abs(p1.X - p2.X) / 2;
if (p1.X > p2.X) {
p1.X -= x;
p2.X += x;
}
else
{
else {
p1.X += x;
p2.X -= x;
}
@ -569,10 +472,8 @@ namespace Ink_Canvas
return new Point[2] { p1, p2 };
}
public StylusPointCollection GenerateFakePressureTriangle(StylusPointCollection points)
{
if (Settings.InkToShape.IsInkToShapeNoFakePressureTriangle == true || penType == 1)
{
public StylusPointCollection GenerateFakePressureTriangle(StylusPointCollection points) {
if (Settings.InkToShape.IsInkToShapeNoFakePressureTriangle == true || penType == 1) {
var newPoint = new StylusPointCollection();
newPoint.Add(new StylusPoint(points[0].X, points[0].Y));
var cPoint = GetCenterPoint(points[0], points[1]);
@ -588,8 +489,7 @@ namespace Ink_Canvas
newPoint.Add(new StylusPoint(points[0].X, points[0].Y));
return newPoint;
}
else
{
else {
var newPoint = new StylusPointCollection();
newPoint.Add(new StylusPoint(points[0].X, points[0].Y, (float)0.4));
var cPoint = GetCenterPoint(points[0], points[1]);
@ -607,14 +507,11 @@ namespace Ink_Canvas
}
}
public StylusPointCollection GenerateFakePressureRectangle(StylusPointCollection points)
{
if (Settings.InkToShape.IsInkToShapeNoFakePressureRectangle == true || penType == 1)
{
public StylusPointCollection GenerateFakePressureRectangle(StylusPointCollection points) {
if (Settings.InkToShape.IsInkToShapeNoFakePressureRectangle == true || penType == 1) {
return points;
}
else
{
else {
var newPoint = new StylusPointCollection();
newPoint.Add(new StylusPoint(points[0].X, points[0].Y, (float)0.4));
var cPoint = GetCenterPoint(points[0], points[1]);
@ -636,13 +533,11 @@ namespace Ink_Canvas
}
}
public Point GetCenterPoint(Point point1, Point point2)
{
public Point GetCenterPoint(Point point1, Point point2) {
return new Point((point1.X + point2.X) / 2, (point1.Y + point2.Y) / 2);
}
public StylusPoint GetCenterPoint(StylusPoint point1, StylusPoint point2)
{
public StylusPoint GetCenterPoint(StylusPoint point1, StylusPoint point2) {
return new StylusPoint((point1.X + point2.X) / 2, (point1.Y + point2.Y) / 2);
}
}

View File

@ -25,74 +25,62 @@ namespace Ink_Canvas {
_currentCommitType = CommitReason.CodeInput;
if (item.CommitType == TimeMachineHistoryType.UserInput) {
if (!item.StrokeHasBeenCleared) {
foreach (var strokes in item.CurrentStroke) {
foreach (var strokes in item.CurrentStroke)
if (!inkCanvas.Strokes.Contains(strokes))
inkCanvas.Strokes.Add(strokes);
}
}
else {
foreach (var strokes in item.CurrentStroke) {
foreach (var strokes in item.CurrentStroke)
if (inkCanvas.Strokes.Contains(strokes))
inkCanvas.Strokes.Remove(strokes);
}
}
}
else if (item.CommitType == TimeMachineHistoryType.ShapeRecognition) {
if (item.StrokeHasBeenCleared) {
foreach (var strokes in item.CurrentStroke) {
foreach (var strokes in item.CurrentStroke)
if (inkCanvas.Strokes.Contains(strokes))
inkCanvas.Strokes.Remove(strokes);
}
foreach (var strokes in item.ReplacedStroke) {
foreach (var strokes in item.ReplacedStroke)
if (!inkCanvas.Strokes.Contains(strokes))
inkCanvas.Strokes.Add(strokes);
}
}
else {
foreach (var strokes in item.CurrentStroke) {
foreach (var strokes in item.CurrentStroke)
if (!inkCanvas.Strokes.Contains(strokes))
inkCanvas.Strokes.Add(strokes);
}
foreach (var strokes in item.ReplacedStroke) {
foreach (var strokes in item.ReplacedStroke)
if (inkCanvas.Strokes.Contains(strokes))
inkCanvas.Strokes.Remove(strokes);
}
}
}
else if (item.CommitType == TimeMachineHistoryType.Manipulation) {
item.ManipulationHistory.Invert();
foreach (var strokes in item.CurrentStroke) {
strokes.Transform(item.ManipulationHistory, false);
}
foreach (var strokes in item.CurrentStroke) strokes.Transform(item.ManipulationHistory, false);
}
else if (item.CommitType == TimeMachineHistoryType.Clear) {
if (!item.StrokeHasBeenCleared) {
if (item.CurrentStroke != null) {
foreach (var currentStroke in item.CurrentStroke) {
if (!inkCanvas.Strokes.Contains(currentStroke)) inkCanvas.Strokes.Add(currentStroke);
}
}
if (item.CurrentStroke != null)
foreach (var currentStroke in item.CurrentStroke)
if (!inkCanvas.Strokes.Contains(currentStroke))
inkCanvas.Strokes.Add(currentStroke);
if (item.ReplacedStroke != null) {
foreach (var replacedStroke in item.ReplacedStroke) {
if (inkCanvas.Strokes.Contains(replacedStroke)) inkCanvas.Strokes.Remove(replacedStroke);
}
}
if (item.ReplacedStroke != null)
foreach (var replacedStroke in item.ReplacedStroke)
if (inkCanvas.Strokes.Contains(replacedStroke))
inkCanvas.Strokes.Remove(replacedStroke);
}
else {
if (item.ReplacedStroke != null) {
foreach (var replacedStroke in item.ReplacedStroke) {
if (!inkCanvas.Strokes.Contains(replacedStroke)) inkCanvas.Strokes.Add(replacedStroke);
}
}
if (item.ReplacedStroke != null)
foreach (var replacedStroke in item.ReplacedStroke)
if (!inkCanvas.Strokes.Contains(replacedStroke))
inkCanvas.Strokes.Add(replacedStroke);
if (item.CurrentStroke != null) {
foreach (var currentStroke in item.CurrentStroke) {
if (inkCanvas.Strokes.Contains(currentStroke)) inkCanvas.Strokes.Remove(currentStroke);
}
}
if (item.CurrentStroke != null)
foreach (var currentStroke in item.CurrentStroke)
if (inkCanvas.Strokes.Contains(currentStroke))
inkCanvas.Strokes.Remove(currentStroke);
}
}
@ -118,7 +106,7 @@ namespace Ink_Canvas {
}
if (_currentCommitType == CommitReason.CodeInput || _currentCommitType == CommitReason.ShapeDrawing) return;
if ((e.Added.Count != 0 || e.Removed.Count != 0) && IsEraseByPoint) {
if (AddedStroke == null) AddedStroke = new StrokeCollection();
if (ReplacedStroke == null) ReplacedStroke = new StrokeCollection();

View File

@ -7,34 +7,25 @@ using System.Timers;
using System.Windows;
using MessageBox = System.Windows.MessageBox;
namespace Ink_Canvas
{
public class TimeViewModel : INotifyPropertyChanged
{
namespace Ink_Canvas {
public class TimeViewModel : INotifyPropertyChanged {
private string _nowTime;
private string _nowDate;
public string nowTime
{
get { return _nowTime; }
set
{
if (_nowTime != value)
{
public string nowTime {
get => _nowTime;
set {
if (_nowTime != value) {
_nowTime = value;
OnPropertyChanged();
}
}
}
public string nowDate
{
get { return _nowDate; }
set
{
if (_nowDate != value)
{
public string nowDate {
get => _nowDate;
set {
if (_nowDate != value) {
_nowDate = value;
OnPropertyChanged();
}
@ -43,28 +34,25 @@ namespace Ink_Canvas
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
public partial class MainWindow : Window
{
Timer timerCheckPPT = new Timer();
Timer timerKillProcess = new Timer();
Timer timerCheckAutoFold = new Timer();
string AvailableLatestVersion = null;
Timer timerCheckAutoUpdateWithSilence = new Timer();
bool isHidingSubPanelsWhenInking = false; // 避免书写时触发二次关闭二级菜单导致动画不连续
public partial class MainWindow : Window {
private Timer timerCheckPPT = new Timer();
private Timer timerKillProcess = new Timer();
private Timer timerCheckAutoFold = new Timer();
private string AvailableLatestVersion = null;
private Timer timerCheckAutoUpdateWithSilence = new Timer();
private bool isHidingSubPanelsWhenInking = false; // 避免书写时触发二次关闭二级菜单导致动画不连续
Timer timerDisplayTime = new Timer();
Timer timerDisplayDate = new Timer();
private Timer timerDisplayTime = new Timer();
private Timer timerDisplayDate = new Timer();
private TimeViewModel nowTimeVM = new TimeViewModel();
private void InitTimers()
{
private void InitTimers() {
timerCheckPPT.Elapsed += TimerCheckPPT_Elapsed;
timerCheckPPT.Interval = 500;
timerKillProcess.Elapsed += TimerKillProcess_Elapsed;
@ -85,65 +73,47 @@ namespace Ink_Canvas
nowTimeVM.nowTime = DateTime.Now.ToShortTimeString().ToString();
}
private void TimerDisplayTime_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
private void TimerDisplayTime_Elapsed(object sender, ElapsedEventArgs e) {
nowTimeVM.nowTime = DateTime.Now.ToShortTimeString().ToString();
}
private void TimerDisplayDate_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
private void TimerDisplayDate_Elapsed(object sender, ElapsedEventArgs e) {
nowTimeVM.nowDate = DateTime.Now.ToShortDateString().ToString();
}
private void TimerKillProcess_Elapsed(object sender, ElapsedEventArgs e)
{
try
{
private void TimerKillProcess_Elapsed(object sender, ElapsedEventArgs e) {
try {
// 希沃相关: easinote swenserver RemoteProcess EasiNote.MediaHttpService smartnote.cloud EasiUpdate smartnote EasiUpdate3 EasiUpdate3Protect SeewoP2P CefSharp.BrowserSubprocess SeewoUploadService
string arg = "/F";
if (Settings.Automation.IsAutoKillPptService)
{
Process[] processes = Process.GetProcessesByName("PPTService");
if (processes.Length > 0)
{
arg += " /IM PPTService.exe";
}
var arg = "/F";
if (Settings.Automation.IsAutoKillPptService) {
var processes = Process.GetProcessesByName("PPTService");
if (processes.Length > 0) arg += " /IM PPTService.exe";
processes = Process.GetProcessesByName("SeewoIwbAssistant");
if (processes.Length > 0)
{
arg += " /IM SeewoIwbAssistant.exe" + " /IM Sia.Guard.exe";
}
if (processes.Length > 0) arg += " /IM SeewoIwbAssistant.exe" + " /IM Sia.Guard.exe";
}
if (Settings.Automation.IsAutoKillEasiNote)
{
Process[] processes = Process.GetProcessesByName("EasiNote");
if (processes.Length > 0)
{
arg += " /IM EasiNote.exe";
}
if (Settings.Automation.IsAutoKillEasiNote) {
var processes = Process.GetProcessesByName("EasiNote");
if (processes.Length > 0) arg += " /IM EasiNote.exe";
}
if (Settings.Automation.IsAutoKillHiteAnnotation)
{
Process[] processes = Process.GetProcessesByName("HiteAnnotation");
if (processes.Length > 0)
{
arg += " /IM HiteAnnotation.exe";
}
if (Settings.Automation.IsAutoKillHiteAnnotation) {
var processes = Process.GetProcessesByName("HiteAnnotation");
if (processes.Length > 0) arg += " /IM HiteAnnotation.exe";
}
if (arg != "/F")
{
Process p = new Process();
if (arg != "/F") {
var p = new Process();
p.StartInfo = new ProcessStartInfo("taskkill", arg);
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.Start();
if (arg.Contains("EasiNote"))
{
if (arg.Contains("EasiNote")) {
BtnSwitch_Click(BtnSwitch, null);
MessageBox.Show("“希沃白板 5”已自动关闭");
}
if (arg.Contains("HiteAnnotation"))
{
if (arg.Contains("HiteAnnotation")) {
BtnSwitch_Click(BtnSwitch, null);
MessageBox.Show("“鸿合屏幕书写”已自动关闭");
}
@ -153,80 +123,70 @@ namespace Ink_Canvas
}
bool foldFloatingBarByUser = false, // 保持收纳操作不受自动收纳的控制
private bool foldFloatingBarByUser = false, // 保持收纳操作不受自动收纳的控制
unfoldFloatingBarByUser = false; // 允许用户在希沃软件内进行展开操作
private void timerCheckAutoFold_Elapsed(object sender, ElapsedEventArgs e)
{
private void timerCheckAutoFold_Elapsed(object sender, ElapsedEventArgs e) {
if (isFloatingBarChangingHideMode) return;
try
{
string windowProcessName = ForegroundWindowInfo.ProcessName();
string windowTitle = ForegroundWindowInfo.WindowTitle();
try {
var windowProcessName = ForegroundWindowInfo.ProcessName();
var windowTitle = ForegroundWindowInfo.WindowTitle();
//LogHelper.WriteLogToFile("windowTitle | " + windowTitle + " | windowProcessName | " + windowProcessName);
if (Settings.Automation.IsAutoFoldInEasiNote && windowProcessName == "EasiNote" // 希沃白板
&& (!(windowTitle.Length == 0 && ForegroundWindowInfo.WindowRect().Height < 500) || !Settings.Automation.IsAutoFoldInEasiNoteIgnoreDesktopAnno)
|| Settings.Automation.IsAutoFoldInEasiCamera && windowProcessName == "EasiCamera" // 希沃视频展台
|| Settings.Automation.IsAutoFoldInEasiNote3C && windowProcessName == "EasiNote" // 希沃轻白板3C
|| Settings.Automation.IsAutoFoldInEasiNote5C && windowProcessName == "EasiNote5C" // 希沃轻白板5C
|| Settings.Automation.IsAutoFoldInSeewoPincoTeacher && (windowProcessName == "BoardService" || windowProcessName == "seewoPincoTeacher") // 希沃品课
|| Settings.Automation.IsAutoFoldInHiteCamera && windowProcessName == "HiteCamera" // 鸿合视频展台
|| Settings.Automation.IsAutoFoldInHiteTouchPro && windowProcessName == "HiteTouchPro" // 鸿合白板
|| Settings.Automation.IsAutoFoldInWxBoardMain && windowProcessName == "WxBoardMain" // 文香白板
|| Settings.Automation.IsAutoFoldInMSWhiteboard && (windowProcessName == "MicrosoftWhiteboard" || windowProcessName == "msedgewebview2") // 微软白板
|| Settings.Automation.IsAutoFoldInOldZyBoard && // 中原旧白板
(WinTabWindowsChecker.IsWindowExisted("WhiteBoard - DrawingWindow")
|| WinTabWindowsChecker.IsWindowExisted("InstantAnnotationWindow")))
{
if (!unfoldFloatingBarByUser && !isFloatingBarFolded)
{
FoldFloatingBar_MouseUp(null, null);
}
if ((Settings.Automation.IsAutoFoldInEasiNote && windowProcessName == "EasiNote" // 希沃白板
&& (!(windowTitle.Length == 0 &&
ForegroundWindowInfo.WindowRect().Height < 500) ||
!Settings.Automation
.IsAutoFoldInEasiNoteIgnoreDesktopAnno))
|| (Settings.Automation.IsAutoFoldInEasiCamera && windowProcessName == "EasiCamera") // 希沃视频展台
|| (Settings.Automation.IsAutoFoldInEasiNote3C && windowProcessName == "EasiNote") // 希沃轻白板3C
|| (Settings.Automation.IsAutoFoldInEasiNote5C && windowProcessName == "EasiNote5C") // 希沃轻白板5C
|| (Settings.Automation.IsAutoFoldInSeewoPincoTeacher && (windowProcessName == "BoardService" ||
windowProcessName ==
"seewoPincoTeacher")) // 希沃品课
|| (Settings.Automation.IsAutoFoldInHiteCamera && windowProcessName == "HiteCamera") // 鸿合视频展台
|| (Settings.Automation.IsAutoFoldInHiteTouchPro && windowProcessName == "HiteTouchPro") // 鸿合白板
|| (Settings.Automation.IsAutoFoldInWxBoardMain && windowProcessName == "WxBoardMain") // 文香白板
|| (Settings.Automation.IsAutoFoldInMSWhiteboard && (windowProcessName == "MicrosoftWhiteboard" ||
windowProcessName == "msedgewebview2")) // 微软白板
|| (Settings.Automation.IsAutoFoldInOldZyBoard && // 中原旧白板
(WinTabWindowsChecker.IsWindowExisted("WhiteBoard - DrawingWindow")
|| WinTabWindowsChecker.IsWindowExisted("InstantAnnotationWindow")))) {
if (!unfoldFloatingBarByUser && !isFloatingBarFolded) FoldFloatingBar_MouseUp(null, null);
}
else if (WinTabWindowsChecker.IsWindowExisted("幻灯片放映", false))
{ // 处于幻灯片放映状态
else if (WinTabWindowsChecker.IsWindowExisted("幻灯片放映", false)) {
// 处于幻灯片放映状态
if (!Settings.Automation.IsAutoFoldInPPTSlideShow && isFloatingBarFolded && !foldFloatingBarByUser)
{
UnFoldFloatingBar_MouseUp(new Object(), null);
}
UnFoldFloatingBar_MouseUp(new object(), null);
}
else
{
if (isFloatingBarFolded && !foldFloatingBarByUser)
{
UnFoldFloatingBar_MouseUp(new Object(), null);
}
else {
if (isFloatingBarFolded && !foldFloatingBarByUser) UnFoldFloatingBar_MouseUp(new object(), null);
unfoldFloatingBarByUser = false;
}
}
catch { }
}
private void timerCheckAutoUpdateWithSilence_Elapsed(object sender, ElapsedEventArgs e)
{
private void timerCheckAutoUpdateWithSilence_Elapsed(object sender, ElapsedEventArgs e) {
Dispatcher.Invoke(() => {
try
{
if ((!Topmost) || (inkCanvas.Strokes.Count > 0)) return;
try {
if (!Topmost || inkCanvas.Strokes.Count > 0) return;
}
catch (Exception ex)
{
catch (Exception ex) {
LogHelper.WriteLogToFile(ex.ToString(), LogHelper.LogType.Error);
}
});
try
{
if (AutoUpdateWithSilenceTimeComboBox.CheckIsInSilencePeriod(Settings.Startup.AutoUpdateWithSilenceStartTime, Settings.Startup.AutoUpdateWithSilenceEndTime))
{
try {
if (AutoUpdateWithSilenceTimeComboBox.CheckIsInSilencePeriod(
Settings.Startup.AutoUpdateWithSilenceStartTime,
Settings.Startup.AutoUpdateWithSilenceEndTime)) {
AutoUpdateHelper.InstallNewVersionApp(AvailableLatestVersion, true);
timerCheckAutoUpdateWithSilence.Stop();
}
}
catch (Exception ex)
{
catch (Exception ex) {
LogHelper.WriteLogToFile(ex.ToString(), LogHelper.LogType.Error);
}
}
}
}
}

View File

@ -10,17 +10,14 @@ using System.Windows.Input;
using System.Windows.Media;
using Point = System.Windows.Point;
namespace Ink_Canvas
{
public partial class MainWindow : Window
{
namespace Ink_Canvas {
public partial class MainWindow : Window {
#region Multi-Touch
bool isInMultiTouchMode = false;
private void BorderMultiTouchMode_MouseUp(object sender, MouseButtonEventArgs e)
{
if (isInMultiTouchMode)
{
private bool isInMultiTouchMode = false;
private void BorderMultiTouchMode_MouseUp(object sender, MouseButtonEventArgs e) {
if (isInMultiTouchMode) {
inkCanvas.StylusDown -= MainWindow_StylusDown;
inkCanvas.StylusMove -= MainWindow_StylusMove;
inkCanvas.StylusUp -= MainWindow_StylusUp;
@ -30,8 +27,7 @@ namespace Ink_Canvas
inkCanvas.Children.Clear();
isInMultiTouchMode = false;
}
else
{
else {
inkCanvas.StylusDown += MainWindow_StylusDown;
inkCanvas.StylusMove += MainWindow_StylusMove;
inkCanvas.StylusUp += MainWindow_StylusUp;
@ -43,31 +39,25 @@ namespace Ink_Canvas
}
}
private void MainWindow_TouchDown(object sender, TouchEventArgs e)
{
private void MainWindow_TouchDown(object sender, TouchEventArgs e) {
if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint
|| inkCanvas.EditingMode == InkCanvasEditingMode.EraseByStroke
|| inkCanvas.EditingMode == InkCanvasEditingMode.Select) return;
if (!isHidingSubPanelsWhenInking)
{
if (!isHidingSubPanelsWhenInking) {
isHidingSubPanelsWhenInking = true;
HideSubPanels(); // 书写时自动隐藏二级菜单
}
double boundWidth = e.GetTouchPoint(null).Bounds.Width, eraserMultiplier = 1.0;
if (!Settings.Advanced.EraserBindTouchMultiplier && Settings.Advanced.IsSpecialScreen)
{
eraserMultiplier = 1 / Settings.Advanced.TouchMultiplier;
}
if ((Settings.Advanced.TouchMultiplier != 0 || !Settings.Advanced.IsSpecialScreen) //启用特殊屏幕且触摸倍数为 0 时禁用橡皮
&& (boundWidth > BoundsWidth * 2.5))
{
&& boundWidth > BoundsWidth * 2.5) {
if (drawingShapeMode == 0 && forceEraser) return;
double k = 1;
switch (Settings.Canvas.EraserSize)
{
switch (Settings.Canvas.EraserSize) {
case 0:
k = 0.5;
break;
@ -81,19 +71,19 @@ namespace Ink_Canvas
k = 1.8;
break;
}
inkCanvas.EraserShape = new EllipseStylusShape(boundWidth * k * eraserMultiplier * 0.25, boundWidth * k * eraserMultiplier * 0.25);
inkCanvas.EraserShape = new EllipseStylusShape(boundWidth * k * eraserMultiplier * 0.25,
boundWidth * k * eraserMultiplier * 0.25);
TouchDownPointsList[e.TouchDevice.Id] = InkCanvasEditingMode.EraseByPoint;
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint;
}
else
{
else {
TouchDownPointsList[e.TouchDevice.Id] = InkCanvasEditingMode.None;
inkCanvas.EditingMode = InkCanvasEditingMode.None;
}
}
private void MainWindow_StylusDown(object sender, StylusDownEventArgs e)
{
private void MainWindow_StylusDown(object sender, StylusDownEventArgs e) {
if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint
|| inkCanvas.EditingMode == InkCanvasEditingMode.EraseByStroke
|| inkCanvas.EditingMode == InkCanvasEditingMode.Select) return;
@ -101,27 +91,24 @@ namespace Ink_Canvas
TouchDownPointsList[e.StylusDevice.Id] = InkCanvasEditingMode.None;
}
private async void MainWindow_StylusUp(object sender, StylusEventArgs e)
{
try
{
private async void MainWindow_StylusUp(object sender, StylusEventArgs e) {
try {
inkCanvas.Strokes.Add(GetStrokeVisual(e.StylusDevice.Id).Stroke);
await Task.Delay(5); // 避免渲染墨迹完成前预览墨迹被删除导致墨迹闪烁
inkCanvas.Children.Remove(GetVisualCanvas(e.StylusDevice.Id));
inkCanvas_StrokeCollected(inkCanvas, new InkCanvasStrokeCollectedEventArgs(GetStrokeVisual(e.StylusDevice.Id).Stroke));
inkCanvas_StrokeCollected(inkCanvas,
new InkCanvasStrokeCollectedEventArgs(GetStrokeVisual(e.StylusDevice.Id).Stroke));
}
catch (Exception ex)
{
catch (Exception ex) {
Label.Content = ex.ToString();
}
try
{
try {
StrokeVisualList.Remove(e.StylusDevice.Id);
VisualCanvasList.Remove(e.StylusDevice.Id);
TouchDownPointsList.Remove(e.StylusDevice.Id);
if (StrokeVisualList.Count == 0 || VisualCanvasList.Count == 0 || TouchDownPointsList.Count == 0)
{
if (StrokeVisualList.Count == 0 || VisualCanvasList.Count == 0 || TouchDownPointsList.Count == 0) {
inkCanvas.Children.Clear();
StrokeVisualList.Clear();
VisualCanvasList.Clear();
@ -131,33 +118,25 @@ namespace Ink_Canvas
catch { }
}
private void MainWindow_StylusMove(object sender, StylusEventArgs e)
{
try
{
private void MainWindow_StylusMove(object sender, StylusEventArgs e) {
try {
if (GetTouchDownPointsList(e.StylusDevice.Id) != InkCanvasEditingMode.None) return;
try
{
try {
if (e.StylusDevice.StylusButtons[1].StylusButtonState == StylusButtonState.Down) return;
}
catch { }
var strokeVisual = GetStrokeVisual(e.StylusDevice.Id);
var stylusPointCollection = e.GetStylusPoints(this);
foreach (var stylusPoint in stylusPointCollection)
{
strokeVisual.Add(new StylusPoint(stylusPoint.X, stylusPoint.Y, stylusPoint.PressureFactor));
}
strokeVisual.Redraw();
}
catch { }
}
private StrokeVisual GetStrokeVisual(int id)
{
if (StrokeVisualList.TryGetValue(id, out var visual))
{
return visual;
}
private StrokeVisual GetStrokeVisual(int id) {
if (StrokeVisualList.TryGetValue(id, out var visual)) return visual;
var strokeVisual = new StrokeVisual(inkCanvas.DefaultDrawingAttributes.Clone());
StrokeVisualList[id] = strokeVisual;
@ -169,69 +148,47 @@ namespace Ink_Canvas
return strokeVisual;
}
private VisualCanvas GetVisualCanvas(int id)
{
if (VisualCanvasList.TryGetValue(id, out var visualCanvas))
{
return visualCanvas;
}
return null;
private VisualCanvas GetVisualCanvas(int id) {
return VisualCanvasList.TryGetValue(id, out var visualCanvas) ? visualCanvas : null;
}
private InkCanvasEditingMode GetTouchDownPointsList(int id)
{
if (TouchDownPointsList.TryGetValue(id, out var inkCanvasEditingMode))
{
return inkCanvasEditingMode;
}
return inkCanvas.EditingMode;
private InkCanvasEditingMode GetTouchDownPointsList(int id) {
return TouchDownPointsList.TryGetValue(id, out var inkCanvasEditingMode) ? inkCanvasEditingMode : inkCanvas.EditingMode;
}
private Dictionary<int, InkCanvasEditingMode> TouchDownPointsList { get; } = new Dictionary<int, InkCanvasEditingMode>();
private Dictionary<int, InkCanvasEditingMode> TouchDownPointsList { get; } =
new Dictionary<int, InkCanvasEditingMode>();
private Dictionary<int, StrokeVisual> StrokeVisualList { get; } = new Dictionary<int, StrokeVisual>();
private Dictionary<int, VisualCanvas> VisualCanvasList { get; } = new Dictionary<int, VisualCanvas>();
#endregion
private int lastTouchDownTime = 0, lastTouchUpTime = 0;
int lastTouchDownTime = 0, lastTouchUpTime = 0;
Point iniP = new Point(0, 0);
bool isLastTouchEraser = false;
private Point iniP = new Point(0, 0);
private bool isLastTouchEraser = false;
private bool forcePointEraser = true;
private void Main_Grid_TouchDown(object sender, TouchEventArgs e)
{
if (!isHidingSubPanelsWhenInking)
{
private void Main_Grid_TouchDown(object sender, TouchEventArgs e) {
if (!isHidingSubPanelsWhenInking) {
isHidingSubPanelsWhenInking = true;
HideSubPanels(); // 书写时自动隐藏二级菜单
}
if (NeedUpdateIniP())
{
iniP = e.GetTouchPoint(inkCanvas).Position;
}
if (drawingShapeMode == 9 && isFirstTouchCuboid == false)
{
MouseTouchMove(iniP);
}
if (NeedUpdateIniP()) iniP = e.GetTouchPoint(inkCanvas).Position;
if (drawingShapeMode == 9 && isFirstTouchCuboid == false) MouseTouchMove(iniP);
inkCanvas.Opacity = 1;
double boundsWidth = GetTouchBoundWidth(e), eraserMultiplier = 1.0;
if (!Settings.Advanced.EraserBindTouchMultiplier && Settings.Advanced.IsSpecialScreen)
{
eraserMultiplier = 1 / Settings.Advanced.TouchMultiplier;
}
if (boundsWidth > BoundsWidth)
{
if (boundsWidth > BoundsWidth) {
isLastTouchEraser = true;
if (drawingShapeMode == 0 && forceEraser) return;
if (boundsWidth > BoundsWidth * 2.5)
{
if (boundsWidth > BoundsWidth * 2.5) {
double k = 1;
switch (Settings.Canvas.EraserSize)
{
switch (Settings.Canvas.EraserSize) {
case 0:
k = 0.5;
break;
@ -245,35 +202,34 @@ namespace Ink_Canvas
k = 1.8;
break;
}
inkCanvas.EraserShape = new EllipseStylusShape(boundsWidth * k * eraserMultiplier, boundsWidth * k * eraserMultiplier);
inkCanvas.EraserShape = new EllipseStylusShape(boundsWidth * k * eraserMultiplier,
boundsWidth * k * eraserMultiplier);
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint;
}
else
{
if (StackPanelPPTControls.Visibility == Visibility.Visible && inkCanvas.Strokes.Count == 0 && Settings.PowerPointSettings.IsEnableFingerGestureSlideShowControl)
{
else {
if (StackPanelPPTControls.Visibility == Visibility.Visible && inkCanvas.Strokes.Count == 0 &&
Settings.PowerPointSettings.IsEnableFingerGestureSlideShowControl) {
isLastTouchEraser = false;
inkCanvas.EditingMode = InkCanvasEditingMode.GestureOnly;
inkCanvas.Opacity = 0.1;
}
else
{
else {
inkCanvas.EraserShape = new EllipseStylusShape(5, 5);
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByStroke;
}
}
}
else
{
else {
isLastTouchEraser = false;
inkCanvas.EraserShape = forcePointEraser ? new EllipseStylusShape(50, 50) : new EllipseStylusShape(5, 5);
inkCanvas.EraserShape =
forcePointEraser ? new EllipseStylusShape(50, 50) : new EllipseStylusShape(5, 5);
if (forceEraser) return;
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
}
}
public double GetTouchBoundWidth(TouchEventArgs e)
{
private double GetTouchBoundWidth(TouchEventArgs e) {
var args = e.GetTouchPoint(null).Bounds;
double value;
if (!Settings.Advanced.IsQuadIR) value = args.Width;
@ -284,78 +240,59 @@ namespace Ink_Canvas
//记录触摸设备ID
private List<int> dec = new List<int>();
//中心点
System.Windows.Point centerPoint;
InkCanvasEditingMode lastInkCanvasEditingMode = InkCanvasEditingMode.Ink;
bool isSingleFingerDragMode = false;
private void inkCanvas_PreviewTouchDown(object sender, TouchEventArgs e)
{
//中心点
private Point centerPoint;
private InkCanvasEditingMode lastInkCanvasEditingMode = InkCanvasEditingMode.Ink;
private bool isSingleFingerDragMode = false;
private void inkCanvas_PreviewTouchDown(object sender, TouchEventArgs e) {
dec.Add(e.TouchDevice.Id);
//设备1个的时候记录中心点
if (dec.Count == 1)
{
TouchPoint touchPoint = e.GetTouchPoint(inkCanvas);
if (dec.Count == 1) {
var touchPoint = e.GetTouchPoint(inkCanvas);
centerPoint = touchPoint.Position;
//记录第一根手指点击时的 StrokeCollection
lastTouchDownStrokeCollection = inkCanvas.Strokes.Clone();
}
//设备两个及两个以上,将画笔功能关闭
if (dec.Count > 1 || isSingleFingerDragMode || !Settings.Gesture.IsEnableTwoFingerGesture)
{
if (dec.Count > 1 || isSingleFingerDragMode || !Settings.Gesture.IsEnableTwoFingerGesture) {
if (isInMultiTouchMode || !Settings.Gesture.IsEnableTwoFingerGesture) return;
if (inkCanvas.EditingMode != InkCanvasEditingMode.None && inkCanvas.EditingMode != InkCanvasEditingMode.Select)
{
lastInkCanvasEditingMode = inkCanvas.EditingMode;
inkCanvas.EditingMode = InkCanvasEditingMode.None;
}
if (inkCanvas.EditingMode == InkCanvasEditingMode.None ||
inkCanvas.EditingMode == InkCanvasEditingMode.Select) return;
lastInkCanvasEditingMode = inkCanvas.EditingMode;
inkCanvas.EditingMode = InkCanvasEditingMode.None;
}
}
private void inkCanvas_PreviewTouchUp(object sender, TouchEventArgs e)
{
private void inkCanvas_PreviewTouchUp(object sender, TouchEventArgs e) {
//手势完成后切回之前的状态
if (dec.Count > 1)
{
if (inkCanvas.EditingMode == InkCanvasEditingMode.None)
{
inkCanvas.EditingMode = lastInkCanvasEditingMode;
}
}
dec.Remove(e.TouchDevice.Id);
inkCanvas.Opacity = 1;
if (dec.Count == 0)
{
if (lastTouchDownStrokeCollection.Count() != inkCanvas.Strokes.Count() &&
!(drawingShapeMode == 9 && !isFirstTouchCuboid))
{
int whiteboardIndex = CurrentWhiteboardIndex;
if (currentMode == 0)
{
whiteboardIndex = 0;
}
!(drawingShapeMode == 9 && !isFirstTouchCuboid)) {
var whiteboardIndex = CurrentWhiteboardIndex;
if (currentMode == 0) whiteboardIndex = 0;
strokeCollections[whiteboardIndex] = lastTouchDownStrokeCollection;
}
}
}
private void inkCanvas_ManipulationStarting(object sender, ManipulationStartingEventArgs e)
{
private void inkCanvas_ManipulationStarting(object sender, ManipulationStartingEventArgs e) {
e.Mode = ManipulationModes.All;
}
private void inkCanvas_ManipulationInertiaStarting(object sender, ManipulationInertiaStartingEventArgs e)
{
private void inkCanvas_ManipulationInertiaStarting(object sender, ManipulationInertiaStartingEventArgs e) { }
}
private void Main_Grid_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
{
if (e.Manipulators.Count() == 0)
{
if (forceEraser) return;
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
}
private void Main_Grid_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e) {
if (e.Manipulators.Count() != 0) return;
if (forceEraser) return;
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
}
// -- removed --
@ -378,111 +315,103 @@ namespace Ink_Canvas
// _currentCommitType = CommitReason.UserInput;
//}
private void Main_Grid_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{
private void Main_Grid_ManipulationDelta(object sender, ManipulationDeltaEventArgs e) {
if (isInMultiTouchMode || !Settings.Gesture.IsEnableTwoFingerGesture) return;
if ((dec.Count >= 2 && (Settings.PowerPointSettings.IsEnableTwoFingerGestureInPresentationMode || StackPanelPPTControls.Visibility != Visibility.Visible || StackPanelPPTButtons.Visibility == Visibility.Collapsed)) || isSingleFingerDragMode)
{
ManipulationDelta md = e.DeltaManipulation;
Vector trans = md.Translation; // 获得位移矢量
if ((dec.Count >= 2 && (Settings.PowerPointSettings.IsEnableTwoFingerGestureInPresentationMode ||
StackPanelPPTControls.Visibility != Visibility.Visible ||
StackPanelPPTButtons.Visibility == Visibility.Collapsed)) ||
isSingleFingerDragMode) {
var md = e.DeltaManipulation;
var trans = md.Translation; // 获得位移矢量
Matrix m = new Matrix();
var m = new Matrix();
if (Settings.Gesture.IsEnableTwoFingerTranslate)
m.Translate(trans.X, trans.Y); // 移动
m.Translate(trans.X, trans.Y); // 移动
if (Settings.Gesture.IsEnableTwoFingerGestureTranslateOrRotation)
{
double rotate = md.Rotation; // 获得旋转角度
Vector scale = md.Scale; // 获得缩放倍数
if (Settings.Gesture.IsEnableTwoFingerGestureTranslateOrRotation) {
var rotate = md.Rotation; // 获得旋转角度
var scale = md.Scale; // 获得缩放倍数
// Find center of element and then transform to get current location of center
FrameworkElement fe = e.Source as FrameworkElement;
Point center = new Point(fe.ActualWidth / 2, fe.ActualHeight / 2);
center = m.Transform(center); // 转换为矩阵缩放和旋转的中心点
var fe = e.Source as FrameworkElement;
var center = new Point(fe.ActualWidth / 2, fe.ActualHeight / 2);
center = m.Transform(center); // 转换为矩阵缩放和旋转的中心点
if (Settings.Gesture.IsEnableTwoFingerRotation)
m.RotateAt(rotate, center.X, center.Y); // 旋转
m.RotateAt(rotate, center.X, center.Y); // 旋转
if (Settings.Gesture.IsEnableTwoFingerZoom)
m.ScaleAt(scale.X, scale.Y, center.X, center.Y); // 缩放
m.ScaleAt(scale.X, scale.Y, center.X, center.Y); // 缩放
}
StrokeCollection strokes = inkCanvas.GetSelectedStrokes();
if (strokes.Count != 0)
{
foreach (Stroke stroke in strokes)
{
var strokes = inkCanvas.GetSelectedStrokes();
if (strokes.Count != 0) {
foreach (var stroke in strokes) {
stroke.Transform(m, false);
foreach (Circle circle in circles)
{
if (stroke == circle.Stroke)
{
circle.R = GetDistance(circle.Stroke.StylusPoints[0].ToPoint(), circle.Stroke.StylusPoints[circle.Stroke.StylusPoints.Count / 2].ToPoint()) / 2;
circle.Centroid = new Point((circle.Stroke.StylusPoints[0].X + circle.Stroke.StylusPoints[circle.Stroke.StylusPoints.Count / 2].X) / 2,
(circle.Stroke.StylusPoints[0].Y + circle.Stroke.StylusPoints[circle.Stroke.StylusPoints.Count / 2].Y) / 2);
foreach (var circle in circles)
if (stroke == circle.Stroke) {
circle.R = GetDistance(circle.Stroke.StylusPoints[0].ToPoint(),
circle.Stroke.StylusPoints[circle.Stroke.StylusPoints.Count / 2].ToPoint()) / 2;
circle.Centroid = new Point(
(circle.Stroke.StylusPoints[0].X +
circle.Stroke.StylusPoints[circle.Stroke.StylusPoints.Count / 2].X) / 2,
(circle.Stroke.StylusPoints[0].Y +
circle.Stroke.StylusPoints[circle.Stroke.StylusPoints.Count / 2].Y) / 2);
break;
}
}
if (Settings.Gesture.IsEnableTwoFingerZoom)
{
try
{
stroke.DrawingAttributes.Width *= md.Scale.X;
stroke.DrawingAttributes.Height *= md.Scale.Y;
}
catch { }
if (!Settings.Gesture.IsEnableTwoFingerZoom) continue;
try {
stroke.DrawingAttributes.Width *= md.Scale.X;
stroke.DrawingAttributes.Height *= md.Scale.Y;
}
catch { }
}
if (lastTempManiputlaionMatrix == null)
{
if (lastTempManiputlaionMatrix == null) {
lastTempManiputlaionMatrix = m;
lastTempStrokeCollection = strokes;
}
else
{
else {
lastTempManiputlaionMatrix?.Append(m);
}
}
else
{
if (Settings.Gesture.IsEnableTwoFingerZoom)
{
foreach (Stroke stroke in inkCanvas.Strokes)
{
else {
if (Settings.Gesture.IsEnableTwoFingerZoom) {
foreach (var stroke in inkCanvas.Strokes) {
stroke.Transform(m, false);
try
{
try {
stroke.DrawingAttributes.Width *= md.Scale.X;
stroke.DrawingAttributes.Height *= md.Scale.Y;
}
catch { }
};
}
;
}
else
{
foreach (Stroke stroke in inkCanvas.Strokes)
{
stroke.Transform(m, false);
};
else {
foreach (var stroke in inkCanvas.Strokes) stroke.Transform(m, false);
;
}
foreach (Circle circle in circles)
{
circle.R = GetDistance(circle.Stroke.StylusPoints[0].ToPoint(), circle.Stroke.StylusPoints[circle.Stroke.StylusPoints.Count / 2].ToPoint()) / 2;
foreach (var circle in circles) {
circle.R = GetDistance(circle.Stroke.StylusPoints[0].ToPoint(),
circle.Stroke.StylusPoints[circle.Stroke.StylusPoints.Count / 2].ToPoint()) / 2;
circle.Centroid = new Point(
(circle.Stroke.StylusPoints[0].X + circle.Stroke.StylusPoints[circle.Stroke.StylusPoints.Count / 2].X) / 2,
(circle.Stroke.StylusPoints[0].Y + circle.Stroke.StylusPoints[circle.Stroke.StylusPoints.Count / 2].Y) / 2
(circle.Stroke.StylusPoints[0].X +
circle.Stroke.StylusPoints[circle.Stroke.StylusPoints.Count / 2].X) / 2,
(circle.Stroke.StylusPoints[0].Y +
circle.Stroke.StylusPoints[circle.Stroke.StylusPoints.Count / 2].Y) / 2
);
};
if (lastTempManiputlaionMatrix == null)
{
}
;
if (lastTempManiputlaionMatrix == null) {
lastTempManiputlaionMatrix = m;
lastTempStrokeCollection = inkCanvas.Strokes;
}
else
{
else {
lastTempManiputlaionMatrix?.Append(m);
}
}

View File

@ -286,8 +286,8 @@ namespace Ink_Canvas
[JsonProperty("isLogEnabled")]
public bool IsLogEnabled { get; set; } = true;
[JsonProperty("isSecondConfimeWhenShutdownApp")]
public bool IsSecondConfimeWhenShutdownApp { get; set; } = false;
[JsonProperty("isSecondConfirmWhenShutdownApp")]
public bool IsSecondConfirmWhenShutdownApp { get; set; } = false;
}
public class InkToShape