diff --git a/Ink Canvas/Helpers/GlobalHotkeyManager.cs b/Ink Canvas/Helpers/GlobalHotkeyManager.cs new file mode 100644 index 00000000..4ab1a459 --- /dev/null +++ b/Ink Canvas/Helpers/GlobalHotkeyManager.cs @@ -0,0 +1,301 @@ +using System; +using System.Collections.Generic; +using System.Windows.Input; +using NHotkey.Wpf; + +namespace Ink_Canvas.Helpers +{ + /// + /// 全局快捷键管理器 - 使用NHotkey库实现全局快捷键功能 + /// + public class GlobalHotkeyManager : IDisposable + { + #region Private Fields + private readonly Dictionary _registeredHotkeys; + private readonly MainWindow _mainWindow; + private bool _isDisposed = false; + #endregion + + #region Constructor + public GlobalHotkeyManager(MainWindow mainWindow) + { + _mainWindow = mainWindow ?? throw new ArgumentNullException(nameof(mainWindow)); + _registeredHotkeys = new Dictionary(); + } + #endregion + + #region Public Methods + /// + /// 注册全局快捷键 + /// + /// 快捷键名称 + /// 按键 + /// 修饰键 + /// 执行动作 + /// 是否注册成功 + public bool RegisterHotkey(string hotkeyName, Key key, ModifierKeys modifiers, Action action) + { + try + { + if (_isDisposed) + return false; + + // 如果快捷键已存在,先注销 + if (_registeredHotkeys.ContainsKey(hotkeyName)) + { + UnregisterHotkey(hotkeyName); + } + + // 创建快捷键信息 + var hotkeyInfo = new HotkeyInfo + { + Name = hotkeyName, + Key = key, + Modifiers = modifiers, + Action = action + }; + + // 注册快捷键 + HotkeyManager.Current.AddOrReplace(hotkeyName, key, modifiers, (sender, e) => + { + try + { + // 确保在主线程中执行 + _mainWindow.Dispatcher.Invoke(() => + { + action?.Invoke(); + }); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"执行快捷键 {hotkeyName} 时出错: {ex.Message}", LogHelper.LogType.Error); + } + }); + + _registeredHotkeys[hotkeyName] = hotkeyInfo; + LogHelper.WriteLogToFile($"成功注册全局快捷键: {hotkeyName} ({modifiers}+{key})", LogHelper.LogType.Event); + return true; + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"注册全局快捷键 {hotkeyName} 失败: {ex.Message}", LogHelper.LogType.Error); + return false; + } + } + + /// + /// 注销指定快捷键 + /// + /// 快捷键名称 + /// 是否注销成功 + public bool UnregisterHotkey(string hotkeyName) + { + try + { + if (_isDisposed || !_registeredHotkeys.ContainsKey(hotkeyName)) + return false; + + HotkeyManager.Current.Remove(hotkeyName); + _registeredHotkeys.Remove(hotkeyName); + LogHelper.WriteLogToFile($"成功注销全局快捷键: {hotkeyName}", LogHelper.LogType.Event); + return true; + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"注销全局快捷键 {hotkeyName} 失败: {ex.Message}", LogHelper.LogType.Error); + return false; + } + } + + /// + /// 注销所有快捷键 + /// + public void UnregisterAllHotkeys() + { + try + { + if (_isDisposed) + return; + + foreach (var hotkeyName in _registeredHotkeys.Keys) + { + try + { + HotkeyManager.Current.Remove(hotkeyName); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"注销快捷键 {hotkeyName} 时出错: {ex.Message}", LogHelper.LogType.Warning); + } + } + + _registeredHotkeys.Clear(); + LogHelper.WriteLogToFile("已注销所有全局快捷键", LogHelper.LogType.Event); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"注销所有快捷键时出错: {ex.Message}", LogHelper.LogType.Error); + } + } + + /// + /// 检查快捷键是否已注册 + /// + /// 快捷键名称 + /// 是否已注册 + public bool IsHotkeyRegistered(string hotkeyName) + { + return _registeredHotkeys.ContainsKey(hotkeyName); + } + + /// + /// 获取已注册的快捷键列表 + /// + /// 快捷键信息列表 + public List GetRegisteredHotkeys() + { + return new List(_registeredHotkeys.Values); + } + + /// + /// 注册默认快捷键集合 + /// + public void RegisterDefaultHotkeys() + { + try + { + // 基本操作快捷键 + RegisterHotkey("Undo", Key.Z, ModifierKeys.Control, () => _mainWindow.SymbolIconUndo_MouseUp(null, null)); + RegisterHotkey("Redo", Key.Y, ModifierKeys.Control, () => _mainWindow.SymbolIconRedo_MouseUp(null, null)); + RegisterHotkey("Clear", Key.E, ModifierKeys.Control, () => _mainWindow.SymbolIconDelete_MouseUp(null, null)); + RegisterHotkey("Paste", Key.V, ModifierKeys.Control, () => _mainWindow.HandleGlobalPaste(null, null)); + + // 工具切换快捷键 + RegisterHotkey("SelectTool", Key.S, ModifierKeys.Alt, () => _mainWindow.SymbolIconSelect_MouseUp(null, null)); + RegisterHotkey("DrawTool", Key.D, ModifierKeys.Alt, () => _mainWindow.PenIcon_Click(null, null)); + RegisterHotkey("EraserTool", Key.E, ModifierKeys.Alt, () => _mainWindow.EraserIcon_Click(null, null)); + RegisterHotkey("BlackboardTool", Key.B, ModifierKeys.Alt, () => _mainWindow.ImageBlackboard_MouseUp(null, null)); + RegisterHotkey("QuitDrawTool", Key.Q, ModifierKeys.Alt, () => _mainWindow.CursorIcon_Click(null, null)); + + // 画笔快捷键 - 使用反射访问penType字段 + RegisterHotkey("Pen1", Key.D1, ModifierKeys.Alt, () => SwitchToPenType(0)); + RegisterHotkey("Pen2", Key.D2, ModifierKeys.Alt, () => SwitchToPenType(1)); + RegisterHotkey("Pen3", Key.D3, ModifierKeys.Alt, () => SwitchToPenType(2)); + RegisterHotkey("Pen4", Key.D4, ModifierKeys.Alt, () => SwitchToPenType(3)); + RegisterHotkey("Pen5", Key.D5, ModifierKeys.Alt, () => SwitchToPenType(4)); + + // 功能快捷键 + RegisterHotkey("DrawLine", Key.L, ModifierKeys.Alt, () => _mainWindow.BtnDrawLine_Click(null, null)); + RegisterHotkey("Screenshot", Key.C, ModifierKeys.Alt, () => _mainWindow.SaveScreenShotToDesktop()); + RegisterHotkey("Hide", Key.V, ModifierKeys.Alt, () => _mainWindow.SymbolIconEmoji_MouseUp(null, null)); + + // 退出快捷键 + RegisterHotkey("Exit", Key.Escape, ModifierKeys.None, () => _mainWindow.KeyExit(null, null)); + + LogHelper.WriteLogToFile("已注册默认全局快捷键集合", LogHelper.LogType.Event); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"注册默认快捷键时出错: {ex.Message}", LogHelper.LogType.Error); + } + } + + /// + /// 从设置加载快捷键配置 + /// + public void LoadHotkeysFromSettings() + { + try + { + // 这里可以从配置文件或设置中加载自定义快捷键 + // 暂时使用默认快捷键 + RegisterDefaultHotkeys(); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"从设置加载快捷键时出错: {ex.Message}", LogHelper.LogType.Error); + } + } + + /// + /// 保存快捷键配置到设置 + /// + public void SaveHotkeysToSettings() + { + try + { + // 这里可以将快捷键配置保存到配置文件或设置中 + LogHelper.WriteLogToFile("快捷键配置已保存", LogHelper.LogType.Event); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"保存快捷键配置时出错: {ex.Message}", LogHelper.LogType.Error); + } + } + #endregion + + #region Private Helper Methods + /// + /// 切换到指定笔类型 + /// + /// 笔类型索引 + private void SwitchToPenType(int penTypeIndex) + { + try + { + // 通过反射访问主窗口的penType字段 + var penTypeField = _mainWindow.GetType().GetField("penType", + System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + + if (penTypeField != null) + { + penTypeField.SetValue(_mainWindow, penTypeIndex); + + // 调用CheckPenTypeUIState方法更新UI状态 + var checkPenTypeMethod = _mainWindow.GetType().GetMethod("CheckPenTypeUIState", + System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + + if (checkPenTypeMethod != null) + { + checkPenTypeMethod.Invoke(_mainWindow, null); + } + } + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"切换到笔类型{penTypeIndex}时出错: {ex.Message}", LogHelper.LogType.Error); + } + } + #endregion + + #region IDisposable Implementation + public void Dispose() + { + if (!_isDisposed) + { + UnregisterAllHotkeys(); + _isDisposed = true; + } + } + #endregion + + #region Nested Classes + /// + /// 快捷键信息类 + /// + public class HotkeyInfo + { + public string Name { get; set; } + public Key Key { get; set; } + public ModifierKeys Modifiers { get; set; } + public Action Action { get; set; } + + public override string ToString() + { + var modifiersText = Modifiers == ModifierKeys.None ? "" : $"{Modifiers}+"; + return $"{modifiersText}{Key}"; + } + } + #endregion + } +} \ No newline at end of file diff --git a/Ink Canvas/Helpers/InkFadeManager.cs b/Ink Canvas/Helpers/InkFadeManager.cs new file mode 100644 index 00000000..6ddbc874 --- /dev/null +++ b/Ink Canvas/Helpers/InkFadeManager.cs @@ -0,0 +1,264 @@ +using System; +using System.Collections.Generic; +using System.Windows; +using System.Windows.Media.Animation; +using System.Windows.Threading; +using System.Windows.Ink; + +namespace Ink_Canvas.Helpers +{ + /// + /// 墨迹渐隐管理器 - 管理墨迹的渐隐动画和状态 + /// + public class InkFadeManager + { + #region Properties + /// + /// 是否启用墨迹渐隐功能 + /// + public bool IsEnabled { get; set; } = false; + + /// + /// 墨迹渐隐时间(毫秒) + /// + public int FadeTime { get; set; } = 3000; + + /// + /// 渐隐动画持续时间(毫秒) + /// + public int AnimationDuration { get; set; } = 1000; + #endregion + + #region Private Fields + private readonly MainWindow _mainWindow; + private readonly Dispatcher _dispatcher; + private readonly Dictionary _fadeTimers; + private readonly Dictionary _strokeVisuals; + #endregion + + #region Constructor + public InkFadeManager(MainWindow mainWindow) + { + _mainWindow = mainWindow ?? throw new ArgumentNullException(nameof(mainWindow)); + _dispatcher = _mainWindow.Dispatcher; + _fadeTimers = new Dictionary(); + _strokeVisuals = new Dictionary(); + } + #endregion + + #region Public Methods + /// + /// 添加需要渐隐的墨迹 + /// + /// 墨迹对象 + /// 墨迹的视觉元素 + public void AddFadingStroke(Stroke stroke, UIElement visual) + { + if (!IsEnabled || stroke == null || visual == null) return; + + try + { + // 记录墨迹和视觉元素的对应关系 + _strokeVisuals[stroke] = visual; + + // 创建定时器,在指定时间后开始渐隐动画 + var timer = new DispatcherTimer + { + Interval = TimeSpan.FromMilliseconds(FadeTime) + }; + + timer.Tick += (sender, e) => + { + StartFadeAnimation(stroke); + timer.Stop(); + _fadeTimers.Remove(stroke); + }; + + _fadeTimers[stroke] = timer; + timer.Start(); + + // 将视觉元素添加到画布上 + _dispatcher.InvokeAsync(() => + { + try + { + if (_mainWindow.inkCanvas != null) + { + _mainWindow.inkCanvas.Children.Add(visual); + } + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"添加墨迹视觉元素到画布失败: {ex}", LogHelper.LogType.Error); + } + }); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"添加渐隐墨迹失败: {ex}", LogHelper.LogType.Error); + } + } + + /// + /// 移除墨迹 + /// + /// 要移除的墨迹 + public void RemoveStroke(Stroke stroke) + { + if (stroke == null) return; + + try + { + if (_fadeTimers.TryGetValue(stroke, out var timer)) + { + timer.Stop(); + _fadeTimers.Remove(stroke); + } + + if (_strokeVisuals.TryGetValue(stroke, out var visual)) + { + _dispatcher.InvokeAsync(() => + { + try + { + if (_mainWindow.inkCanvas != null && _mainWindow.inkCanvas.Children.Contains(visual)) + { + _mainWindow.inkCanvas.Children.Remove(visual); + } + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"从画布移除墨迹视觉元素失败: {ex}", LogHelper.LogType.Error); + } + }); + + _strokeVisuals.Remove(stroke); + } + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"移除渐隐墨迹失败: {ex}", LogHelper.LogType.Error); + } + } + + /// + /// 清除所有渐隐墨迹 + /// + public void ClearAllFadingStrokes() + { + try + { + foreach (var timer in _fadeTimers.Values) + { + timer.Stop(); + } + + _fadeTimers.Clear(); + + _dispatcher.InvokeAsync(() => + { + try + { + if (_mainWindow.inkCanvas != null) + { + foreach (var visual in _strokeVisuals.Values) + { + if (_mainWindow.inkCanvas.Children.Contains(visual)) + { + _mainWindow.inkCanvas.Children.Remove(visual); + } + } + } + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"清除所有墨迹视觉元素失败: {ex}", LogHelper.LogType.Error); + } + }); + + _strokeVisuals.Clear(); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"清除所有渐隐墨迹失败: {ex}", LogHelper.LogType.Error); + } + } + + /// + /// 更新渐隐时间设置 + /// + /// 新的渐隐时间(毫秒) + public void UpdateFadeTime(int fadeTime) + { + FadeTime = fadeTime; + + foreach (var kvp in _fadeTimers) + { + var stroke = kvp.Key; + var timer = kvp.Value; + + timer.Stop(); + timer.Interval = TimeSpan.FromMilliseconds(FadeTime); + timer.Start(); + } + } + + /// + /// 更新动画持续时间设置 + /// + /// 新的动画持续时间(毫秒) + public void UpdateAnimationDuration(int animationDuration) + { + AnimationDuration = animationDuration; + } + #endregion + + #region Private Methods + /// + /// 开始渐隐动画 + /// + /// 要渐隐的墨迹 + private void StartFadeAnimation(Stroke stroke) + { + if (!_strokeVisuals.TryGetValue(stroke, out var visual)) return; + + try + { + _dispatcher.InvokeAsync(() => + { + var fadeAnimation = new DoubleAnimation + { + From = 1.0, + To = 0.0, + Duration = TimeSpan.FromMilliseconds(AnimationDuration), + EasingFunction = new CubicEase { EasingMode = EasingMode.EaseInOut } + }; + + fadeAnimation.Completed += (sender, e) => + { + try + { + if (_mainWindow.inkCanvas != null && _mainWindow.inkCanvas.Children.Contains(visual)) + { + _mainWindow.inkCanvas.Children.Remove(visual); + } + + RemoveStroke(stroke); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"渐隐动画完成后清理墨迹失败: {ex}", LogHelper.LogType.Error); + } + }; + + visual.BeginAnimation(UIElement.OpacityProperty, fadeAnimation); + }); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"开始渐隐动画失败: {ex}", LogHelper.LogType.Error); + } + } + #endregion + } +} \ No newline at end of file diff --git a/Ink Canvas/Helpers/PPTUIManager.cs b/Ink Canvas/Helpers/PPTUIManager.cs index 6fe95e2c..5bf4b636 100644 --- a/Ink Canvas/Helpers/PPTUIManager.cs +++ b/Ink Canvas/Helpers/PPTUIManager.cs @@ -3,7 +3,6 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Threading; -using Ink_Canvas.Helpers; namespace Ink_Canvas.Helpers { diff --git a/Ink Canvas/MainWindow.xaml.cs b/Ink Canvas/MainWindow.xaml.cs index 31bc55a5..14a0ff8d 100644 --- a/Ink Canvas/MainWindow.xaml.cs +++ b/Ink Canvas/MainWindow.xaml.cs @@ -41,6 +41,9 @@ namespace Ink_Canvas private int currentPageIndex; private System.Windows.Controls.Canvas currentCanvas; private AutoUpdateHelper.UpdateLineGroup AvailableLatestLineGroup; + + // 全局快捷键管理器 + private GlobalHotkeyManager _globalHotkeyManager; @@ -495,6 +498,9 @@ namespace Ink_Canvas // 初始化剪贴板监控 InitializeClipboardMonitoring(); + + // 初始化全局快捷键管理器 + InitializeGlobalHotkeyManager(); } private void SystemEventsOnDisplaySettingsChanged(object sender, EventArgs e) @@ -623,6 +629,13 @@ namespace Ink_Canvas // 清理剪贴板监控 CleanupClipboardMonitoring(); ClipboardNotification.Stop(); + + // 清理全局快捷键管理器 + if (_globalHotkeyManager != null) + { + _globalHotkeyManager.Dispose(); + _globalHotkeyManager = null; + } // 停止置顶维护定时器 StopTopmostMaintenance(); @@ -1067,10 +1080,7 @@ namespace Ink_Canvas // 新增:快捷键设置 private void NavShortcuts_Click(object sender, RoutedEventArgs e) { - // 切换到快捷键设置页面 - ShowSettingsSection("shortcuts"); - // 如果设置部分尚未快捷键 - MessageBox.Show("设置功能正在开发中", "提示", MessageBoxButton.OK, MessageBoxImage.Information); + OpenHotkeySettingsWindow(); } private void BtnCloseSettings_Click(object sender, RoutedEventArgs e) @@ -1955,5 +1965,46 @@ namespace Ink_Canvas } #endregion + + #region 全局快捷键管理 + /// + /// 初始化全局快捷键管理器 + /// + private void InitializeGlobalHotkeyManager() + { + try + { + _globalHotkeyManager = new GlobalHotkeyManager(this); + _globalHotkeyManager.LoadHotkeysFromSettings(); + LogHelper.WriteLogToFile("全局快捷键管理器已初始化", LogHelper.LogType.Event); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"初始化全局快捷键管理器时出错: {ex.Message}", LogHelper.LogType.Error); + } + } + + /// + /// 打开快捷键设置窗口 + /// + private void OpenHotkeySettingsWindow() + { + try + { + if (_globalHotkeyManager == null) + { + MessageBox.Show("快捷键管理器尚未初始化,请稍后重试。", "错误", MessageBoxButton.OK, MessageBoxImage.Error); + return; + } + var hotkeySettingsWindow = new HotkeySettingsWindow(this, _globalHotkeyManager); + hotkeySettingsWindow.ShowDialog(); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"打开快捷键设置窗口时出错: {ex.Message}", LogHelper.LogType.Error); + MessageBox.Show($"打开快捷键设置窗口时出错: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); + } + } + #endregion } } diff --git a/Ink Canvas/MainWindow_cs/MW_ClipboardHandler.cs b/Ink Canvas/MainWindow_cs/MW_ClipboardHandler.cs index de6b9ba3..ee4a6152 100644 --- a/Ink Canvas/MainWindow_cs/MW_ClipboardHandler.cs +++ b/Ink Canvas/MainWindow_cs/MW_ClipboardHandler.cs @@ -185,7 +185,7 @@ namespace Ink_Canvas } // 处理全局粘贴快捷键 - private async void HandleGlobalPaste(object sender, ExecutedRoutedEventArgs e) + internal async void HandleGlobalPaste(object sender, ExecutedRoutedEventArgs e) { try { diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index edd67c3d..67f0ec06 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -186,7 +186,7 @@ namespace Ink_Canvas GridForFloatingBarDraging.Visibility = Visibility.Visible; } - private void SymbolIconEmoji_MouseUp(object sender, MouseButtonEventArgs e) + internal void SymbolIconEmoji_MouseUp(object sender, MouseButtonEventArgs e) { isDragDropInEffect = false; @@ -495,7 +495,8 @@ namespace Ink_Canvas #endregion #region 撤銷重做按鈕 - private void SymbolIconUndo_MouseUp(object sender, MouseButtonEventArgs e) + + internal void SymbolIconUndo_MouseUp(object sender, MouseButtonEventArgs e) { //if (lastBorderMouseDownObject != sender) return; @@ -508,7 +509,7 @@ namespace Ink_Canvas HideSubPanels(); } - private void SymbolIconRedo_MouseUp(object sender, MouseButtonEventArgs e) + internal void SymbolIconRedo_MouseUp(object sender, MouseButtonEventArgs e) { //if (lastBorderMouseDownObject != sender) return; @@ -528,7 +529,7 @@ namespace Ink_Canvas //private bool Not_Enter_Blackboard_fir_Mouse_Click = true; private bool isDisplayingOrHidingBlackboard; - private void ImageBlackboard_MouseUp(object sender, MouseButtonEventArgs e) + internal void ImageBlackboard_MouseUp(object sender, MouseButtonEventArgs e) { if (lastBorderMouseDownObject != null && lastBorderMouseDownObject is Panel) @@ -728,7 +729,7 @@ namespace Ink_Canvas #region 清空畫布按鈕 - private void SymbolIconDelete_MouseUp(object sender, MouseButtonEventArgs e) + internal void SymbolIconDelete_MouseUp(object sender, MouseButtonEventArgs e) { if (lastBorderMouseDownObject != null && lastBorderMouseDownObject is Panel) @@ -778,7 +779,7 @@ namespace Ink_Canvas /// /// sender /// MouseButtonEventArgs - private void SymbolIconSelect_MouseUp(object sender, MouseButtonEventArgs e) + internal void SymbolIconSelect_MouseUp(object sender, MouseButtonEventArgs e) { if (lastBorderMouseDownObject != null && lastBorderMouseDownObject is Panel) @@ -1542,7 +1543,7 @@ namespace Ink_Canvas }); } - private async void CursorIcon_Click(object sender, RoutedEventArgs e) + internal async void CursorIcon_Click(object sender, RoutedEventArgs e) { if (lastBorderMouseDownObject != null && lastBorderMouseDownObject is Panel) ((Panel)lastBorderMouseDownObject).Background = new SolidColorBrush(Colors.Transparent); @@ -1648,7 +1649,7 @@ namespace Ink_Canvas } } - private void PenIcon_Click(object sender, RoutedEventArgs e) + internal void PenIcon_Click(object sender, RoutedEventArgs e) { if (lastBorderMouseDownObject != null && lastBorderMouseDownObject is Panel) @@ -1866,7 +1867,7 @@ namespace Ink_Canvas CheckColorTheme(); } - private void EraserIcon_Click(object sender, RoutedEventArgs e) + internal void EraserIcon_Click(object sender, RoutedEventArgs e) { EnterMultiTouchModeIfNeeded(); bool isAlreadyEraser = inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint; diff --git a/Ink Canvas/MainWindow_cs/MW_Hotkeys.cs b/Ink Canvas/MainWindow_cs/MW_Hotkeys.cs index 594d3a21..79ef9e5f 100644 --- a/Ink Canvas/MainWindow_cs/MW_Hotkeys.cs +++ b/Ink Canvas/MainWindow_cs/MW_Hotkeys.cs @@ -57,7 +57,7 @@ namespace Ink_Canvas } - private void KeyExit(object sender, ExecutedRoutedEventArgs e) + internal void KeyExit(object sender, ExecutedRoutedEventArgs e) { if (BtnPPTSlideShowEnd.Visibility == Visibility.Visible) BtnPPTSlideShowEnd_Click(BtnPPTSlideShowEnd, null); } diff --git a/Ink Canvas/MainWindow_cs/MW_Screenshot.cs b/Ink Canvas/MainWindow_cs/MW_Screenshot.cs index 38b40348..00e537fd 100644 --- a/Ink Canvas/MainWindow_cs/MW_Screenshot.cs +++ b/Ink Canvas/MainWindow_cs/MW_Screenshot.cs @@ -42,7 +42,7 @@ namespace Ink_Canvas SaveInkCanvasStrokes(false); } - private void SaveScreenShotToDesktop() + internal void SaveScreenShotToDesktop() { var desktopPath = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), diff --git a/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs b/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs index 9e520900..fdaf44ba 100644 --- a/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs +++ b/Ink Canvas/MainWindow_cs/MW_ShapeDrawing.cs @@ -172,8 +172,8 @@ namespace Ink_Canvas return Task.FromResult(true); } - - private async void BtnDrawLine_Click(object sender, MouseButtonEventArgs e) + + internal async void BtnDrawLine_Click(object sender, MouseButtonEventArgs e) { await CheckIsDrawingShapesInMultiTouchMode(); EnterShapeDrawingMode(1); diff --git a/Ink Canvas/Windows/HotkeyItem.xaml b/Ink Canvas/Windows/HotkeyItem.xaml new file mode 100644 index 00000000..a7ebf536 --- /dev/null +++ b/Ink Canvas/Windows/HotkeyItem.xaml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + +