feat(设置): 新增墨迹纠正设置页面并重构设置界面

重构设置界面,将墨迹纠正相关功能从画板设置中分离出来,新增独立的墨迹纠正设置页面。主要变更包括:
- 新增 InkRecognitionPage 用于集中管理墨迹纠正功能
- 调整设置窗口导航结构,将墨迹纠正设为画板设置的子页面
- 优化设置项布局,使用折叠面板组织复杂选项
- 移除主窗口中冗余的崩溃处理和手势设置
- 修复多指手势时橡皮擦状态保存问题
- 新增笔尖模式相关字符串资源
This commit is contained in:
PrefacedCorg
2026-04-25 13:56:16 +08:00
parent 6e61538dec
commit b1640f44c2
17 changed files with 588 additions and 399 deletions
@@ -140,20 +140,25 @@
SwitchName="ToggleSwitchEnableInkFade"
Toggled="ToggleSwitchEnableInkFade_Toggled" />
<ui:SettingsCard Header="{i18n:I18n Key=Canvas_InkFadeTime}"
<ui:SettingsExpander Header="{i18n:I18n Key=Canvas_EnableInkFade}"
Visibility="{Binding IsOn, ElementName=CardEnableInkFade, Converter={StaticResource BooleanToVisibilityConverter}}"
IsExpanded="{Binding IsOn, ElementName=CardEnableInkFade, Mode=OneWay}"
d:Visibility="Visible">
<ui:SettingsCard.HeaderIcon>
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Stopwatch}" />
</ui:SettingsCard.HeaderIcon>
<ikw:SimpleStackPanel Orientation="Horizontal" Spacing="12">
<Slider x:Name="InkFadeTimeSlider" Width="150" Minimum="1000" Maximum="10000"
Value="3000" TickFrequency="1000" IsSnapToTickEnabled="True"
ValueChanged="InkFadeTimeSlider_ValueChanged" />
<TextBlock Text="{Binding Value, ElementName=InkFadeTimeSlider, StringFormat={}{0:0}ms}"
VerticalAlignment="Center" FontSize="14" />
</ikw:SimpleStackPanel>
</ui:SettingsCard>
<ui:SettingsExpander.HeaderIcon>
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Settings}" />
</ui:SettingsExpander.HeaderIcon>
<ui:SettingsExpander.Items>
<ui:SettingsCard Header="{i18n:I18n Key=Canvas_InkFadeTime}">
<ikw:SimpleStackPanel Orientation="Horizontal" Spacing="12">
<Slider x:Name="InkFadeTimeSlider" Width="150" Minimum="1000" Maximum="10000"
Value="3000" TickFrequency="1000" IsSnapToTickEnabled="True"
ValueChanged="InkFadeTimeSlider_ValueChanged" />
<TextBlock Text="{Binding Value, ElementName=InkFadeTimeSlider, StringFormat={}{0:0}ms}"
VerticalAlignment="Center" FontSize="14" />
</ikw:SimpleStackPanel>
</ui:SettingsCard>
</ui:SettingsExpander.Items>
</ui:SettingsExpander>
<controls:LabeledSettingsCard x:Name="CardHideInkFadeControlInPenMenu"
Header="{i18n:I18n Key=Canvas_HideInkFadeInPenMenu}"
@@ -223,144 +228,69 @@
SwitchName="ToggleSwitchEnableEraserAutoSwitchBack"
Toggled="ToggleSwitchEnableEraserAutoSwitchBack_Toggled" />
<ui:SettingsCard Header="{i18n:I18n Key=Canvas_SwitchBackDelay}"
Description="{i18n:I18n Key=Canvas_SwitchBackDelayHint}"
<ui:SettingsExpander Header="{i18n:I18n Key=Canvas_SwitchBackAfterEraser}"
Visibility="{Binding IsOn, ElementName=CardEnableEraserAutoSwitchBack, Converter={StaticResource BooleanToVisibilityConverter}}"
d:Visibility="Visible">
<ikw:SimpleStackPanel Orientation="Horizontal" Spacing="12">
<Slider x:Name="EraserAutoSwitchBackDelaySlider" Width="150" Minimum="1" Maximum="60"
Value="10" TickFrequency="1" IsSnapToTickEnabled="True"
ValueChanged="EraserAutoSwitchBackDelaySlider_ValueChanged" />
<TextBlock Text="{Binding Value, ElementName=EraserAutoSwitchBackDelaySlider, StringFormat={}{0:0}秒}"
VerticalAlignment="Center" FontSize="14" />
</ikw:SimpleStackPanel>
</ui:SettingsCard>
<TextBlock Style="{StaticResource SettingsSectionHeaderTextBlockStyle}"
Text="{i18n:I18n Key=InkRecog_Title}" />
<controls:LabeledSettingsCard x:Name="CardEnableInkToShape"
Header="{i18n:I18n Key=InkRecog_EnableInkRecognition}"
Icon="{x:Static ui:SegoeFluentIcons.Draw}"
SwitchName="ToggleSwitchEnableInkToShape"
Toggled="ToggleSwitchEnableInkToShape_Toggled" />
<ui:SettingsCard Header="{i18n:I18n Key=InkRecog_ShapeEngine}"
Description="{i18n:I18n Key=InkRecog_ShapeEngineHint}">
<ComboBox x:Name="ComboBoxShapeRecognitionEngine"
SelectionChanged="ComboBoxShapeRecognitionEngine_SelectionChanged">
<ComboBoxItem Content="{i18n:I18n Key=InkRecog_ShapeEngineAuto}" />
<ComboBoxItem Content="{i18n:I18n Key=InkRecog_ShapeEngineIACore}" />
<ComboBoxItem Content="{i18n:I18n Key=InkRecog_ShapeEngineWinRT}" />
</ComboBox>
</ui:SettingsCard>
<controls:LabeledSettingsCard x:Name="CardEnableWinRtHandwritingStrokeBeautify"
Header="{i18n:I18n Key=InkRecog_HandwritingBeautify}"
Description="{i18n:I18n Key=InkRecog_HandwritingBeautifyHint}"
Icon="{x:Static ui:SegoeFluentIcons.PenWorkspace}"
SwitchName="ToggleSwitchEnableWinRtHandwritingStrokeBeautify"
Toggled="ToggleSwitchEnableWinRtHandwritingStrokeBeautify_Toggled" />
<controls:LabeledSettingsCard x:Name="CardEnableInkToShapeNoFakePressureRectangle"
Header="{i18n:I18n Key=InkRecog_BlockRectFakePressure}"
ShowWhen="{Binding IsOn, ElementName=CardEnableInkToShape}"
d:Visibility="Visible"
Icon="{x:Static ui:SegoeFluentIcons.RectangularClipping}"
SwitchName="ToggleSwitchEnableInkToShapeNoFakePressureRectangle"
Toggled="ToggleSwitchEnableInkToShapeNoFakePressureRectangle_Toggled" />
<controls:LabeledSettingsCard x:Name="CardEnableInkToShapeNoFakePressureTriangle"
Header="{i18n:I18n Key=InkRecog_BlockTriFakePressure}"
ShowWhen="{Binding IsOn, ElementName=CardEnableInkToShape}"
d:Visibility="Visible"
Icon="{x:Static ui:SegoeFluentIcons.IncidentTriangle}"
SwitchName="ToggleSwitchEnableInkToShapeNoFakePressureTriangle"
Toggled="ToggleSwitchEnableInkToShapeNoFakePressureTriangle_Toggled" />
<ui:SettingsExpander Header="形状修正"
Visibility="{Binding IsOn, ElementName=CardEnableInkToShape, Converter={StaticResource BooleanToVisibilityConverter}}"
IsExpanded="{Binding IsOn, ElementName=CardEnableInkToShape, Mode=OneWay}"
IsExpanded="{Binding IsOn, ElementName=CardEnableEraserAutoSwitchBack, Mode=OneWay}"
d:Visibility="Visible">
<ui:SettingsExpander.HeaderIcon>
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Settings}" />
</ui:SettingsExpander.HeaderIcon>
<ui:SettingsExpander.Items>
<ui:SettingsCard Header="{i18n:I18n Key=InkRecog_FixTriangle}">
<CheckBox x:Name="ToggleCheckboxEnableInkToShapeTriangle" IsChecked="True"
Checked="ToggleCheckboxEnableInkToShapeTriangle_CheckedChanged"
Unchecked="ToggleCheckboxEnableInkToShapeTriangle_CheckedChanged" />
</ui:SettingsCard>
<ui:SettingsCard Header="{i18n:I18n Key=InkRecog_FixRectangle}">
<CheckBox x:Name="ToggleCheckboxEnableInkToShapeRectangle" IsChecked="True"
Checked="ToggleCheckboxEnableInkToShapeRectangle_CheckedChanged"
Unchecked="ToggleCheckboxEnableInkToShapeRectangle_CheckedChanged" />
</ui:SettingsCard>
<ui:SettingsCard Header="{i18n:I18n Key=InkRecog_FixEllipse}">
<CheckBox x:Name="ToggleCheckboxEnableInkToShapeRounded" IsChecked="True"
Checked="ToggleCheckboxEnableInkToShapeRounded_CheckedChanged"
Unchecked="ToggleCheckboxEnableInkToShapeRounded_CheckedChanged" />
<ui:SettingsCard Header="{i18n:I18n Key=Canvas_SwitchBackDelay}"
Description="{i18n:I18n Key=Canvas_SwitchBackDelayHint}">
<ikw:SimpleStackPanel Orientation="Horizontal" Spacing="12">
<Slider x:Name="EraserAutoSwitchBackDelaySlider" Width="150" Minimum="1" Maximum="60"
Value="10" TickFrequency="1" IsSnapToTickEnabled="True"
ValueChanged="EraserAutoSwitchBackDelaySlider_ValueChanged" />
<TextBlock Text="{Binding Value, ElementName=EraserAutoSwitchBackDelaySlider, StringFormat={}{0:0}秒}"
VerticalAlignment="Center" FontSize="14" />
</ikw:SimpleStackPanel>
</ui:SettingsCard>
</ui:SettingsExpander.Items>
</ui:SettingsExpander>
<controls:LabeledSettingsCard x:Name="CardAutoStraightenLine"
Header="{i18n:I18n Key=InkRecog_AutoStraightLine}"
Icon="{x:Static ui:SegoeFluentIcons.LineDisplay}"
SwitchName="ToggleSwitchAutoStraightenLine"
Toggled="ToggleSwitchAutoStraightenLine_Toggled" />
<TextBlock Style="{StaticResource SettingsSectionHeaderTextBlockStyle}"
Text="{i18n:I18n Key=Gesture_Title}" />
<ui:SettingsCard Header="{i18n:I18n Key=InkRecog_LengthThreshold}"
Visibility="{Binding IsOn, ElementName=CardAutoStraightenLine, Converter={StaticResource BooleanToVisibilityConverter}}"
<controls:LabeledSettingsCard x:Name="CardAutoSwitchTwoFingerGesture"
Header="{i18n:I18n Key=Gesture_AutoToggleTwoFinger}"
Description="{i18n:I18n Key=Gesture_AutoToggleHint}"
Icon="{x:Static ui:SegoeFluentIcons.Switch}"
SwitchName="ToggleSwitchAutoSwitchTwoFingerGesture"
Toggled="ToggleSwitchAutoSwitchTwoFingerGesture_Toggled" />
<controls:LabeledSettingsCard x:Name="CardEnableTwoFingerRotationOnSelection"
Header="{i18n:I18n Key=Gesture_AllowRotateScale}"
Description="{i18n:I18n Key=Gesture_AllowRotateScaleHint}"
Icon="{x:Static ui:SegoeFluentIcons.Rotate}"
SwitchName="ToggleSwitchEnableTwoFingerRotationOnSelection"
Toggled="ToggleSwitchEnableTwoFingerRotationOnSelection_Toggled" />
<controls:LabeledSettingsCard x:Name="CardEnablePalmEraser"
Header="{i18n:I18n Key=Gesture_EnablePalmEraser}"
Description="{i18n:I18n Key=Gesture_PalmHint}"
Icon="{x:Static ui:SegoeFluentIcons.EraseTool}"
SwitchName="ToggleSwitchEnablePalmEraser"
Toggled="ToggleSwitchEnablePalmEraser_Toggled" />
<ui:SettingsExpander Header="{i18n:I18n Key=Gesture_EnablePalmEraser}"
Visibility="{Binding IsOn, ElementName=CardEnablePalmEraser, Converter={StaticResource BooleanToVisibilityConverter}}"
IsExpanded="{Binding IsOn, ElementName=CardEnablePalmEraser, Mode=OneWay}"
d:Visibility="Visible">
<ikw:SimpleStackPanel Orientation="Horizontal" Spacing="12">
<Slider x:Name="AutoStraightenLineThresholdSlider" Width="150" Minimum="30" Maximum="300"
Value="80" TickFrequency="30" IsSnapToTickEnabled="True"
ValueChanged="AutoStraightenLineThresholdSlider_ValueChanged" />
<TextBlock Text="{Binding Value, ElementName=AutoStraightenLineThresholdSlider, StringFormat={}{0:0}}"
VerticalAlignment="Center" FontSize="14" />
</ikw:SimpleStackPanel>
</ui:SettingsCard>
<ui:SettingsCard Header="{i18n:I18n Key=InkRecog_Sensitivity}"
Visibility="{Binding IsOn, ElementName=CardAutoStraightenLine, Converter={StaticResource BooleanToVisibilityConverter}}"
d:Visibility="Visible">
<ikw:SimpleStackPanel Orientation="Horizontal" Spacing="12">
<Slider x:Name="LineStraightenSensitivitySlider" Width="150" Minimum="0.05" Maximum="2.0"
Value="0.20" TickFrequency="0.05" IsSnapToTickEnabled="True"
ValueChanged="LineStraightenSensitivitySlider_ValueChanged" />
<TextBlock Text="{Binding Value, ElementName=LineStraightenSensitivitySlider, StringFormat={}{0:F2}}"
VerticalAlignment="Center" FontSize="14" />
</ikw:SimpleStackPanel>
</ui:SettingsCard>
<controls:LabeledSettingsCard x:Name="CardHighPrecisionLineStraighten"
Header="{i18n:I18n Key=InkRecog_HighPrecisionStraighten}"
Description="{i18n:I18n Key=InkRecog_HighPrecisionHint}"
ShowWhen="{Binding IsOn, ElementName=CardAutoStraightenLine}"
d:Visibility="Visible"
Icon="{x:Static ui:SegoeFluentIcons.Bullseye}"
SwitchName="ToggleSwitchHighPrecisionLineStraighten"
Toggled="ToggleSwitchHighPrecisionLineStraighten_Toggled" />
<controls:LabeledSettingsCard x:Name="CardLineEndpointSnapping"
Header="{i18n:I18n Key=InkRecog_LineEndpointSnapping}"
Icon="{x:Static ui:SegoeFluentIcons.Link}"
SwitchName="ToggleSwitchLineEndpointSnapping"
Toggled="ToggleSwitchLineEndpointSnapping_Toggled" />
<ui:SettingsCard Header="{i18n:I18n Key=InkRecog_SnappingDistance}"
Description="{i18n:I18n Key=InkRecog_LineEndpointSnappingHint}"
Visibility="{Binding IsOn, ElementName=CardLineEndpointSnapping, Converter={StaticResource BooleanToVisibilityConverter}}"
d:Visibility="Visible">
<ikw:SimpleStackPanel Orientation="Horizontal" Spacing="12">
<Slider x:Name="LineEndpointSnappingThresholdSlider" Width="150" Minimum="5" Maximum="50"
Value="15" TickFrequency="5" IsSnapToTickEnabled="True"
ValueChanged="LineEndpointSnappingThresholdSlider_ValueChanged" />
<TextBlock Text="{Binding Value, ElementName=LineEndpointSnappingThresholdSlider, StringFormat={}{0:0}}"
VerticalAlignment="Center" FontSize="14" />
</ikw:SimpleStackPanel>
</ui:SettingsCard>
<ui:SettingsExpander.HeaderIcon>
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Settings}" />
</ui:SettingsExpander.HeaderIcon>
<ui:SettingsExpander.Items>
<ui:SettingsCard Header="{i18n:I18n Key=Gesture_PalmSensitivity}">
<ComboBox x:Name="ComboBoxPalmEraserSensitivity"
SelectionChanged="ComboBoxPalmEraserSensitivity_SelectionChanged">
<ComboBoxItem Content="{i18n:I18n Key=Gesture_PalmSensitivityLow}" />
<ComboBoxItem Content="{i18n:I18n Key=Gesture_PalmSensitivityMedium}" />
<ComboBoxItem Content="{i18n:I18n Key=Gesture_PalmSensitivityHigh}" />
</ComboBox>
</ui:SettingsCard>
</ui:SettingsExpander.Items>
</ui:SettingsExpander>
<Rectangle Height="48" />