feat(FeedBack): 添加GitHub反馈选项和Markdown模板功能

- 在反馈窗口中新增第三页,提供GitHub问题反馈选项
- 添加Markdown模板生成功能,自动包含用户选择的环境和设备信息
- 实现复制反馈链接和模板的功能按钮
- 重构导航逻辑以支持三页切换

Signed-off-by: doudou0720 <98651603+doudou0720@users.noreply.github.com>
This commit is contained in:
doudou0720
2026-04-04 21:38:10 +08:00
parent f60e77d39f
commit 7cba03d1b9
2 changed files with 262 additions and 9 deletions
+71 -1
View File
@@ -139,6 +139,76 @@
</ScrollViewer>
</Grid>
<Grid Grid.Row="0" x:Name="Page3" Visibility="Collapsed">
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
<ikw:SimpleStackPanel Spacing="12" Margin="0,0,0,20">
<TextBlock FontSize="20" FontWeight="SemiBold" Margin="0,0,0,10" Text="选择反馈方式"/>
<ui:SettingsExpander x:Name="ExpanderGitHubFeedback" Header="GitHub 问题反馈"
Description="在 GitHub 上提交问题反馈">
<ui:SettingsExpander.HeaderIcon>
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Mail}"/>
</ui:SettingsExpander.HeaderIcon>
<Button x:Name="BtnOpenGitHubIssue" Content="跳转到 GitHub 反馈" Click="BtnOpenGitHubIssue_Click">
<Button.Style>
<Style TargetType="Button" BasedOn="{StaticResource {x:Static ui:ThemeKeys.AccentButtonStyleKey}}"/>
</Button.Style>
</Button>
<ui:SettingsExpander.Items>
<ui:SettingsCard Header="复制反馈链接" IsClickEnabled="True" Click="CardCopyIssueUrl_Click">
<TextBox x:Name="TextBoxIssueUrl"
MaxWidth="400"
Text="https://github.com/InkCanvasForClass/community/issues/new?template=01-bug_report.yml"
IsReadOnly="True"
BorderThickness="0"
Background="Transparent"
FontFamily="Consolas"
FontSize="12"
TextWrapping="Wrap"
AcceptsReturn="True"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto"
IsReadOnlyCaretVisible="False"
Foreground="{DynamicResource {x:Static ui:ThemeKeys.TextFillColorSecondaryBrushKey}}"
TextAlignment="Left"
VerticalAlignment="Center"/>
<ui:SettingsCard.ActionIcon>
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Copy}"/>
</ui:SettingsCard.ActionIcon>
</ui:SettingsCard>
</ui:SettingsExpander.Items>
</ui:SettingsExpander>
<ui:SettingsExpander x:Name="ExpanderMarkdownTemplate" Header="反馈模板 (Markdown)"
Description="复制以下 Markdown 模板进行反馈">
<ui:SettingsExpander.HeaderIcon>
<ui:FontIcon Icon="{x:Static ui:SegoeFluentIcons.Code}"/>
</ui:SettingsExpander.HeaderIcon>
<Button x:Name="BtnCopyMarkdown" Content="复制模板" Click="BtnCopyMarkdown_Click">
<Button.Style>
<Style TargetType="Button" BasedOn="{StaticResource {x:Static ui:ThemeKeys.DefaultButtonStyleKey}}"/>
</Button.Style>
</Button>
<ui:SettingsExpander.Items>
<ui:SettingsCard ContentAlignment="Left">
<TextBox x:Name="TextBoxMarkdownTemplate"
MinHeight="200"
IsReadOnly="True"
BorderThickness="0"
Background="Transparent"
FontFamily="Consolas"
FontSize="12"
TextWrapping="Wrap"
AcceptsReturn="True"
VerticalScrollBarVisibility="Auto"
Text="# 问题描述&#x0a;请描述您遇到的问题...&#x0a;&#x0a;# 重现步骤&#x0a;1. &#x0a;2. &#x0a;3. &#x0a;&#x0a;# 预期行为&#x0a;请描述您期望的行为...&#x0a;&#x0a;# 实际行为&#x0a;请描述实际发生的...&#x0a;&#x0a;# 环境信息&#x0a;- 版本: &#x0a;- 系统: &#x0a;"/>
</ui:SettingsCard>
</ui:SettingsExpander.Items>
</ui:SettingsExpander>
</ikw:SimpleStackPanel>
</ScrollViewer>
</Grid>
<Grid Grid.Row="1" VerticalAlignment="Bottom" Margin="0,20,0,0">
<ikw:SimpleStackPanel HorizontalAlignment="Right" VerticalAlignment="Center" Orientation="Horizontal" Spacing="12">
<Button x:Name="ButtonCancel" Content="取消" Width="100" Height="36" FontFamily="Microsoft YaHei UI" FontSize="14" Click="ButtonCancel_Click">
@@ -160,7 +230,7 @@
</Style>
</Button.Style>
</Button>
<Button x:Name="ButtonSubmit" Content="提交反馈" Width="120" Height="36" FontFamily="Microsoft YaHei UI" FontSize="14" FontWeight="SemiBold" Click="ButtonSubmit_Click" Visibility="Collapsed">
<Button x:Name="ButtonConfirm" Content="下一步" Width="120" Height="36" FontFamily="Microsoft YaHei UI" FontSize="14" FontWeight="SemiBold" Click="ButtonConfirm_Click" Visibility="Collapsed">
<Button.Style>
<Style TargetType="Button" BasedOn="{StaticResource {x:Static ui:ThemeKeys.AccentButtonStyleKey}}"/>
</Button.Style>
+191 -8
View File
@@ -247,12 +247,24 @@ namespace Ink_Canvas
private void ButtonBack_Click(object sender, RoutedEventArgs e)
{
Page1.Visibility = Visibility.Visible;
Page2.Visibility = Visibility.Collapsed;
ButtonCancel.Visibility = Visibility.Visible;
ButtonNext.Visibility = Visibility.Visible;
ButtonBack.Visibility = Visibility.Collapsed;
ButtonSubmit.Visibility = Visibility.Collapsed;
if (Page3.Visibility == Visibility.Visible)
{
Page3.Visibility = Visibility.Collapsed;
Page2.Visibility = Visibility.Visible;
ButtonCancel.Visibility = Visibility.Collapsed;
ButtonNext.Visibility = Visibility.Collapsed;
ButtonBack.Visibility = Visibility.Visible;
ButtonConfirm.Visibility = Visibility.Visible;
}
else if (Page2.Visibility == Visibility.Visible)
{
Page2.Visibility = Visibility.Collapsed;
Page1.Visibility = Visibility.Visible;
ButtonCancel.Visibility = Visibility.Visible;
ButtonNext.Visibility = Visibility.Visible;
ButtonBack.Visibility = Visibility.Collapsed;
ButtonConfirm.Visibility = Visibility.Collapsed;
}
}
private void ButtonNext_Click(object sender, RoutedEventArgs e)
@@ -349,7 +361,7 @@ namespace Ink_Canvas
ButtonCancel.Visibility = Visibility.Collapsed;
ButtonNext.Visibility = Visibility.Collapsed;
ButtonBack.Visibility = Visibility.Visible;
ButtonSubmit.Visibility = Visibility.Visible;
ButtonConfirm.Visibility = Visibility.Visible;
}
catch (Exception ex)
{
@@ -357,7 +369,71 @@ namespace Ink_Canvas
}
}
private void ButtonSubmit_Click(object sender, RoutedEventArgs e)
private void ButtonConfirm_Click(object sender, RoutedEventArgs e)
{
GenerateMarkdownTemplate();
Page2.Visibility = Visibility.Collapsed;
Page3.Visibility = Visibility.Visible;
ButtonCancel.Visibility = Visibility.Visible;
ButtonNext.Visibility = Visibility.Collapsed;
ButtonBack.Visibility = Visibility.Visible;
ButtonConfirm.Visibility = Visibility.Collapsed;
}
private void GenerateMarkdownTemplate()
{
string template = "## 环境信息\n";
if (CheckAppVersion.IsChecked == true)
{
template += $"- 软件版本: {_appVersion}\n";
}
if (CheckUpdateChannel.IsChecked == true)
{
template += $"- 更新通道: {_updateChannel}\n";
}
if (CheckOSVersion.IsChecked == true)
{
template += $"- 操作系统: {_osVersion}\n";
}
if (CheckNetVersion.IsChecked == true)
{
template += $"- .NET 版本: {_netVersion}\n";
}
if (CheckTouchSupport.IsChecked == true)
{
template += $"- 触控支持: {_touchSupport}\n";
}
template += "\n## 设备信息\n";
if (CheckDeviceId.IsChecked == true)
{
template += $"- 设备ID: {_deviceId}\n";
}
if (CheckFanceId.IsChecked == true && !string.IsNullOrEmpty(_telemetryId))
{
template += $"- 遥测ID: {_telemetryId}\n";
}
if (CheckPPTLinkage.IsChecked == true || CheckInkRecognition.IsChecked == true)
{
template += "\n## 软件配置\n";
if (CheckPPTLinkage.IsChecked == true)
{
template += "### PPT联动设置\n";
template += _pptLinkageSettings + "\n";
}
if (CheckInkRecognition.IsChecked == true)
{
template += "### 墨迹识别设置\n";
template += _inkRecognitionSettings + "\n";
}
}
TextBoxMarkdownTemplate.Text = template;
}
private void BtnOpenGitHubIssue_Click(object sender, RoutedEventArgs e)
{
try
{
@@ -457,5 +533,112 @@ namespace Ink_Canvas
System.Diagnostics.Debug.WriteLine($"打开反馈链接失败: {ex.Message}");
}
}
private void CardCopyIssueUrl_Click(object sender, RoutedEventArgs e)
{
try
{
string versionInfo = "";
string systemInfo = "";
if (CheckAppVersion.IsChecked == true || CheckUpdateChannel.IsChecked == true)
{
if (CheckAppVersion.IsChecked == true)
{
versionInfo += _appVersion;
}
if (CheckUpdateChannel.IsChecked == true)
{
if (!string.IsNullOrEmpty(versionInfo))
{
versionInfo += " ";
}
versionInfo += $"({_updateChannel})";
}
}
if (CheckOSVersion.IsChecked == true || CheckNetVersion.IsChecked == true || CheckTouchSupport.IsChecked == true)
{
if (CheckOSVersion.IsChecked == true)
{
systemInfo += _osVersion;
}
if (CheckNetVersion.IsChecked == true)
{
if (!string.IsNullOrEmpty(systemInfo))
{
systemInfo += " | ";
}
systemInfo += _netVersion;
}
if (CheckTouchSupport.IsChecked == true)
{
if (!string.IsNullOrEmpty(systemInfo))
{
systemInfo += " | ";
}
systemInfo += $"触控:{_touchSupport}";
}
}
string url = "https://github.com/InkCanvasForClass/community/issues/new?template=01-bug_report.yml";
if (!string.IsNullOrEmpty(versionInfo))
{
url += $"&version={Uri.EscapeDataString(versionInfo)}";
}
if (!string.IsNullOrEmpty(systemInfo))
{
url += $"&os={Uri.EscapeDataString(systemInfo)}";
}
string extraInfo = "";
if (CheckDeviceId.IsChecked == true)
{
extraInfo += $"设备ID: {_deviceId}\n";
}
if (CheckFanceId.IsChecked == true)
{
extraInfo += $"遥测ID: {_telemetryId}\n";
}
if (CheckPPTLinkage.IsChecked == true)
{
extraInfo += "\nPPT联动设置:\n";
extraInfo += _pptLinkageSettings;
}
if (CheckInkRecognition.IsChecked == true)
{
extraInfo += "\n墨迹识别设置:\n";
extraInfo += _inkRecognitionSettings;
}
if (!string.IsNullOrEmpty(extraInfo))
{
url += $"&extra={Uri.EscapeDataString(extraInfo)}";
}
Clipboard.SetText(url);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"复制反馈链接失败: {ex.Message}");
}
}
private void BtnCopyMarkdown_Click(object sender, RoutedEventArgs e)
{
try
{
Clipboard.SetText(TextBoxMarkdownTemplate.Text);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"复制Markdown模板失败: {ex.Message}");
}
}
}
}