[update] 修复部分bug,完善调色盘V2代码,添加了设置页面的滚动动画

This commit is contained in:
Dubi906w 2024-07-29 21:48:20 +08:00
parent 12ec3d7874
commit 20a2f21e0b
11 changed files with 473 additions and 162 deletions

View File

@ -3445,10 +3445,7 @@
<Grid> <Grid>
<Canvas Name="FloatingbarSelectionBGCanvas" Margin="2,0,2,0"> <Canvas Name="FloatingbarSelectionBGCanvas" Margin="2,0,2,0">
<Border Name="FloatingbarSelectionBG" Visibility="Hidden" Width="{Binding ElementName=Cursor_Icon, Path=Width}" Height="34" <Border Name="FloatingbarSelectionBG" Visibility="Hidden" Width="{Binding ElementName=Cursor_Icon, Path=Width}" Height="34"
Canvas.Left="28" Margin="0,-2,0,-2" Background="#153b82f6"> Canvas.Left="28" Margin="0,-2,0,-2" Background="#2563eb"/>
<Border VerticalAlignment="Bottom" HorizontalAlignment="Center" Width="12" Height="2"
CornerRadius="1,1,0,0" Background="#2563eb" />
</Border>
</Canvas> </Canvas>
<ui:SimpleStackPanel Margin="2,0" Name="StackPanelFloatingBar" Orientation="Horizontal"> <ui:SimpleStackPanel Margin="2,0" Name="StackPanelFloatingBar" Orientation="Horizontal">
<!--<ui:SimpleStackPanel Name="Cursor_Icon" MouseDown="Border_MouseDown" MouseUp="CursorIcon_Click"--> <!--<ui:SimpleStackPanel Name="Cursor_Icon" MouseDown="Border_MouseDown" MouseUp="CursorIcon_Click"-->
@ -4339,7 +4336,7 @@
</DrawingImage> </DrawingImage>
</Image.Source> </Image.Source>
</Image> </Image>
<TextBlock x:Name="CircleEraserToolbarTextBlock" Text="面积擦" Foreground="Black" <TextBlock x:Name="CircleEraserToolbarTextBlock" Text="擦" Foreground="Black"
FontSize="8" Margin="0,1,0,0" TextAlignment="Center" Visibility="{Binding ElementName=FloatingBarTextVisibilityBindingLikeAPieceOfShit, Path=Visibility}" /> FontSize="8" Margin="0,1,0,0" TextAlignment="Center" Visibility="{Binding ElementName=FloatingBarTextVisibilityBindingLikeAPieceOfShit, Path=Visibility}" />
</ui:SimpleStackPanel> </ui:SimpleStackPanel>
<ui:SimpleStackPanel Name="SymbolIconSelect" <ui:SimpleStackPanel Name="SymbolIconSelect"
@ -4361,7 +4358,7 @@
</DrawingImage> </DrawingImage>
</Image.Source> </Image.Source>
</Image> </Image>
<TextBlock x:Name="LassoToolToolbarTextBlock" Text="套选" Foreground="Black" Visibility="{Binding ElementName=FloatingBarTextVisibilityBindingLikeAPieceOfShit, Path=Visibility}" <TextBlock x:Name="LassoToolToolbarTextBlock" Text="套选" Foreground="Black" Visibility="{Binding ElementName=FloatingBarTextVisibilityBindingLikeAPieceOfShit, Path=Visibility}"
FontSize="8" Margin="0,1,0,0" TextAlignment="Center" /> FontSize="8" Margin="0,1,0,0" TextAlignment="Center" />
</ui:SimpleStackPanel> </ui:SimpleStackPanel>
<ui:SimpleStackPanel <ui:SimpleStackPanel
@ -5566,7 +5563,7 @@
<Grid> <Grid>
<ui:ScrollViewerEx Margin="0,80,12,0" VerticalScrollBarVisibility="Hidden" <ui:ScrollViewerEx Margin="0,80,12,0" VerticalScrollBarVisibility="Hidden"
PanningMode="VerticalOnly" ui:ThemeManager.RequestedTheme="Dark" PanningMode="VerticalOnly" ui:ThemeManager.RequestedTheme="Dark"
ManipulationBoundaryFeedback="SCManipulationBoundaryFeedback" ManipulationBoundaryFeedback="SCManipulationBoundaryFeedback" PreviewMouseWheel="SettingsPaneScrollViewer_PreviewMouseWheel"
Name="SettingsPanelScrollViewer" ScrollChanged="SettingsPane_ScrollChanged"> Name="SettingsPanelScrollViewer" ScrollChanged="SettingsPane_ScrollChanged">
<StackPanel Margin="70,20,20,20"> <StackPanel Margin="70,20,20,20">
<Border Margin="0,0,0,10" Height="100" CornerRadius="5" BorderBrush="#a1a1aa" <Border Margin="0,0,0,10" Height="100" CornerRadius="5" BorderBrush="#a1a1aa"

View File

@ -77,7 +77,7 @@ namespace Ink_Canvas {
if (currentMode != 0) CloseWhiteboardImmediately(); if (currentMode != 0) CloseWhiteboardImmediately();
if (StackPanelCanvasControls.Visibility == Visibility.Visible) if (StackPanelCanvasControls.Visibility == Visibility.Visible)
if (foldFloatingBarByUser && inkCanvas.Strokes.Count > 2) if (foldFloatingBarByUser && inkCanvas.Strokes.Count > 2)
ShowNotification("正在清空墨迹并收纳至侧边栏,可进入批注模式后通过【撤销】功能来恢复原先墨迹。"); ShowNewToast("正在清空墨迹并收纳至屏幕两边,可进入批注模式后通过 “撤销” 功能来恢复原先墨迹。",MW_Toast.ToastType.Informative, 3000);
CursorWithDelIcon_Click(null, null); CursorWithDelIcon_Click(null, null);
RectangleSelectionHitTestBorder.Visibility = Visibility.Collapsed; RectangleSelectionHitTestBorder.Visibility = Visibility.Collapsed;
}); });

View File

@ -563,6 +563,15 @@ namespace Ink_Canvas {
CircleEraserIconGeometry, CircleEraserIconGeometry,
LassoSelectIconGeometry LassoSelectIconGeometry
}; };
TextBlock[] iconTextBlocksFloatingBar = new TextBlock[] {
SelectionToolBarTextBlock,
PenToolbarTextBlock,
InkEraserToolbarTextBlock,
CircleEraserToolbarTextBlock,
LassoToolToolbarTextBlock
};
string[] iconGeometryPathStringsFloatingBar = new string[] { string[] iconGeometryPathStringsFloatingBar = new string[] {
XamlGraphicsIconGeometries.LinedCursorIcon, XamlGraphicsIconGeometries.LinedCursorIcon,
XamlGraphicsIconGeometries.LinedPenIcon, XamlGraphicsIconGeometries.LinedPenIcon,
@ -592,6 +601,10 @@ namespace Ink_Canvas {
BoardEraserLabel BoardEraserLabel
}; };
foreach (var tb in iconTextBlocksFloatingBar) {
tb.Foreground = new SolidColorBrush(Colors.Black);
}
foreach (var gd in iconGeometryDrawingsFloatingBar) { foreach (var gd in iconGeometryDrawingsFloatingBar) {
gd.Brush = new SolidColorBrush(Color.FromRgb(27, 27, 27)); gd.Brush = new SolidColorBrush(Color.FromRgb(27, 27, 27));
gd.Geometry = Geometry.Parse(iconGeometryPathStringsFloatingBar[Array.IndexOf(iconGeometryDrawingsFloatingBar, gd)]); gd.Geometry = Geometry.Parse(iconGeometryPathStringsFloatingBar[Array.IndexOf(iconGeometryDrawingsFloatingBar, gd)]);
@ -613,7 +626,8 @@ namespace Ink_Canvas {
if (mode != ICCToolsEnum.CursorMode) { if (mode != ICCToolsEnum.CursorMode) {
// floating bar // floating bar
var ngdf = iconGeometryDrawingsFloatingBar[(int)mode]; var ngdf = iconGeometryDrawingsFloatingBar[(int)mode];
ngdf.Brush = new SolidColorBrush(Color.FromRgb(30, 58, 138)); ngdf.Brush = new SolidColorBrush(Colors.White);
iconTextBlocksFloatingBar[(int)mode].Foreground = new SolidColorBrush(Colors.White);
ngdf.Geometry = Geometry.Parse(iconGeometryPathStringsFloatingBar[(int)mode+5]); ngdf.Geometry = Geometry.Parse(iconGeometryPathStringsFloatingBar[(int)mode+5]);
FloatingbarSelectionBG.Visibility = Visibility.Visible; FloatingbarSelectionBG.Visibility = Visibility.Visible;
var iconPosI = (int)mode == 1 ? highlightStepWidth : var iconPosI = (int)mode == 1 ? highlightStepWidth :

View File

@ -22,5 +22,14 @@ namespace Ink_Canvas
notification.ShowAnimatedWithAutoDispose(3000 + notice.Length * 10); notification.ShowAnimatedWithAutoDispose(3000 + notice.Length * 10);
return notification; return notification;
} }
public MW_Toast ShowNewToast(string notice, MW_Toast.ToastType type, int autoCloseMs) {
var notification = new MW_Toast(type, notice, (self) => {
GridNotifications.Children.Remove(self);
});
GridNotifications.Children.Add(notification);
notification.ShowAnimatedWithAutoDispose(autoCloseMs + notice.Length * 10);
return notification;
}
} }
} }

View File

@ -35,10 +35,10 @@ namespace Ink_Canvas {
savePathWithName = savePath + @"\" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss-fff") + ".icstk"; savePathWithName = savePath + @"\" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss-fff") + ".icstk";
var fs = new FileStream(savePathWithName, FileMode.Create); var fs = new FileStream(savePathWithName, FileMode.Create);
inkCanvas.Strokes.Save(fs); inkCanvas.Strokes.Save(fs);
if (newNotice) ShowNotification("墨迹成功保存至 " + savePathWithName); if (newNotice) ShowNewToast("墨迹成功保存至 " + savePathWithName, MW_Toast.ToastType.Success, 2500);
} }
catch (Exception ex) { catch (Exception ex) {
ShowNotification("墨迹保存失败"); ShowNewToast("墨迹保存失败", MW_Toast.ToastType.Error, 3000);
LogHelper.WriteLogToFile("墨迹保存失败 | " + ex.ToString(), LogHelper.LogType.Error); LogHelper.WriteLogToFile("墨迹保存失败 | " + ex.ToString(), LogHelper.LogType.Error);
} }
} }
@ -81,7 +81,7 @@ namespace Ink_Canvas {
if (inkCanvas.Visibility != Visibility.Visible) SymbolIconCursor_Click(sender, null); if (inkCanvas.Visibility != Visibility.Visible) SymbolIconCursor_Click(sender, null);
} }
catch { catch {
ShowNotification("墨迹打开失败"); ShowNewToast("墨迹打开失败", MW_Toast.ToastType.Error, 3000);
} }
} }
} }

View File

@ -29,7 +29,7 @@ namespace Ink_Canvas
} }
if (!isHideNotification) if (!isHideNotification)
{ {
ShowNotification("截图成功保存至 " + savePath); ShowNewToast("截图成功保存至 " + savePath, MW_Toast.ToastType.Success, 3000);
} }
} }
@ -38,7 +38,7 @@ namespace Ink_Canvas
var bitmap = GetScreenshotBitmap(); var bitmap = GetScreenshotBitmap();
string savePath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); string savePath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
bitmap.Save(savePath + @"\" + DateTime.Now.ToString("u").Replace(':', '-') + ".png", ImageFormat.Png); bitmap.Save(savePath + @"\" + DateTime.Now.ToString("u").Replace(':', '-') + ".png", ImageFormat.Png);
ShowNotification("截图成功保存至【桌面" + @"\" + DateTime.Now.ToString("u").Replace(':', '-') + ".png】"); ShowNewToast("截图成功保存至【桌面" + @"\" + DateTime.Now.ToString("u").Replace(':', '-') + ".png】", MW_Toast.ToastType.Success, 3000);
if (Settings.Automation.IsAutoSaveStrokesAtScreenshot) SaveInkCanvasStrokes(false, false); if (Settings.Automation.IsAutoSaveStrokesAtScreenshot) SaveInkCanvasStrokes(false, false);
} }

View File

@ -20,6 +20,8 @@ using System.Security.Principal;
using System.IO; using System.IO;
using System.Reflection; using System.Reflection;
using System.Threading; using System.Threading;
using System.Timers;
using Ink_Canvas.Popups;
using Ookii.Dialogs.Wpf; using Ookii.Dialogs.Wpf;
namespace Ink_Canvas { namespace Ink_Canvas {
@ -1644,7 +1646,7 @@ namespace Ink_Canvas {
} }
catch { } catch { }
ShowNotification("设置已重置为默认推荐设置~"); ShowNewToast("设置已重置为默认推荐设置~", MW_Toast.ToastType.Success, 2500);
} }
private async void SpecialVersionResetToSuggestion_Click() { private async void SpecialVersionResetToSuggestion_Click() {
@ -1859,6 +1861,26 @@ namespace Ink_Canvas {
UpdateSettingsPaneCustomScrollBarStatus(); UpdateSettingsPaneCustomScrollBarStatus();
} }
public void SettingsPaneScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e) {
var scrollViewer = (ScrollViewer)sender;
var sb = new Storyboard();
var ofs = scrollViewer.VerticalOffset;
var animation = new DoubleAnimation
{
From = ofs,
To = ofs - e.Delta * 2.5,
Duration = TimeSpan.FromMilliseconds(155)
};
animation.EasingFunction = new CubicEase() {
EasingMode = EasingMode.EaseOut,
};
Storyboard.SetTargetProperty(animation, new PropertyPath(ColorPalette.ScrollViewerBehavior.VerticalOffsetProperty));
Storyboard.SetTargetName(animation,"SettingsPanelScrollViewer");
sb.Children.Add(animation);
scrollViewer.ScrollToVerticalOffset(ofs);
sb.Begin(scrollViewer);
}
public void UpdateSettingsPaneCustomScrollBarStatus() { public void UpdateSettingsPaneCustomScrollBarStatus() {
var scrollPercentage = SettingsPanelScrollViewer.VerticalOffset / var scrollPercentage = SettingsPanelScrollViewer.VerticalOffset /
(SettingsPanelScrollViewer.ExtentHeight - SettingsPanelScrollViewer.ActualHeight); (SettingsPanelScrollViewer.ExtentHeight - SettingsPanelScrollViewer.ActualHeight);
@ -1985,73 +2007,92 @@ namespace Ink_Canvas {
} }
} }
private void SettingsPaneScrollViewer_ScrollToAnimated(double offset) {
var sb = new Storyboard();
var ofs = SettingsPanelScrollViewer.VerticalOffset;
var animation = new DoubleAnimation
{
From = ofs,
To = offset,
Duration = TimeSpan.FromMilliseconds(155)
};
animation.EasingFunction = new CubicEase() {
EasingMode = EasingMode.EaseOut,
};
Storyboard.SetTargetProperty(animation, new PropertyPath(ColorPalette.ScrollViewerBehavior.VerticalOffsetProperty));
Storyboard.SetTargetName(animation,"SettingsPanelScrollViewer");
sb.Children.Add(animation);
SettingsPanelScrollViewer.ScrollToVerticalOffset(ofs);
sb.Begin(SettingsPanelScrollViewer);
}
public void SettingsStartupJumpToGroupBox(object sender, MouseButtonEventArgs e) { public void SettingsStartupJumpToGroupBox(object sender, MouseButtonEventArgs e) {
var transform = SettingsStartupGroupBox.TransformToVisual(SettingsPanelScrollViewer); var transform = SettingsStartupGroupBox.TransformToVisual(SettingsPanelScrollViewer);
var position = transform.Transform(new Point(0, 0)); var position = transform.Transform(new Point(0, 0));
SettingsPanelScrollViewer.ScrollToVerticalOffset(SettingsPanelScrollViewer.VerticalOffset + position.Y - 10); SettingsPaneScrollViewer_ScrollToAnimated(SettingsPanelScrollViewer.VerticalOffset + position.Y - 10);
} }
public void SettingsCanvasJumpToGroupBox(object sender, MouseButtonEventArgs e) public void SettingsCanvasJumpToGroupBox(object sender, MouseButtonEventArgs e)
{ {
var transform = SettingsCanvasGroupBox.TransformToVisual(SettingsPanelScrollViewer); var transform = SettingsCanvasGroupBox.TransformToVisual(SettingsPanelScrollViewer);
var position = transform.Transform(new Point(0, 0)); var position = transform.Transform(new Point(0, 0));
SettingsPanelScrollViewer.ScrollToVerticalOffset(SettingsPanelScrollViewer.VerticalOffset + position.Y - 10); SettingsPaneScrollViewer_ScrollToAnimated(SettingsPanelScrollViewer.VerticalOffset + position.Y - 10);
} }
public void SettingsGestureJumpToGroupBox(object sender, MouseButtonEventArgs e) public void SettingsGestureJumpToGroupBox(object sender, MouseButtonEventArgs e)
{ {
var transform = SettingsGestureGroupBox.TransformToVisual(SettingsPanelScrollViewer); var transform = SettingsGestureGroupBox.TransformToVisual(SettingsPanelScrollViewer);
var position = transform.Transform(new Point(0, 0)); var position = transform.Transform(new Point(0, 0));
SettingsPanelScrollViewer.ScrollToVerticalOffset(SettingsPanelScrollViewer.VerticalOffset + position.Y - 10); SettingsPaneScrollViewer_ScrollToAnimated(SettingsPanelScrollViewer.VerticalOffset + position.Y - 10);
} }
public void SettingsInkRecognitionJumpToGroupBox(object sender, MouseButtonEventArgs e) public void SettingsInkRecognitionJumpToGroupBox(object sender, MouseButtonEventArgs e)
{ {
var transform = SettingsInkRecognitionGroupBox.TransformToVisual(SettingsPanelScrollViewer); var transform = SettingsInkRecognitionGroupBox.TransformToVisual(SettingsPanelScrollViewer);
var position = transform.Transform(new Point(0, 0)); var position = transform.Transform(new Point(0, 0));
SettingsPanelScrollViewer.ScrollToVerticalOffset(SettingsPanelScrollViewer.VerticalOffset + position.Y - 10); SettingsPaneScrollViewer_ScrollToAnimated(SettingsPanelScrollViewer.VerticalOffset + position.Y - 10);
} }
public void SettingsAppearanceJumpToGroupBox(object sender, MouseButtonEventArgs e) public void SettingsAppearanceJumpToGroupBox(object sender, MouseButtonEventArgs e)
{ {
var transform = SettingsAppearanceGroupBox.TransformToVisual(SettingsPanelScrollViewer); var transform = SettingsAppearanceGroupBox.TransformToVisual(SettingsPanelScrollViewer);
var position = transform.Transform(new Point(0, 0)); var position = transform.Transform(new Point(0, 0));
SettingsPanelScrollViewer.ScrollToVerticalOffset(SettingsPanelScrollViewer.VerticalOffset + position.Y - 10); SettingsPaneScrollViewer_ScrollToAnimated(SettingsPanelScrollViewer.VerticalOffset + position.Y - 10);
} }
public void SettingsPPTJumpToGroupBox(object sender, MouseButtonEventArgs e) public void SettingsPPTJumpToGroupBox(object sender, MouseButtonEventArgs e)
{ {
var transform = SettingsPPTGroupBox.TransformToVisual(SettingsPanelScrollViewer); var transform = SettingsPPTGroupBox.TransformToVisual(SettingsPanelScrollViewer);
var position = transform.Transform(new Point(0, 0)); var position = transform.Transform(new Point(0, 0));
SettingsPanelScrollViewer.ScrollToVerticalOffset(SettingsPanelScrollViewer.VerticalOffset + position.Y - 10); SettingsPaneScrollViewer_ScrollToAnimated(SettingsPanelScrollViewer.VerticalOffset + position.Y - 10);
} }
public void SettingsAdvancedJumpToGroupBox(object sender, MouseButtonEventArgs e) public void SettingsAdvancedJumpToGroupBox(object sender, MouseButtonEventArgs e)
{ {
var transform = SettingsAdvancedGroupBox.TransformToVisual(SettingsPanelScrollViewer); var transform = SettingsAdvancedGroupBox.TransformToVisual(SettingsPanelScrollViewer);
var position = transform.Transform(new Point(0, 0)); var position = transform.Transform(new Point(0, 0));
SettingsPanelScrollViewer.ScrollToVerticalOffset(SettingsPanelScrollViewer.VerticalOffset + position.Y - 10); SettingsPaneScrollViewer_ScrollToAnimated(SettingsPanelScrollViewer.VerticalOffset + position.Y - 10);
} }
public void SettingsAutomationJumpToGroupBox(object sender, MouseButtonEventArgs e) public void SettingsAutomationJumpToGroupBox(object sender, MouseButtonEventArgs e)
{ {
var transform = SettingsAutomationGroupBox.TransformToVisual(SettingsPanelScrollViewer); var transform = SettingsAutomationGroupBox.TransformToVisual(SettingsPanelScrollViewer);
var position = transform.Transform(new Point(0, 0)); var position = transform.Transform(new Point(0, 0));
SettingsPanelScrollViewer.ScrollToVerticalOffset(SettingsPanelScrollViewer.VerticalOffset + position.Y - 10); SettingsPaneScrollViewer_ScrollToAnimated(SettingsPanelScrollViewer.VerticalOffset + position.Y - 10);
} }
public void SettingsRandWindowJumpToGroupBox(object sender, MouseButtonEventArgs e) public void SettingsRandWindowJumpToGroupBox(object sender, MouseButtonEventArgs e)
{ {
var transform = SettingsRandWindowGroupBox.TransformToVisual(SettingsPanelScrollViewer); var transform = SettingsRandWindowGroupBox.TransformToVisual(SettingsPanelScrollViewer);
var position = transform.Transform(new Point(0, 0)); var position = transform.Transform(new Point(0, 0));
SettingsPanelScrollViewer.ScrollToVerticalOffset(SettingsPanelScrollViewer.VerticalOffset + position.Y - 10); SettingsPaneScrollViewer_ScrollToAnimated(SettingsPanelScrollViewer.VerticalOffset + position.Y - 10);
} }
public void SettingsAboutJumpToGroupBox(object sender, MouseButtonEventArgs e) public void SettingsAboutJumpToGroupBox(object sender, MouseButtonEventArgs e)
{ {
var transform = SettingsAboutGroupBox.TransformToVisual(SettingsPanelScrollViewer); var transform = SettingsAboutGroupBox.TransformToVisual(SettingsPanelScrollViewer);
var position = transform.Transform(new Point(0, 0)); var position = transform.Transform(new Point(0, 0));
SettingsPanelScrollViewer.ScrollToVerticalOffset(SettingsPanelScrollViewer.VerticalOffset + position.Y - 10); SettingsPaneScrollViewer_ScrollToAnimated(SettingsPanelScrollViewer.VerticalOffset + position.Y - 10);
} }
#endregion #endregion

View File

@ -1,12 +1,16 @@
using Ink_Canvas.Helpers; using Ink_Canvas.Helpers;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Threading;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Ink; using System.Windows.Ink;
using System.Windows.Input; using System.Windows.Input;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Shapes;
using System.Windows.Threading;
using Point = System.Windows.Point; using Point = System.Windows.Point;
namespace Ink_Canvas { namespace Ink_Canvas {
@ -24,14 +28,15 @@ namespace Ink_Canvas {
try { try {
newStrokes.Add(e.Stroke); newStrokes.Add(e.Stroke);
if (newStrokes.Count > 4) newStrokes.RemoveAt(0); if (newStrokes.Count > 4) newStrokes.RemoveAt(0);
for (var i = 0; i < newStrokes.Count; i++) Dispatcher.InvokeAsync(() => {
if (!inkCanvas.Strokes.Contains(newStrokes[i])) for (var i = 0; i < newStrokes.Count; i++)
newStrokes.RemoveAt(i--); if (!inkCanvas.Strokes.Contains(newStrokes[i]))
newStrokes.RemoveAt(i--);
for (var 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 strokeReco = new StrokeCollection();
var result = InkRecognizeHelper.RecognizeShape(newStrokes); var result = InkRecognizeHelper.RecognizeShape(newStrokes);
for (var i = newStrokes.Count - 1; i >= 0; i--) { for (var i = newStrokes.Count - 1; i >= 0; i--) {
@ -42,18 +47,17 @@ namespace Ink_Canvas {
result = newResult; result = newResult;
break; break;
} }
//Label.Visibility = Visibility.Visible;
//Label.Content = circles.Count.ToString() + "\n" + newResult.InkDrawingNode.GetShapeName();
} }
if (result.InkDrawingNode.GetShapeName() == "Circle" && if (result.InkDrawingNode.GetShapeName() == "Circle" &&
Settings.InkToShape.IsInkToShapeRounded == true) { Settings.InkToShape.IsInkToShapeRounded == true) {
var shape = result.InkDrawingNode.GetShape(); var shapeWidth = Dispatcher.Invoke(()=>result.InkDrawingNode.GetShape().Width);
if (shape.Width > 75) { var shapeHeight = Dispatcher.Invoke(()=>result.InkDrawingNode.GetShape().Height);
if (shapeWidth > 75) {
foreach (var circle in circles) foreach (var circle in circles)
//判断是否画同心圆 //判断是否画同心圆
if (Math.Abs(result.Centroid.X - circle.Centroid.X) / shape.Width < 0.12 && if (Math.Abs(result.Centroid.X - circle.Centroid.X) / shapeWidth < 0.12 &&
Math.Abs(result.Centroid.Y - circle.Centroid.Y) / shape.Width < 0.12) { Math.Abs(result.Centroid.Y - circle.Centroid.Y) / shapeWidth < 0.12) {
result.Centroid = circle.Centroid; result.Centroid = circle.Centroid;
break; break;
} }
@ -64,8 +68,8 @@ namespace Ink_Canvas {
(result.Centroid.Y - circle.Centroid.Y); (result.Centroid.Y - circle.Centroid.Y);
d = Math.Sqrt(d); d = Math.Sqrt(d);
//判断是否画外切圆 //判断是否画外切圆
var x = shape.Width / 2.0 + circle.R - d; var x = shapeWidth / 2.0 + circle.R - d;
if (Math.Abs(x) / shape.Width < 0.1) { if (Math.Abs(x) / shapeWidth < 0.1) {
var sinTheta = (result.Centroid.Y - circle.Centroid.Y) / d; var sinTheta = (result.Centroid.Y - circle.Centroid.Y) / d;
var cosTheta = (result.Centroid.X - circle.Centroid.X) / d; var cosTheta = (result.Centroid.X - circle.Centroid.X) / d;
var newX = result.Centroid.X + x * cosTheta; var newX = result.Centroid.X + x * cosTheta;
@ -74,8 +78,8 @@ namespace Ink_Canvas {
} }
//判断是否画外切圆 //判断是否画外切圆
x = Math.Abs(circle.R - shape.Width / 2.0) - d; x = Math.Abs(circle.R - shapeWidth / 2.0) - d;
if (Math.Abs(x) / shape.Width < 0.1) { if (Math.Abs(x) / shapeWidth < 0.1) {
var sinTheta = (result.Centroid.Y - circle.Centroid.Y) / d; var sinTheta = (result.Centroid.Y - circle.Centroid.Y) / d;
var cosTheta = (result.Centroid.X - circle.Centroid.X) / d; var cosTheta = (result.Centroid.X - circle.Centroid.X) / d;
var newX = result.Centroid.X + x * cosTheta; var newX = result.Centroid.X + x * cosTheta;
@ -84,31 +88,37 @@ namespace Ink_Canvas {
} }
} }
var iniP = new Point(result.Centroid.X - shape.Width / 2, var iniP = new Point(result.Centroid.X - shapeWidth / 2,
result.Centroid.Y - shape.Height / 2); result.Centroid.Y - shapeHeight / 2);
var endP = new Point(result.Centroid.X + shape.Width / 2, var endP = new Point(result.Centroid.X + shapeWidth / 2,
result.Centroid.Y + shape.Height / 2); result.Centroid.Y + shapeHeight / 2);
var pointList = GenerateEllipseGeometry(iniP, endP); var pointList = GenerateEllipseGeometry(iniP, endP);
var point = new StylusPointCollection(pointList); var point = new StylusPointCollection(pointList);
var stroke = new Stroke(point) { var stroke = new Stroke(point) {
DrawingAttributes = inkCanvas.DefaultDrawingAttributes.Clone() DrawingAttributes = Dispatcher.Invoke(()=>inkCanvas.DefaultDrawingAttributes.Clone())
}; };
circles.Add(new Circle(result.Centroid, shape.Width / 2.0, stroke)); circles.Add(new Circle(result.Centroid, shapeWidth / 2.0, stroke));
SetNewBackupOfStroke(); Dispatcher.InvokeAsync(() => {
_currentCommitType = CommitReason.ShapeRecognition; SetNewBackupOfStroke();
inkCanvas.Strokes.Remove(result.InkDrawingNode.Strokes); _currentCommitType = CommitReason.ShapeRecognition;
inkCanvas.Strokes.Add(stroke); inkCanvas.Strokes.Remove(result.InkDrawingNode.Strokes);
inkCanvas.Strokes.Add(stroke);
});
_currentCommitType = CommitReason.UserInput; _currentCommitType = CommitReason.UserInput;
newStrokes = new StrokeCollection(); newStrokes = new StrokeCollection();
} }
} }
else if (result.InkDrawingNode.GetShapeName().Contains("Ellipse") && else if (result.InkDrawingNode.GetShapeName().Contains("Ellipse") &&
Settings.InkToShape.IsInkToShapeRounded == true) { Settings.InkToShape.IsInkToShapeRounded == true) {
var shape = result.InkDrawingNode.GetShape(); var shapeWidth = Dispatcher.Invoke(()=>result.InkDrawingNode.GetShape().Width);
//var shape1 = result.InkDrawingNode.GetShape(); var shapeHeight = Dispatcher.Invoke(()=>result.InkDrawingNode.GetShape().Height);
//shape1.Fill = Brushes.Gray; PointCollection p = new PointCollection();
//Canvas.Children.Add(shape1); Point[] _p = new Point[]{};
var p = result.InkDrawingNode.HotPoints; Dispatcher.Invoke(() => {
var arr = result.InkDrawingNode.HotPoints.ToArray();
_p = arr;
});
p = new PointCollection(_p);
var a = GetDistance(p[0], p[2]) / 2; //长半轴 var a = GetDistance(p[0], p[2]) / 2; //长半轴
var b = GetDistance(p[1], p[3]) / 2; //短半轴 var b = GetDistance(p[1], p[3]) / 2; //短半轴
if (a < b) { if (a < b) {
@ -120,25 +130,25 @@ namespace Ink_Canvas {
result.Centroid = new Point((p[0].X + p[2].X) / 2, (p[0].Y + p[2].Y) / 2); result.Centroid = new Point((p[0].X + p[2].X) / 2, (p[0].Y + p[2].Y) / 2);
var needRotation = true; var needRotation = true;
if (shape.Width > 75 || (shape.Height > 75 && p.Count == 4)) { if (shapeWidth > 75 || (shapeHeight > 75 && p.Count == 4)) {
var iniP = new Point(result.Centroid.X - shape.Width / 2, var iniP = new Point(result.Centroid.X - shapeWidth / 2,
result.Centroid.Y - shape.Height / 2); result.Centroid.Y - shapeHeight / 2);
var endP = new Point(result.Centroid.X + shape.Width / 2, var endP = new Point(result.Centroid.X + shapeWidth / 2,
result.Centroid.Y + shape.Height / 2); result.Centroid.Y + shapeHeight / 2);
foreach (var circle in circles) foreach (var circle in circles)
//判断是否画同心椭圆 //判断是否画同心椭圆
if (Math.Abs(result.Centroid.X - circle.Centroid.X) / a < 0.2 && 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; result.Centroid = circle.Centroid;
iniP = new Point(result.Centroid.X - shape.Width / 2, iniP = new Point(result.Centroid.X - shapeWidth / 2,
result.Centroid.Y - shape.Height / 2); result.Centroid.Y - shapeHeight / 2);
endP = new Point(result.Centroid.X + shape.Width / 2, endP = new Point(result.Centroid.X + shapeWidth / 2,
result.Centroid.Y + shape.Height / 2); result.Centroid.Y + shapeHeight / 2);
//再判断是否与圆相切 //再判断是否与圆相切
if (Math.Abs(a - circle.R) / a < 0.2) { if (Math.Abs(a - circle.R) / a < 0.2) {
if (shape.Width >= shape.Height) { if (shapeWidth >= shapeHeight) {
iniP.X = result.Centroid.X - circle.R; iniP.X = result.Centroid.X - circle.R;
endP.X = result.Centroid.X + circle.R; endP.X = result.Centroid.X + circle.R;
iniP.Y = result.Centroid.Y - b; iniP.Y = result.Centroid.Y - b;
@ -170,22 +180,27 @@ namespace Ink_Canvas {
SetNewBackupOfStroke(); SetNewBackupOfStroke();
_currentCommitType = CommitReason.ShapeRecognition; _currentCommitType = CommitReason.ShapeRecognition;
inkCanvas.Strokes.Remove(result.InkDrawingNode.Strokes); Dispatcher.InvokeAsync(() => {
inkCanvas.Strokes.Remove(result.InkDrawingNode.Strokes);
});
newStrokes = new StrokeCollection(); newStrokes = new StrokeCollection();
var _pointList = GenerateEllipseGeometry(iniP, endP, false, true); var _pointList = GenerateEllipseGeometry(iniP, endP, false, true);
var _point = new StylusPointCollection(_pointList); var _point = new StylusPointCollection(_pointList);
var _stroke = new Stroke(_point) { var _stroke = new Stroke(_point) {
DrawingAttributes = inkCanvas.DefaultDrawingAttributes.Clone() DrawingAttributes = Dispatcher.Invoke(()=>inkCanvas.DefaultDrawingAttributes.Clone())
}; };
var _dashedLineStroke = Dispatcher.InvokeAsync(() => {
GenerateDashedLineEllipseStrokeCollection(iniP, endP, true, false); var _dashedLineStroke =
var strokes = new StrokeCollection() { GenerateDashedLineEllipseStrokeCollection(iniP, endP, true,
_stroke, false);
_dashedLineStroke var strokes = new StrokeCollection() {
}; _stroke,
inkCanvas.Strokes.Add(strokes); _dashedLineStroke
_currentCommitType = CommitReason.UserInput; };
inkCanvas.Strokes.Add(strokes);
_currentCommitType = CommitReason.UserInput;
});
return; return;
} }
} }
@ -215,7 +230,7 @@ namespace Ink_Canvas {
var pointList = GenerateEllipseGeometry(iniP, endP); var pointList = GenerateEllipseGeometry(iniP, endP);
var point = new StylusPointCollection(pointList); var point = new StylusPointCollection(pointList);
var stroke = new Stroke(point) { var stroke = new Stroke(point) {
DrawingAttributes = inkCanvas.DefaultDrawingAttributes.Clone() DrawingAttributes = Dispatcher.Invoke(()=>inkCanvas.DefaultDrawingAttributes.Clone())
}; };
if (needRotation) { if (needRotation) {
@ -227,19 +242,26 @@ namespace Ink_Canvas {
stroke.Transform(m, false); stroke.Transform(m, false);
} }
SetNewBackupOfStroke(); Dispatcher.InvokeAsync(() => {
_currentCommitType = CommitReason.ShapeRecognition; SetNewBackupOfStroke();
inkCanvas.Strokes.Remove(result.InkDrawingNode.Strokes); _currentCommitType = CommitReason.ShapeRecognition;
inkCanvas.Strokes.Add(stroke); inkCanvas.Strokes.Remove(result.InkDrawingNode.Strokes);
_currentCommitType = CommitReason.UserInput; inkCanvas.Strokes.Add(stroke);
GridInkCanvasSelectionCover.Visibility = Visibility.Collapsed; _currentCommitType = CommitReason.UserInput;
newStrokes = new StrokeCollection(); GridInkCanvasSelectionCover.Visibility = Visibility.Collapsed;
newStrokes = new StrokeCollection();
});
} }
} }
else if (result.InkDrawingNode.GetShapeName().Contains("Triangle") && else if (result.InkDrawingNode.GetShapeName().Contains("Triangle") &&
Settings.InkToShape.IsInkToShapeTriangle == true) { Settings.InkToShape.IsInkToShapeTriangle == true) {
var shape = result.InkDrawingNode.GetShape(); PointCollection p = new PointCollection();
var p = result.InkDrawingNode.HotPoints; Point[] _p = new Point[]{};
Dispatcher.Invoke(() => {
var arr = result.InkDrawingNode.HotPoints.ToArray();
_p = arr;
});
p = new PointCollection(_p);
if ((Math.Max(Math.Max(p[0].X, p[1].X), p[2].X) - 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.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.Max(Math.Max(p[0].Y, p[1].Y), p[2].Y) -
@ -260,15 +282,18 @@ namespace Ink_Canvas {
//pointList.Add(p[0]); //pointList.Add(p[0]);
var point = new StylusPointCollection(pointList); var point = new StylusPointCollection(pointList);
var stroke = new Stroke(GenerateFakePressureTriangle(point)) { var stroke = new Stroke(GenerateFakePressureTriangle(point)) {
DrawingAttributes = inkCanvas.DefaultDrawingAttributes.Clone() DrawingAttributes = Dispatcher.Invoke(()=>inkCanvas.DefaultDrawingAttributes.Clone())
}; };
SetNewBackupOfStroke();
_currentCommitType = CommitReason.ShapeRecognition; Dispatcher.InvokeAsync(() => {
inkCanvas.Strokes.Remove(result.InkDrawingNode.Strokes); SetNewBackupOfStroke();
inkCanvas.Strokes.Add(stroke); _currentCommitType = CommitReason.ShapeRecognition;
_currentCommitType = CommitReason.UserInput; inkCanvas.Strokes.Remove(result.InkDrawingNode.Strokes);
GridInkCanvasSelectionCover.Visibility = Visibility.Collapsed; inkCanvas.Strokes.Add(stroke);
newStrokes = new StrokeCollection(); _currentCommitType = CommitReason.UserInput;
GridInkCanvasSelectionCover.Visibility = Visibility.Collapsed;
newStrokes = new StrokeCollection();
});
} }
} }
else if ((result.InkDrawingNode.GetShapeName().Contains("Rectangle") || else if ((result.InkDrawingNode.GetShapeName().Contains("Rectangle") ||
@ -277,8 +302,13 @@ namespace Ink_Canvas {
result.InkDrawingNode.GetShapeName().Contains("Square") || result.InkDrawingNode.GetShapeName().Contains("Square") ||
result.InkDrawingNode.GetShapeName().Contains("Trapezoid")) && result.InkDrawingNode.GetShapeName().Contains("Trapezoid")) &&
Settings.InkToShape.IsInkToShapeRectangle == true) { Settings.InkToShape.IsInkToShapeRectangle == true) {
var shape = result.InkDrawingNode.GetShape(); PointCollection p = new PointCollection();
var p = result.InkDrawingNode.HotPoints; Point[] _p = new Point[]{};
Dispatcher.Invoke(() => {
var arr = result.InkDrawingNode.HotPoints.ToArray();
_p = arr;
});
p = new PointCollection(_p);
if ((Math.Max(Math.Max(Math.Max(p[0].X, p[1].X), p[2].X), p[3].X) - 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.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.Max(Math.Max(Math.Max(p[0].Y, p[1].Y), p[2].Y), p[3].Y) -
@ -302,22 +332,27 @@ namespace Ink_Canvas {
pointList.Add(p[0]); pointList.Add(p[0]);
var point = new StylusPointCollection(pointList); var point = new StylusPointCollection(pointList);
var stroke = new Stroke(GenerateFakePressureRectangle(point)) { var stroke = new Stroke(GenerateFakePressureRectangle(point)) {
DrawingAttributes = inkCanvas.DefaultDrawingAttributes.Clone() DrawingAttributes = Dispatcher.Invoke(()=>inkCanvas.DefaultDrawingAttributes.Clone())
}; };
SetNewBackupOfStroke();
_currentCommitType = CommitReason.ShapeRecognition; Dispatcher.InvokeAsync(() => {
inkCanvas.Strokes.Remove(result.InkDrawingNode.Strokes); SetNewBackupOfStroke();
inkCanvas.Strokes.Add(stroke); _currentCommitType = CommitReason.ShapeRecognition;
_currentCommitType = CommitReason.UserInput; inkCanvas.Strokes.Remove(result.InkDrawingNode.Strokes);
GridInkCanvasSelectionCover.Visibility = Visibility.Collapsed; inkCanvas.Strokes.Add(stroke);
newStrokes = new StrokeCollection(); _currentCommitType = CommitReason.UserInput;
GridInkCanvasSelectionCover.Visibility = Visibility.Collapsed;
newStrokes = new StrokeCollection();
});
} }
} }
} }
catch { } catch { }
} }
InkToShapeProcess(); var _t = new Thread(InkToShapeProcess);
_t.Start();
} }
foreach (var stylusPoint in e.Stroke.StylusPoints) foreach (var stylusPoint in e.Stroke.StylusPoints)

View File

@ -141,25 +141,25 @@ namespace Ink_Canvas {
if (arg.Contains("EasiNote")) { if (arg.Contains("EasiNote")) {
Dispatcher.Invoke(() => { Dispatcher.Invoke(() => {
ShowNotification("“希沃白板 5”已自动关闭"); ShowNewToast("“希沃白板 5”已自动关闭", MW_Toast.ToastType.Warning, 3000);
}); });
} }
if (arg.Contains("HiteAnnotation")) { if (arg.Contains("HiteAnnotation")) {
Dispatcher.Invoke(() => { Dispatcher.Invoke(() => {
ShowNotification("“鸿合屏幕书写”已自动关闭"); ShowNewToast("“鸿合屏幕书写”已自动关闭", MW_Toast.ToastType.Warning, 3000);
}); });
} }
if (arg.Contains("Ink Canvas Annotation") || arg.Contains("Ink Canvas Artistry")) { if (arg.Contains("Ink Canvas Annotation") || arg.Contains("Ink Canvas Artistry")) {
Dispatcher.Invoke(() => { Dispatcher.Invoke(() => {
ShowNotification("“ICA”已自动关闭"); ShowNewToast("“ICA”已自动关闭", MW_Toast.ToastType.Warning, 3000);
}); });
} }
if (arg.Contains("\"Ink Canvas.exe\"")) { if (arg.Contains("\"Ink Canvas.exe\"")) {
Dispatcher.Invoke(() => { Dispatcher.Invoke(() => {
ShowNotification("“Ink Canvas”已自动关闭"); ShowNewToast("“Ink Canvas”已自动关闭", MW_Toast.ToastType.Warning, 3000);
}); });
} }
@ -172,7 +172,7 @@ namespace Ink_Canvas {
if (arg.Contains("VcomTeach")) if (arg.Contains("VcomTeach"))
{ {
Dispatcher.Invoke(() => { Dispatcher.Invoke(() => {
ShowNotification("“优教授课端”已自动关闭"); ShowNewToast("“优教授课端”已自动关闭", MW_Toast.ToastType.Warning, 3000);
}); });
} }

View File

@ -487,10 +487,10 @@
</Image> </Image>
</Button> </Button>
</Grid> </Grid>
<Line X1="0" Y1="0" X2="240" Y2="0" Margin="0,2" HorizontalAlignment="Center" Stroke="#a1a1aa" /> <Line X1="0" Y1="0" X2="240" Y2="0" Margin="0,2" Name="_QuickAction_Line1" HorizontalAlignment="Center" Stroke="#a1a1aa" />
<Grid> <Grid Name="_QuickAction_Grid">
<modern:ScrollViewerEx PreviewMouseWheel="QuickActionsScrollViewer_PreviewMouseWheel" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Disabled" PanningMode="HorizontalOnly" Orientation="Horizontal" ManipulationBoundaryFeedback="SCManipulationBoundaryFeedback"> <modern:ScrollViewerEx ScrollChanged="QuickActionsScrollViewer_ScrollChanged" Name="QuickActionScrollViewer" PreviewMouseWheel="QuickActionsScrollViewer_PreviewMouseWheel" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Disabled" PanningMode="HorizontalOnly" Orientation="Horizontal" ManipulationBoundaryFeedback="SCManipulationBoundaryFeedback">
<modern:SimpleStackPanel Margin="14,0,14,0" Orientation="Horizontal" Spacing="6"> <modern:SimpleStackPanel Margin="14,0,14,0" Orientation="Horizontal" Spacing="6" Name="QuickActionItems">
<Border Width="117" Height="96" Background="#f4f4f5" BorderBrush="#d4d4d8" CornerRadius="3" BorderThickness="1"> <Border Width="117" Height="96" Background="#f4f4f5" BorderBrush="#d4d4d8" CornerRadius="3" BorderThickness="1">
<Grid> <Grid>
<modern:SimpleStackPanel Spacing="2" Orientation="Vertical" VerticalAlignment="Center"> <modern:SimpleStackPanel Spacing="2" Orientation="Vertical" VerticalAlignment="Center">
@ -631,14 +631,13 @@
</Border.Background> </Border.Background>
</Border> </Border>
</Grid> </Grid>
<Grid Margin="14,3,14,0" Height="5"> <Grid Margin="14,3,14,0" Height="5" Name="_QuickAction_Dots">
<modern:SimpleStackPanel Orientation="Horizontal" HorizontalAlignment="Center" Spacing="3"> <modern:SimpleStackPanel Orientation="Horizontal" HorizontalAlignment="Center" Spacing="3">
<Border Height="5" Width="5" CornerRadius="2.5" Background="#d4d4d8"/> <Border Height="5" Width="5" Name="QuickActionDot1" CornerRadius="2.5" Background="#d4d4d8"/>
<Border Height="5" Width="5" CornerRadius="2.5" Background="#27272a"/> <Border Height="5" Width="5" Name="QuickActionDot2" CornerRadius="2.5" Background="#27272a"/>
<Border Height="5" Width="5" CornerRadius="2.5" Background="#d4d4d8"/>
</modern:SimpleStackPanel> </modern:SimpleStackPanel>
</Grid> </Grid>
<Line X1="0" Y1="0" X2="240" Y2="0" Margin="0,2" HorizontalAlignment="Center" Stroke="#a1a1aa" /> <Line Name="_QuickAction_Line2" X1="0" Y1="0" X2="240" Y2="0" Margin="0,2" HorizontalAlignment="Center" Stroke="#a1a1aa" />
<Grid> <Grid>
<Grid Margin="10,0,10,0"> <Grid Margin="10,0,10,0">
<Grid.RowDefinitions> <Grid.RowDefinitions>

View File

@ -94,21 +94,6 @@ namespace Ink_Canvas.Popups {
public GeometryDrawing[] PenModeTabButtonIcons; public GeometryDrawing[] PenModeTabButtonIcons;
public TextBlock[] PenModeTabButtonTexts; public TextBlock[] PenModeTabButtonTexts;
private void SCManipulationBoundaryFeedback(object sender, ManipulationBoundaryFeedbackEventArgs e) {
e.Handled = true;
}
private void QuickActionsScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
ScrollViewer scrollViewer = (ScrollViewer)sender;
if (e.Delta < 0) {
scrollViewer.ScrollToHorizontalOffset(scrollViewer.HorizontalOffset + 24);
} else {
scrollViewer.ScrollToHorizontalOffset(scrollViewer.HorizontalOffset - 24);
}
e.Handled = true;
}
#region #region
/// <summary> /// <summary>
@ -663,7 +648,7 @@ namespace Ink_Canvas.Popups {
#region #region
public void UpdatePenModeButtonsCheckedDisplayStatus() { private void UpdatePenModeButtonsCheckedDisplayStatus() {
foreach (var bd in PenModeTabButtonBorders) { foreach (var bd in PenModeTabButtonBorders) {
bd.Background = new SolidColorBrush(Colors.Transparent); bd.Background = new SolidColorBrush(Colors.Transparent);
} }
@ -685,11 +670,41 @@ namespace Ink_Canvas.Popups {
PenModeTabButtonTexts[(int)_penModeSelected].FontWeight = FontWeights.Bold; PenModeTabButtonTexts[(int)_penModeSelected].FontWeight = FontWeights.Bold;
} }
/// <summary>
/// 根據傳入的觸筆模式修改Quick Action 子項目的可見性。
/// </summary>
/// <param name="penMode"></param>
private void UpdateQuickActionItemsVisibilityByPenMode(PenMode penMode) {
_isDisplayQuickActions = true;
if (penMode == PenMode.PenMode) {
_isDisplayInkRecognitionQuickAction = true;
_isDisplayInkPressureQuickAction = true;
_isDisplayCircleTipShapeQuickAction = false;
_isDisplayFingerModeQuickAction = true;
} else if (penMode == PenMode.HighlighterMode) {
_isDisplayInkRecognitionQuickAction = true;
_isDisplayInkPressureQuickAction = false;
_isDisplayCircleTipShapeQuickAction = true;
_isDisplayFingerModeQuickAction = true;
} else if (penMode == PenMode.LaserPenMode) {
_isDisplayQuickActions = false;
}
UpdateQuickActionVisibility(_isDisplayQuickActions);
UpdateQuickActionItemsVisibility(new QuickActionItemsVisibility() {
InkRecognition = _isDisplayInkRecognitionQuickAction,
InkPressure = _isDisplayInkPressureQuickAction,
CircleTipShape = _isDisplayCircleTipShapeQuickAction,
FingerMode = _isDisplayFingerModeQuickAction
});
}
private void PenTabButton_MouseDown(object sender, MouseButtonEventArgs e) { private void PenTabButton_MouseDown(object sender, MouseButtonEventArgs e) {
var pre = _penModeSelected; var pre = _penModeSelected;
_penModeSelected = (PenMode)Array.IndexOf(PenModeTabButtonBorders, (Border)sender); _penModeSelected = (PenMode)Array.IndexOf(PenModeTabButtonBorders, (Border)sender);
QuickActionItemsScrollToLeft();
UpdatePenModeButtonsCheckedDisplayStatus(); UpdatePenModeButtonsCheckedDisplayStatus();
ChangedColorButtonsTransparentVisibility(_penModeSelected == PenMode.HighlighterMode); ChangedColorButtonsTransparentVisibility(_penModeSelected == PenMode.HighlighterMode);
UpdateQuickActionItemsVisibilityByPenMode(_penModeSelected);
PenModeChanged?.Invoke(this, new PenModeChangedEventArgs() PenModeChanged?.Invoke(this, new PenModeChangedEventArgs()
{ {
@ -701,6 +716,231 @@ namespace Ink_Canvas.Popups {
#endregion #endregion
#region Quick Action
private void SCManipulationBoundaryFeedback(object sender, ManipulationBoundaryFeedbackEventArgs e) {
e.Handled = true;
}
public static class ScrollViewerBehavior
{
public static readonly DependencyProperty HorizontalOffsetProperty = DependencyProperty.RegisterAttached("HorizontalOffset", typeof(double), typeof(ScrollViewerBehavior), new UIPropertyMetadata(0.0, OnHorizontalOffsetChanged));
public static void SetHorizontalOffset(FrameworkElement target, double value) => target.SetValue(HorizontalOffsetProperty, value);
public static double GetHorizontalOffset(FrameworkElement target) => (double)target.GetValue(HorizontalOffsetProperty);
private static void OnHorizontalOffsetChanged(DependencyObject target, DependencyPropertyChangedEventArgs e) => (target as ScrollViewer)?.ScrollToHorizontalOffset((double)e.NewValue);
public static readonly DependencyProperty VerticalOffsetProperty = DependencyProperty.RegisterAttached("VerticalOffset", typeof(double), typeof(ScrollViewerBehavior), new UIPropertyMetadata(0.0, OnVerticalOffsetChanged));
public static void SetVerticalOffset(FrameworkElement target, double value) => target.SetValue(VerticalOffsetProperty, value);
public static double GetVerticalOffset(FrameworkElement target) => (double)target.GetValue(VerticalOffsetProperty);
private static void OnVerticalOffsetChanged(DependencyObject target, DependencyPropertyChangedEventArgs e) => (target as ScrollViewer)?.ScrollToVerticalOffset((double)e.NewValue);
}
private void UpdateQuickActionsDotsIndicatorDisplayStatus(int highlightedDotIndex) {
if (highlightedDotIndex == 1) {
QuickActionDot1.Background = new SolidColorBrush(Color.FromRgb(39, 39, 42));
QuickActionDot2.Background = new SolidColorBrush(Color.FromRgb(212, 212, 216));
} else {
QuickActionDot2.Background = new SolidColorBrush(Color.FromRgb(39, 39, 42));
QuickActionDot1.Background = new SolidColorBrush(Color.FromRgb(212, 212, 216));
}
}
private void QuickActionsScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e) {
UpdateQuickActionsDotsIndicatorDisplayStatus(((ScrollViewer)sender).HorizontalOffset >= 110 ? 2 : 1);
}
private void QuickActionsScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
ScrollViewer scrollViewer = (ScrollViewer)sender;
if (e.Delta < 0) {
//scrollViewer.ScrollToHorizontalOffset(scrollViewer.HorizontalOffset + 270);
var sb = new Storyboard();
var ofs = scrollViewer.HorizontalOffset;
var animation = new DoubleAnimation
{
From = ofs,
To = 120,
Duration = TimeSpan.FromMilliseconds(200)
};
animation.EasingFunction = new CubicEase() {
EasingMode = EasingMode.EaseOut,
};
Storyboard.SetTargetProperty(animation, new PropertyPath(ScrollViewerBehavior.HorizontalOffsetProperty));
Storyboard.SetTargetName(animation,"QuickActionScrollViewer");
sb.Children.Add(animation);
scrollViewer.ScrollToHorizontalOffset(ofs);
sb.Begin(scrollViewer);
} else {
//scrollViewer.ScrollToHorizontalOffset(scrollViewer.HorizontalOffset - 270);
var sb = new Storyboard();
var ofs = scrollViewer.HorizontalOffset;
var animation = new DoubleAnimation
{
From = ofs,
To = 0,
Duration = TimeSpan.FromMilliseconds(200)
};
animation.EasingFunction = new CubicEase(){
EasingMode = EasingMode.EaseOut,
};
Storyboard.SetTargetProperty(animation, new PropertyPath(ScrollViewerBehavior.HorizontalOffsetProperty));
Storyboard.SetTargetName(animation,"QuickActionScrollViewer");
sb.Children.Add(animation);
scrollViewer.ScrollToHorizontalOffset(ofs);
sb.Begin(scrollViewer);
}
e.Handled = true;
}
private void QuickActionItemsScrollToLeft() {
var sb = new Storyboard();
var ofs = QuickActionScrollViewer.HorizontalOffset;
var animation = new DoubleAnimation
{
From = ofs,
To = 0,
Duration = TimeSpan.FromMilliseconds(200)
};
animation.EasingFunction = new CubicEase(){
EasingMode = EasingMode.EaseOut,
};
Storyboard.SetTargetProperty(animation, new PropertyPath(ScrollViewerBehavior.HorizontalOffsetProperty));
Storyboard.SetTargetName(animation,"QuickActionScrollViewer");
sb.Children.Add(animation);
QuickActionScrollViewer.ScrollToHorizontalOffset(ofs);
sb.Begin(QuickActionScrollViewer);
}
#endregion
#region Quick Action
private bool _isDisplayQuickActions = true;
public bool IsDisplayQuickActions
{
get => _isDisplayQuickActions;
set
{
var pre = _isDisplayQuickActions;
_isDisplayQuickActions = value;
UpdateQuickActionVisibility(value);
UpdateQuickActionItemsVisibility(new QuickActionItemsVisibility() {
InkRecognition = _isDisplayInkRecognitionQuickAction,
InkPressure = _isDisplayInkPressureQuickAction,
CircleTipShape = _isDisplayCircleTipShapeQuickAction,
FingerMode = _isDisplayFingerModeQuickAction
});
QuickActionsVisibilityChanged?.Invoke(this, new QuickActionsVisibilityChangedEventsArgs()
{
PreviousStatus = pre,
NowStatus = value,
TriggerMode = TriggerMode.TriggeredByCode,
});
}
}
public struct QuickActionItemsVisibility {
public bool InkRecognition;
public bool InkPressure;
public bool CircleTipShape;
public bool FingerMode;
}
public class QuickActionsVisibilityChangedEventsArgs : EventArgs {
public bool PreviousStatus { get; set; }
public bool NowStatus { get; set; }
public TriggerMode TriggerMode { get; set; }
public bool IsItemsVisibilityChanged { get; set; } = false;
public QuickActionItemsVisibility ItemsVisibility { get; set; }
}
private void InvokeQuickActionItemsVisibilityEvent() {
UpdateQuickActionItemsVisibility(new QuickActionItemsVisibility() {
InkRecognition = _isDisplayInkRecognitionQuickAction,
InkPressure = _isDisplayInkPressureQuickAction,
CircleTipShape = _isDisplayCircleTipShapeQuickAction,
FingerMode = _isDisplayFingerModeQuickAction
});
QuickActionsVisibilityChanged?.Invoke(this, new QuickActionsVisibilityChangedEventsArgs()
{
PreviousStatus = _isDisplayQuickActions,
NowStatus = _isDisplayQuickActions,
TriggerMode = TriggerMode.TriggeredByCode,
IsItemsVisibilityChanged = true,
ItemsVisibility = new QuickActionItemsVisibility() {
InkRecognition = _isDisplayInkRecognitionQuickAction,
InkPressure = _isDisplayInkPressureQuickAction,
CircleTipShape = _isDisplayCircleTipShapeQuickAction,
FingerMode = _isDisplayFingerModeQuickAction
}
});
}
private bool _isDisplayInkRecognitionQuickAction = true;
public bool IsDisplayInkRecognitionQuickAction {
get => _isDisplayInkRecognitionQuickAction;
set {
_isDisplayInkRecognitionQuickAction = value;
InvokeQuickActionItemsVisibilityEvent();
}
}
private bool _isDisplayInkPressureQuickAction = true;
public bool IsDisplayInkPressureQuickAction {
get => _isDisplayInkPressureQuickAction;
set {
_isDisplayInkPressureQuickAction = value;
InvokeQuickActionItemsVisibilityEvent();
}
}
private bool _isDisplayCircleTipShapeQuickAction = true;
public bool IsDisplayCircleTipShapeQuickAction {
get => _isDisplayCircleTipShapeQuickAction;
set {
_isDisplayCircleTipShapeQuickAction = value;
InvokeQuickActionItemsVisibilityEvent();
}
}
private bool _isDisplayFingerModeQuickAction = true;
public bool IsDisplayFingerModeQuickAction {
get => _isDisplayFingerModeQuickAction;
set {
_isDisplayFingerModeQuickAction = value;
InvokeQuickActionItemsVisibilityEvent();
}
}
#endregion
#region Quick Action
private void UpdateQuickActionItemsVisibility(QuickActionItemsVisibility visibility) {
QuickActionItems.Children[0].Visibility = visibility.InkRecognition ? Visibility.Visible : Visibility.Collapsed;
QuickActionItems.Children[1].Visibility = visibility.InkPressure ? Visibility.Visible : Visibility.Collapsed;
QuickActionItems.Children[2].Visibility = visibility.CircleTipShape ? Visibility.Visible : Visibility.Collapsed;
QuickActionItems.Children[3].Visibility = visibility.FingerMode ? Visibility.Visible : Visibility.Collapsed;
}
private void UpdateQuickActionVisibility(bool isVisible) {
foreach (var fe in new FrameworkElement[] {
_QuickAction_Grid,
_QuickAction_Dots,
_QuickAction_Line1,
_QuickAction_Line2
}) {
fe.Visibility = isVisible ? Visibility.Visible : Visibility.Collapsed;
}
}
#endregion
public enum TriggerMode { public enum TriggerMode {
TriggeredByUser, TriggeredByUser,
TriggeredByCode TriggeredByCode
@ -819,32 +1059,6 @@ namespace Ink_Canvas.Popups {
CustomColorPanel.Visibility = Visibility.Collapsed; CustomColorPanel.Visibility = Visibility.Collapsed;
} }
private bool _isDisplayQuickActions = true;
public bool IsDisplayQuickActions
{
get => _isDisplayQuickActions;
set
{
var pre = _isDisplayQuickActions;
_isDisplayQuickActions = value;
QuickActionsVisibilityChanged?.Invoke(this, new QuickActionsVisibilityChangedEventsArgs()
{
PreviousStatus = pre,
NowStatus = value,
TriggerMode = TriggerMode.TriggeredByCode,
});
}
}
public class QuickActionsVisibilityChangedEventsArgs : EventArgs {
public bool PreviousStatus { get; set; }
public bool NowStatus { get; set; }
public TriggerMode TriggerMode { get; set; }
}
public event EventHandler<ColorSelectionChangedEventArgs> ColorSelectionChanged; public event EventHandler<ColorSelectionChangedEventArgs> ColorSelectionChanged;
public event EventHandler<CustomColorChangedEventArgs> CustomColorChanged; public event EventHandler<CustomColorChangedEventArgs> CustomColorChanged;
public event EventHandler<PenModeChangedEventArgs> PenModeChanged; public event EventHandler<PenModeChangedEventArgs> PenModeChanged;
@ -880,6 +1094,8 @@ namespace Ink_Canvas.Popups {
UpdateColorButtonsCheckedDisplayStatus(); UpdateColorButtonsCheckedDisplayStatus();
UpdateColorPaletteColorsAndColorModeChangeButton(); UpdateColorPaletteColorsAndColorModeChangeButton();
ChangedColorButtonsTransparentVisibility(false); ChangedColorButtonsTransparentVisibility(false);
UpdateQuickActionsDotsIndicatorDisplayStatus(1);
UpdateQuickActionItemsVisibilityByPenMode(PenMode.PenMode);
} }
} }
} }