[update] 修复部分bug,完善调色盘V2代码,添加了设置页面的滚动动画
This commit is contained in:
parent
12ec3d7874
commit
20a2f21e0b
@ -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"
|
||||||
|
@ -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;
|
||||||
});
|
});
|
||||||
|
@ -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 :
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user