using Ink_Canvas.Helpers;
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
namespace Ink_Canvas
{
public partial class MainWindow : Window
{
///
/// 处理背景颜色按钮点击事件,显示或隐藏背景颜色选项面板
///
/// 事件发送者
/// 事件参数
///
/// - 检查应用是否已加载
/// - 创建背景选项面板(如果不存在)
/// - 显示或隐藏背景选项面板
/// - 隐藏其他可能显示的面板
/// - 处理白板/黑板模式切换
/// - 更新背景颜色和墨迹颜色
///
private void BoardChangeBackgroundColorBtn_MouseUp(object sender, RoutedEventArgs e)
{
if (!isLoaded) return;
if (BackgroundPalette.Visibility == Visibility.Visible)
{
AnimationsHelper.HideWithSlideAndFade(BackgroundPalette);
}
else
{
AnimationsHelper.HideWithSlideAndFade(EraserSizePanel);
AnimationsHelper.HidePopupWithSlideAndFade(BorderTools);
AnimationsHelper.HidePopupWithSlideAndFade(BoardBorderToolsPopup);
AnimationsHelper.HideWithSlideAndFade(PenPalette);
AnimationsHelper.HideWithSlideAndFade(BoardPenPalette);
AnimationsHelper.HideWithSlideAndFade(BorderDrawShape);
AnimationsHelper.HideWithSlideAndFade(BoardBorderDrawShape);
AnimationsHelper.HideWithSlideAndFade(BoardEraserSizePanel);
AnimationsHelper.HideWithSlideAndFade(TwoFingerGestureBorder);
AnimationsHelper.HideWithSlideAndFade(BoardTwoFingerGestureBorder);
AnimationsHelper.HideWithSlideAndFade(BoardImageOptionsPanel);
LoadCustomBackgroundColor();
UpdateBackgroundButtonsState();
AnimationsHelper.ShowWithSlideFromBottomAndFade(BackgroundPalette);
}
}
private void WhiteboardModeBtn_MouseUp(object sender, MouseButtonEventArgs e)
{
Settings.Canvas.UsingWhiteboard = true;
SaveSettingsToFile();
ICCWaterMarkDark.Visibility = Visibility.Visible;
ICCWaterMarkWhite.Visibility = Visibility.Collapsed;
Color defaultWhiteboardColor = Color.FromRgb(255, 255, 255);
if (currentMode == 1)
{
GridBackgroundCover.Background = new SolidColorBrush(defaultWhiteboardColor);
UpdateRGBSliders(defaultWhiteboardColor);
CustomBackgroundColor = defaultWhiteboardColor;
string colorHex = $"#{defaultWhiteboardColor.R:X2}{defaultWhiteboardColor.G:X2}{defaultWhiteboardColor.B:X2}";
Settings.Canvas.CustomBackgroundColor = colorHex;
SaveSettingsToFile();
}
CheckLastColor(0);
forceEraser = false;
CheckColorTheme(true);
UpdateBackgroundButtonsState();
}
private void BlackboardModeBtn_MouseUp(object sender, MouseButtonEventArgs e)
{
Settings.Canvas.UsingWhiteboard = false;
SaveSettingsToFile();
ICCWaterMarkWhite.Visibility = Visibility.Visible;
ICCWaterMarkDark.Visibility = Visibility.Collapsed;
Color defaultBlackboardColor = Color.FromRgb(22, 41, 36);
if (currentMode == 1)
{
GridBackgroundCover.Background = new SolidColorBrush(defaultBlackboardColor);
UpdateRGBSliders(defaultBlackboardColor);
CustomBackgroundColor = defaultBlackboardColor;
string colorHex = $"#{defaultBlackboardColor.R:X2}{defaultBlackboardColor.G:X2}{defaultBlackboardColor.B:X2}";
Settings.Canvas.CustomBackgroundColor = colorHex;
SaveSettingsToFile();
}
CheckLastColor(5);
forceEraser = false;
CheckColorTheme(true);
UpdateBackgroundButtonsState();
}
private void BackgroundRSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e)
{
if (BackgroundRValue != null)
{
BackgroundRValue.Text = ((int)e.NewValue).ToString();
UpdateColorPreviewFromSliders();
}
}
private void BackgroundGSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e)
{
if (BackgroundGValue != null)
{
BackgroundGValue.Text = ((int)e.NewValue).ToString();
UpdateColorPreviewFromSliders();
}
}
private void BackgroundBSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e)
{
if (BackgroundBValue != null)
{
BackgroundBValue.Text = ((int)e.NewValue).ToString();
UpdateColorPreviewFromSliders();
}
}
private void ApplyBackgroundColorBtn_Click(object sender, RoutedEventArgs e)
{
Color selectedColor = Color.FromRgb(
(byte)BackgroundRSlider.Value,
(byte)BackgroundGSlider.Value,
(byte)BackgroundBSlider.Value
);
ApplyCustomBackgroundColor(selectedColor);
}
private void UpdateColorPreviewFromSliders()
{
if (BackgroundColorPreview != null)
{
Color previewColor = Color.FromRgb(
(byte)BackgroundRSlider.Value,
(byte)BackgroundGSlider.Value,
(byte)BackgroundBSlider.Value
);
BackgroundColorPreview.Background = new SolidColorBrush(previewColor);
}
}
private void UpdateBackgroundButtonsState()
{
if (WhiteboardModeBtn != null)
{
WhiteboardModeBtn.Background = Settings.Canvas.UsingWhiteboard ?
new SolidColorBrush(Color.FromRgb(0x25, 0x63, 0xeb)) :
new SolidColorBrush(Colors.LightGray);
if (WhiteboardModeBtn.Child is TextBlock whiteboardText)
{
whiteboardText.Foreground = Settings.Canvas.UsingWhiteboard ?
new SolidColorBrush(Colors.White) :
new SolidColorBrush(Colors.Black);
}
}
if (BlackboardModeBtn != null)
{
BlackboardModeBtn.Background = !Settings.Canvas.UsingWhiteboard ?
new SolidColorBrush(Color.FromRgb(0x25, 0x63, 0xeb)) :
new SolidColorBrush(Colors.LightGray);
if (BlackboardModeBtn.Child is TextBlock blackboardText)
{
blackboardText.Foreground = !Settings.Canvas.UsingWhiteboard ?
new SolidColorBrush(Colors.White) :
new SolidColorBrush(Colors.Black);
}
}
}
///
/// 当前自定义背景色
///
private Color? CustomBackgroundColor { get; set; }
///
/// 更新颜色预览框的颜色
///
private void UpdateColorPreview(Border colorPreview, Slider rSlider, Slider gSlider, Slider bSlider)
{
Color previewColor = Color.FromRgb(
(byte)rSlider.Value,
(byte)gSlider.Value,
(byte)bSlider.Value
);
colorPreview.Background = new SolidColorBrush(previewColor);
}
///
/// 应用自定义背景颜色
///
private void ApplyCustomBackgroundColor(Color color)
{
// 保存当前选择的颜色
CustomBackgroundColor = color;
// 将颜色转换为十六进制字符串并保存到设置中
string colorHex = $"#{color.R:X2}{color.G:X2}{color.B:X2}";
Settings.Canvas.CustomBackgroundColor = colorHex;
// 只在白板或黑板模式下应用自定义背景色
if (currentMode == 1) // 白板或黑板模式
{
// 设置白板/黑板模式下的背景
GridBackgroundCover.Background = new SolidColorBrush(color);
}
// 保存设置
SaveSettingsToFile();
// 立即更新界面
if (BackgroundPalette != null)
{
UpdateBackgroundButtonsState();
UpdateRGBSliders(color); // 更新RGB滑块的值
}
// 显示提示信息
ShowNotification($"已应用自定义背景色: {colorHex}");
}
///
/// 从设置中加载自定义背景色
///
private void LoadCustomBackgroundColor()
{
if (!string.IsNullOrEmpty(Settings.Canvas.CustomBackgroundColor))
{
try
{
// 解析颜色字符串
string colorHex = Settings.Canvas.CustomBackgroundColor;
if (colorHex.StartsWith("#") && colorHex.Length == 7) // #RRGGBB 格式
{
byte r = Convert.ToByte(colorHex.Substring(1, 2), 16);
byte g = Convert.ToByte(colorHex.Substring(3, 2), 16);
byte b = Convert.ToByte(colorHex.Substring(5, 2), 16);
// 保存到内存中
CustomBackgroundColor = Color.FromRgb(r, g, b);
}
}
catch (Exception ex)
{
// 解析失败,根据当前模式设置默认颜色
if (!Settings.Canvas.UsingWhiteboard)
{
// 黑板模式默认颜色
CustomBackgroundColor = Color.FromRgb(22, 41, 36);
}
else
{
// 白板模式默认颜色
CustomBackgroundColor = Color.FromRgb(234, 235, 237);
}
// 可以在这里记录日志
Console.WriteLine($"解析自定义背景色失败: {ex.Message}");
}
}
else
{
// 如果没有设置自定义背景色,根据当前模式设置默认颜色
if (!Settings.Canvas.UsingWhiteboard)
{
// 黑板模式默认颜色
CustomBackgroundColor = Color.FromRgb(22, 41, 36);
}
else
{
// 白板模式默认颜色
CustomBackgroundColor = Color.FromRgb(234, 235, 237);
}
}
// 只在白板或黑板模式下应用自定义背景色
if (currentMode == 1 && CustomBackgroundColor.HasValue) // 白板或黑板模式
{
// 设置白板/黑板模式下的背景
GridBackgroundCover.Background = new SolidColorBrush(CustomBackgroundColor.Value);
// 更新RGB滑块的值(如果调色板已经创建)
if (BackgroundPalette != null && BackgroundPalette.Visibility == Visibility.Visible)
{
UpdateRGBSliders(CustomBackgroundColor.Value);
}
}
}
///
/// 处理套索工具图标点击事件,切换到选择模式
///
/// 事件发送者
/// 事件参数
///
/// - 禁用橡皮擦模式
/// - 禁用形状绘制模式
/// - 设置当前工具模式为选择模式
/// - 根据编辑模式设置光标
///
private void BoardLassoIcon_Click(object sender, RoutedEventArgs e)
{
forceEraser = false;
forcePointEraser = false;
drawingShapeMode = 0;
// 使用集中化的工具模式切换方法
SetCurrentToolMode(InkCanvasEditingMode.Select);
SetCursorBasedOnEditingMode(inkCanvas);
}
///
/// 处理橡皮擦图标点击事件,切换到按笔画擦除模式
///
/// 事件发送者
/// 事件参数
///
/// - 禁用高级橡皮擦系统
/// - 启用橡皮擦模式
/// - 设置橡皮擦形状为圆形
/// - 设置当前工具模式为按笔画擦除
/// 处理删除图标点击事件,清空画布内容
///
/// 事件发送者
/// 事件参数
///
/// - 调用钢笔图标点击事件
/// - 调用符号删除鼠标抬起事件
/// - 根据设置决定是否清空图片
/// - 如果设置为清空图片,则清空所有子元素
/// - 否则,保存非笔画元素并在清空后恢复
///
private void BoardSymbolIconDelete_MouseUp(object sender, RoutedEventArgs e)
{
PenIcon_Click(null, null);
SymbolIconDelete_MouseUp(null, null);
// 根据设置决定是否清空图片
if (Settings.Canvas.ClearCanvasAlsoClearImages)
{
// 如果设置为清空图片,则直接清空所有子元素
Debug.WriteLine("BoardSymbolIconDelete: Clearing all children including images");
inkCanvas.Children.Clear();
}
else
{
// 保存非笔画元素(如图片)
Debug.WriteLine("BoardSymbolIconDelete: Preserving non-stroke elements (images)");
var preservedElements = PreserveNonStrokeElements();
Debug.WriteLine($"BoardSymbolIconDelete: Preserved elements count: {preservedElements.Count}");
inkCanvas.Children.Clear();
// 恢复非笔画元素
RestoreNonStrokeElements(preservedElements);
Debug.WriteLine($"BoardSymbolIconDelete: inkCanvas.Children.Count after restore: {inkCanvas.Children.Count}");
}
}
///
/// 处理删除墨迹和历史记录图标点击事件,清空画布内容和时间机器历史
///
/// 事件发送者
/// 事件参数
///
/// - 调用钢笔图标点击事件
/// - 调用符号删除鼠标抬起事件
/// - 根据设置决定是否清空时间机器历史
/// - 根据设置决定是否清空图片
/// - 如果设置为清空图片,则清空所有子元素
/// - 否则,保存非笔画元素并在清空后恢复
///
private void BoardSymbolIconDeleteInkAndHistories_MouseUp(object sender, RoutedEventArgs e)
{
PenIcon_Click(null, null);
SymbolIconDelete_MouseUp(null, null);
if (!Settings.Canvas.ClearCanvasAndClearTimeMachine) timeMachine.ClearStrokeHistory();
// 根据设置决定是否清空图片
if (Settings.Canvas.ClearCanvasAlsoClearImages)
{
// 如果设置为清空图片,则直接清空所有子元素
Debug.WriteLine("BoardSymbolIconDeleteInkAndHistories: Clearing all children including images");
inkCanvas.Children.Clear();
}
else
{
// 保存非笔画元素(如图片)
Debug.WriteLine("BoardSymbolIconDeleteInkAndHistories: Preserving non-stroke elements (images)");
var preservedElements = PreserveNonStrokeElements();
Debug.WriteLine($"BoardSymbolIconDeleteInkAndHistories: Preserved elements count: {preservedElements.Count}");
inkCanvas.Children.Clear();
// 恢复非笔画元素
RestoreNonStrokeElements(preservedElements);
Debug.WriteLine($"BoardSymbolIconDeleteInkAndHistories: inkCanvas.Children.Count after restore: {inkCanvas.Children.Count}");
}
}
///
/// 处理启动希沃视频展台图标点击事件
///
/// 事件发送者
/// 事件参数
///
/// - 调用图片黑板鼠标抬起事件
/// - 启动希沃视频展台软件
///
private void BoardLaunchEasiCamera_MouseUp(object sender, MouseButtonEventArgs e)
{
ImageBlackboard_MouseUp(null, null);
SoftwareLauncher.LaunchEasiCamera("希沃视频展台");
}
///
/// 处理启动Desmos计算器图标点击事件
///
/// 事件发送者
/// 事件参数
///
/// - 立即隐藏所有子面板
/// - 调用图片黑板鼠标抬起事件
/// - 打开Desmos计算器网页
///
private void BoardLaunchDesmos_MouseUp(object sender, MouseButtonEventArgs e)
{
HideSubPanelsImmediately();
ImageBlackboard_MouseUp(null, null);
Process.Start("https://www.desmos.com/calculator?lang=zh-CN");
}
///
/// 根据当前背景颜色更新RGB滑块的值
///
private void UpdateRGBSliders(Color color)
{
if (BackgroundRSlider != null) BackgroundRSlider.Value = color.R;
if (BackgroundGSlider != null) BackgroundGSlider.Value = color.G;
if (BackgroundBSlider != null) BackgroundBSlider.Value = color.B;
}
}
}