2.10.9
This commit is contained in:
@@ -227,7 +227,7 @@
|
||||
Me.Value = Value
|
||||
Me.Source = Source
|
||||
Me.Type = If(Value, New Object).GetType
|
||||
Me.DefaultValueEncoded = If(Encoded, SecretEncrypt(Value, "PCL" & UniqueAddress), Value)
|
||||
Me.DefaultValueEncoded = If(Encoded, SecretEncrypt(Value, "PCL" & Identify), Value)
|
||||
Catch ex As Exception
|
||||
Log(ex, "初始化 SetupEntry 失败", LogLevel.Feedback) '#5095 的 fallback
|
||||
End Try
|
||||
@@ -241,6 +241,14 @@
|
||||
Public Sub [Set](Key As String, Value As Object, Optional ForceReload As Boolean = False, Optional Version As McVersion = Nothing)
|
||||
[Set](Key, Value, SetupDict(Key), ForceReload, Version)
|
||||
End Sub
|
||||
''' <summary>
|
||||
''' 写入某个未经加密的设置项。
|
||||
''' 若该设置项经过了加密,则会抛出异常。
|
||||
''' </summary>
|
||||
Public Sub SetSafe(Key As String, Value As Object, Optional ForceReload As Boolean = False, Optional Version As McVersion = Nothing)
|
||||
If SetupDict(Key).Encoded Then Throw New InvalidOperationException("禁止写入加密设置项:" & Key)
|
||||
[Set](Key, Version, ForceReload, Version)
|
||||
End Sub
|
||||
Private Sub [Set](Key As String, Value As Object, E As SetupEntry, ForceReload As Boolean, Version As McVersion)
|
||||
Try
|
||||
|
||||
@@ -258,7 +266,7 @@
|
||||
If E.Encoded Then
|
||||
Try
|
||||
If Value Is Nothing Then Value = ""
|
||||
Value = SecretEncrypt(Value, "PCL" & UniqueAddress)
|
||||
Value = SecretEncrypt(Value, "PCL" & Identify)
|
||||
Catch ex As Exception
|
||||
Log(ex, "加密设置失败:" & Key, LogLevel.Developer)
|
||||
End Try
|
||||
@@ -303,9 +311,17 @@
|
||||
''' 获取某个设置项的值。
|
||||
''' </summary>
|
||||
Public Function [Get](Key As String, Optional Version As McVersion = Nothing)
|
||||
If Not SetupDict.ContainsKey(Key) Then Throw New KeyNotFoundException("未找到设置项:" & Key) With {.Source = Key}
|
||||
If Not SetupDict.ContainsKey(Key) Then Throw New KeyNotFoundException("未找到设置项:" & Key)
|
||||
Return [Get](Key, SetupDict(Key), Version)
|
||||
End Function
|
||||
''' <summary>
|
||||
''' 获取某个未经加密的设置项的值。
|
||||
''' 若该设置项经过了加密,则会抛出异常。
|
||||
''' </summary>
|
||||
Public Function GetSafe(Key As String, Optional Version As McVersion = Nothing)
|
||||
If SetupDict(Key).Encoded Then Throw New InvalidOperationException("禁止读取加密设置项:" & Key)
|
||||
Return [Get](Key, Version)
|
||||
End Function
|
||||
Private Function [Get](Key As String, E As SetupEntry, Version As McVersion)
|
||||
'获取强制值
|
||||
Dim Force As String = ForceValue(Key)
|
||||
@@ -383,7 +399,7 @@
|
||||
SourceValue = E.DefaultValue
|
||||
Else
|
||||
Try
|
||||
SourceValue = SecretDecrypt(SourceValue, "PCL" & UniqueAddress)
|
||||
SourceValue = SecretDecrypt(SourceValue, "PCL" & Identify)
|
||||
Catch ex As Exception
|
||||
Log(ex, "解密设置失败:" & Key, LogLevel.Developer)
|
||||
SourceValue = E.DefaultValue
|
||||
@@ -601,8 +617,7 @@
|
||||
FrmSetupUI.HintCustom.Visibility = Visibility.Visible
|
||||
FrmSetupUI.HintCustomWarn.Visibility = If(Setup.Get("HintCustomWarn"), Visibility.Collapsed, Visibility.Visible)
|
||||
FrmSetupUI.HintCustom.Text = $"从 PCL 文件夹下的 Custom.xaml 读取主页内容。{vbCrLf}你可以手动编辑该文件,向主页添加文本、图片、常用网站、快捷启动等功能。"
|
||||
FrmSetupUI.HintCustom.EventType = ""
|
||||
FrmSetupUI.HintCustom.EventData = ""
|
||||
CustomEventService.SetEventType(FrmSetupUI.HintCustom, CustomEvent.EventType.None)
|
||||
Case 2 '联网
|
||||
FrmSetupUI.PanCustomPreset.Visibility = Visibility.Collapsed
|
||||
FrmSetupUI.PanCustomLocal.Visibility = Visibility.Collapsed
|
||||
@@ -610,8 +625,8 @@
|
||||
FrmSetupUI.HintCustom.Visibility = Visibility.Visible
|
||||
FrmSetupUI.HintCustomWarn.Visibility = If(Setup.Get("HintCustomWarn"), Visibility.Collapsed, Visibility.Visible)
|
||||
FrmSetupUI.HintCustom.Text = $"从指定网址联网获取主页内容。服主也可以用于动态更新服务器公告。{vbCrLf}如果你制作了稳定运行的联网主页,可以点击这条提示投稿,若合格即可加入预设!"
|
||||
FrmSetupUI.HintCustom.EventType = "打开网页"
|
||||
FrmSetupUI.HintCustom.EventData = "https://github.com/Meloong-Git/PCL/discussions/2528"
|
||||
CustomEventService.SetEventType(FrmSetupUI.HintCustom, CustomEvent.EventType.打开网页)
|
||||
CustomEventService.SetEventData(FrmSetupUI.HintCustom, "https://github.com/Meloong-Git/PCL/discussions/2528")
|
||||
Case 3 '预设
|
||||
FrmSetupUI.PanCustomPreset.Visibility = Visibility.Visible
|
||||
FrmSetupUI.PanCustomLocal.Visibility = Visibility.Collapsed
|
||||
|
||||
@@ -41,9 +41,9 @@
|
||||
<local:MyComboBoxItem Content="隔离所有版本" ToolTip="不同版本之间的存档、Mod、资源包等均不互通。
这会导致不同原版版本间的存档不能共用,所以一般不推荐。" />
|
||||
</local:MyComboBox>
|
||||
<TextBlock Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Left" Text="游戏窗口标题" Margin="0,0,25,0" />
|
||||
<local:MyTextBox x:Name="TextArgumentTitle" Grid.Row="2" Grid.ColumnSpan="2" Tag="LaunchArgumentTitle" Grid.Column="1" ToolTip="自定义游戏窗口的标题,若留空则不进行更改。
支持以下替换标记:
 · {user}:玩家名字
 · {login}:玩家的登录方式
 · {name}:游戏版本名
 · {date}、{time}:当前的系统时间
 · {version}:游戏对应的原版版本号" HintText="默认" MaxLength="100" />
|
||||
<local:MyTextBox x:Name="TextArgumentTitle" Grid.Row="2" Grid.ColumnSpan="2" Tag="LaunchArgumentTitle" Grid.Column="1" ToolTip="自定义游戏窗口的标题,若留空则不进行更改。
你可以用替换标记来动态改变其内容,在 更多 → 帮助 中搜索 “替换标记” 以了解用法。" HintText="默认" MaxLength="100" />
|
||||
<TextBlock Grid.Row="4" VerticalAlignment="Center" HorizontalAlignment="Left" Text="自定义信息" Margin="0,0,25,0" />
|
||||
<local:MyTextBox x:Name="TextArgumentInfo" Grid.Row="4" Grid.ColumnSpan="2" Tag="LaunchArgumentInfo" Text="PCL" Grid.Column="1" ToolTip="该信息会显示在游戏主界面的左下角,与 F3 调试页面的左上角">
|
||||
<local:MyTextBox x:Name="TextArgumentInfo" Grid.Row="4" Grid.ColumnSpan="2" Tag="LaunchArgumentInfo" Text="PCL" Grid.Column="1" ToolTip="该信息会显示在游戏主界面的左下角,与 F3 调试页面的左上角。
你可以用替换标记来动态改变其内容,在 更多 → 帮助 中搜索 “替换标记” 以了解用法。">
|
||||
<local:MyTextBox.ValidateRules>
|
||||
<local:ValidateExcept>
|
||||
<local:ValidateExcept.Excepts>
|
||||
@@ -240,13 +240,13 @@
|
||||
ToolTip="还原" ToolTipService.Placement="Right" ToolTipService.InitialShowDelay="200" ToolTipService.VerticalOffset="-1"
|
||||
Logo="M530 0c287 0 521 229 521 511s-233 511-521 511c-233 0-436-151-500-368a63 63 0 0 1 44-79 65 65 0 0 1 80 43c48 162 200 276 375 276 215 0 390-171 390-383s-174-383-390-383c-103 0-199 39-270 106l21-5a63 63 0 0 1 33 123l-157 42a65 65 0 0 1-90-42l-49-183a65 65 0 1 1 126-33l6 26A524 524 0 0 1 530 0z" LogoScale="0.9" />
|
||||
</StackPanel>
|
||||
<local:MyTextBox x:Name="TextAdvanceJvm" Grid.ColumnSpan="2" Tag="LaunchAdvanceJvm" Grid.Column="1" ToolTip="启动 Minecraft 时使用的额外 JVM 参数,除非有确定把握,否则请不要修改。
支持 Minecraft 版本 JSON 中的字符串替换标记,例如 ${library_directory}。" MaxLength="4000"
|
||||
<local:MyTextBox x:Name="TextAdvanceJvm" Grid.ColumnSpan="2" Tag="LaunchAdvanceJvm" Grid.Column="1" ToolTip="启动 Minecraft 时使用的额外 JVM 参数,除非有确定把握,否则请不要修改。

支持 Minecraft 版本 JSON 中的字符串替换标记,例如 ${library_directory}。
也支持使用 PCL 的替换标记,在 更多 → 帮助 中搜索 “替换标记” 以了解用法。" MaxLength="4000"
|
||||
Height="100" AcceptsReturn="True" TextWrapping="Wrap" VerticalContentAlignment="Top" Padding="0,5" VerticalScrollBarVisibility="Auto" />
|
||||
<TextBlock Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Left" Text="游戏参数" Margin="0,0,25,0" />
|
||||
<local:MyTextBox x:Name="TextAdvanceGame" Grid.Row="2" Grid.ColumnSpan="2" Tag="LaunchAdvanceGame" Grid.Column="1" ToolTip="文本框中的内容将会被直接拼合在启动参数的末尾。
例如,输入 --demo 则会以试玩模式启动游戏。
支持 Minecraft 版本 JSON 中的字符串替换标记,例如 ${library_directory}。" />
|
||||
<local:MyTextBox x:Name="TextAdvanceGame" Grid.Row="2" Grid.ColumnSpan="2" Tag="LaunchAdvanceGame" Grid.Column="1" ToolTip="文本框中的内容将会被直接拼合在启动参数的末尾。
例如,输入 --demo 则会以试玩模式启动游戏。

支持 Minecraft 版本 JSON 中的字符串替换标记,例如 ${library_directory}。
也支持使用 PCL 的替换标记,在 更多 → 帮助 中搜索 “替换标记” 以了解用法。" />
|
||||
<TextBlock Grid.Row="4" VerticalAlignment="Center" HorizontalAlignment="Left" Text="启动前执行命令" Margin="0,0,25,0" />
|
||||
<local:MyTextBox x:Name="TextAdvanceRun" Grid.Row="4" Grid.ColumnSpan="2" Tag="LaunchAdvanceRun" Grid.Column="1" HintText=""
|
||||
ToolTip="在 MC 启动前执行特定命令或程序,语法与 Windows 的命令提示符一致。

可以使用以下替换标记实现相对路径(路径均以 \ 结尾):
 · {path}:PCL 的 exe 文件所在的文件夹
 · {minecraft}:.minecraft 文件夹
 · {verpath}:版本文件夹(.minecraft\versions\版本名\)
 · {verindie}:开启版本隔离时等同版本文件夹,未开启时等同 .minecraft 文件夹
 · {java}:游戏运行时的 Java 文件夹

除此之外,也支持以下替换标记:
 · {user}:玩家名字
 · {login}:玩家的登录方式
 · {uuid}:玩家的 UUID
 · {name}:游戏版本名
 · {date}、{time}:当前的系统时间
 · {version}:游戏对应的原版版本号

例如:
 · "{verpath}test.exe" :运行版本文件夹下的 test.exe 程序
 · "{java}java.exe" -jar "{verpath}test.jar" :用 Java 运行版本文件夹下的 test.jar
 · notepad "{verindie}options.txt" :使用记事本打开该版本的设置文件

涉及路径的操作最好都打上双引号,以避免路径中的空格导致运行失败。
执行命令时,命令行所在的目录是当前的 .minecraft 文件夹。" />
|
||||
ToolTip="在 MC 启动前执行特定命令或程序,语法与 Windows 的命令提示符一致。

你可以用替换标记来动态改变其内容或实现相对路径,在 更多 → 帮助 中搜索 “替换标记” 以了解用法。例如:
 · "{verpath}test.exe" :运行版本文件夹下的 test.exe 程序
 · "{java}java.exe" -jar "{verpath}test.jar" :用 Java 运行版本文件夹下的 test.jar
 · notepad "{verindie}options.txt" :使用记事本打开该版本的设置文件

涉及路径的操作最好都打上双引号,以避免路径中的空格导致运行失败。
执行命令时,命令行所在的目录是当前的 .minecraft 文件夹。" />
|
||||
<local:MyCheckBox Grid.Row="5" Grid.Column="1" x:Name="CheckAdvanceRunWait" Tag="LaunchAdvanceRunWait" Visibility="Collapsed"
|
||||
Text="等待命令执行完成后再继续启动" Margin="0,8,0,7" />
|
||||
<StackPanel Margin="0,12,0,4" Grid.Row="6" Grid.ColumnSpan="2" HorizontalAlignment="Left">
|
||||
|
||||
@@ -93,7 +93,7 @@
|
||||
JavaSearchLoader.Start(IsForceRestart:=True)
|
||||
|
||||
Log("[Setup] 已初始化启动设置")
|
||||
Hint("已初始化启动设置!", HintType.Finish, False)
|
||||
Hint("已初始化启动设置!", HintType.Green, False)
|
||||
Catch ex As Exception
|
||||
Log(ex, "初始化启动设置失败", LogLevel.Msgbox)
|
||||
End Try
|
||||
@@ -170,7 +170,7 @@
|
||||
Try
|
||||
File.Delete(PathAppdata & "CustomSkin.png")
|
||||
RadioSkinType0.SetChecked(True, True)
|
||||
Hint("离线皮肤已清空!", HintType.Finish)
|
||||
Hint("离线皮肤已清空!", HintType.Green)
|
||||
Catch ex As Exception
|
||||
Log(ex, "清空离线皮肤失败", LogLevel.Msgbox)
|
||||
End Try
|
||||
@@ -468,7 +468,7 @@ PreFin:
|
||||
'手动选择
|
||||
Private Sub BtnArgumentJavaSelect_Click(sender As Object, e As EventArgs) Handles BtnArgumentJavaSelect.Click
|
||||
If JavaSearchLoader.State = LoadState.Loading Then
|
||||
Hint("正在搜索 Java,请稍候!", HintType.Critical)
|
||||
Hint("正在搜索 Java,请稍候!", HintType.Red)
|
||||
Return
|
||||
End If
|
||||
'选择 Java
|
||||
@@ -489,7 +489,7 @@ PreFin:
|
||||
Setup.Set("LaunchArgumentJavaAll", JavaNewList.ToString(Newtonsoft.Json.Formatting.None))
|
||||
'重新加载列表
|
||||
JavaSearchLoader.Start(IsForceRestart:=True)
|
||||
Hint("已将该 Java 加入 Java 列表!", HintType.Finish)
|
||||
Hint("已将该 Java 加入 Java 列表!", HintType.Green)
|
||||
Catch ex As Exception
|
||||
Log(ex, "该 Java 存在异常,无法使用", LogLevel.Msgbox, "异常的 Java")
|
||||
Return
|
||||
@@ -498,7 +498,7 @@ PreFin:
|
||||
'自动查找
|
||||
Private Sub BtnArgumentJavaSearch_Click(sender As Object, e As EventArgs) Handles BtnArgumentJavaSearch.Click
|
||||
If JavaSearchLoader.State = LoadState.Loading Then
|
||||
Hint("正在搜索 Java,请稍候!", HintType.Critical)
|
||||
Hint("正在搜索 Java,请稍候!", HintType.Red)
|
||||
Return
|
||||
End If
|
||||
RunInThread(
|
||||
@@ -506,9 +506,9 @@ PreFin:
|
||||
Hint("正在搜索 Java!")
|
||||
JavaSearchLoader.WaitForExit(IsForceRestart:=True)
|
||||
If Not JavaList.Any() Then
|
||||
Hint("未找到可用的 Java!", HintType.Critical)
|
||||
Hint("未找到可用的 Java!", HintType.Red)
|
||||
Else
|
||||
Hint("已找到 " & JavaList.Count & " 个 Java,请检查下拉框查看列表!", HintType.Finish)
|
||||
Hint("已找到 " & JavaList.Count & " 个 Java,请检查下拉框查看列表!", HintType.Green)
|
||||
End If
|
||||
End Sub)
|
||||
End Sub
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
Setup.Reset("LinkHiperCertWarn")
|
||||
|
||||
Log("[Setup] 已初始化联机页设置")
|
||||
Hint("已初始化联机页设置!", HintType.Finish, False)
|
||||
Hint("已初始化联机页设置!", HintType.Green, False)
|
||||
Catch ex As Exception
|
||||
Log(ex, "初始化联机页设置失败", LogLevel.Msgbox)
|
||||
End Try
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
Setup.Reset("SystemSystemTelemetry")
|
||||
|
||||
Log("[Setup] 已初始化启动器页设置")
|
||||
Hint("已初始化启动器页设置!", HintType.Finish, False)
|
||||
Hint("已初始化启动器页设置!", HintType.Green, False)
|
||||
Catch ex As Exception
|
||||
Log(ex, "初始化启动器页设置失败", LogLevel.Msgbox)
|
||||
End Try
|
||||
@@ -136,7 +136,7 @@
|
||||
|
||||
'识别码/解锁码替代入口
|
||||
Private Sub BtnSystemIdentify_Click(sender As Object, e As MouseButtonEventArgs) Handles BtnSystemIdentify.Click
|
||||
PageOtherAbout.CopyUniqueAddress()
|
||||
PageOtherAbout.CopyIdentify()
|
||||
End Sub
|
||||
Private Sub BtnSystemUnlock_Click(sender As Object, e As MouseButtonEventArgs) Handles BtnSystemUnlock.Click
|
||||
DonateCodeInput()
|
||||
|
||||
@@ -225,7 +225,8 @@
|
||||
<ColumnDefinition />
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock VerticalAlignment="Center" HorizontalAlignment="Left" Text="下载地址" Margin="0,0,25,0" />
|
||||
<local:MyTextBox x:Name="TextCustomNet" Tag="UiCustomNet" Grid.Column="1" MaxHeight="28">
|
||||
<local:MyTextBox x:Name="TextCustomNet" Tag="UiCustomNet" Grid.Column="1" MaxHeight="28"
|
||||
ToolTip="你可以用替换标记动态改变网址,以传入参数或变量。
在 更多 → 帮助 中搜索 “替换标记” 以了解用法。">
|
||||
<local:MyTextBox.ValidateRules>
|
||||
<local:ValidateNullable />
|
||||
<local:ValidateHttp />
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
Setup.Reset("UiHiddenOtherTest")
|
||||
|
||||
Log("[Setup] 已初始化个性化设置!")
|
||||
Hint("已初始化个性化设置", HintType.Finish, False)
|
||||
Hint("已初始化个性化设置", HintType.Green, False)
|
||||
Catch ex As Exception
|
||||
Log(ex, "初始化个性化设置失败", LogLevel.Msgbox)
|
||||
End Try
|
||||
@@ -215,7 +215,7 @@
|
||||
If MyMsgBox("即将删除背景图片文件夹中的所有文件。" & vbCrLf & "此操作不可撤销,是否确定?", "警告",, "取消", IsWarn:=True) = 1 Then
|
||||
DeleteDirectory(Path & "PCL\Pictures")
|
||||
BackgroundRefresh(False, True)
|
||||
Hint("背景图片已清空!", HintType.Finish)
|
||||
Hint("背景图片已清空!", HintType.Green)
|
||||
End If
|
||||
End Sub
|
||||
''' <summary>
|
||||
@@ -238,10 +238,10 @@
|
||||
If Not Pic.Any() Then
|
||||
If Refresh Then
|
||||
If FrmMain.ImgBack.Visibility = Visibility.Collapsed Then
|
||||
If IsHint Then Hint("未检测到可用背景图片!", HintType.Critical)
|
||||
If IsHint Then Hint("未检测到可用背景图片!", HintType.Red)
|
||||
Else
|
||||
FrmMain.ImgBack.Visibility = Visibility.Collapsed
|
||||
If IsHint Then Hint("背景图片已清除!", HintType.Finish)
|
||||
If IsHint Then Hint("背景图片已清除!", HintType.Green)
|
||||
End If
|
||||
End If
|
||||
If Not IsNothing(FrmSetupUI) Then FrmSetupUI.BackgroundRefreshUI(False, 0)
|
||||
@@ -253,7 +253,7 @@
|
||||
FrmMain.ImgBack.Background = New MyBitmap(Address)
|
||||
Setup.Load("UiBackgroundSuit", True)
|
||||
FrmMain.ImgBack.Visibility = Visibility.Visible
|
||||
If IsHint Then Hint("背景图片已刷新:" & GetFileNameFromPath(Address), HintType.Finish, False)
|
||||
If IsHint Then Hint("背景图片已刷新:" & GetFileNameFromPath(Address), HintType.Green, False)
|
||||
Catch ex As Exception
|
||||
If ex.Message.Contains("参数无效") Then
|
||||
Log("刷新背景图片失败,该图片文件可能并非标准格式。" & vbCrLf &
|
||||
@@ -338,7 +338,7 @@ Refresh:
|
||||
Try
|
||||
File.Delete(Path & "PCL\Logo.png")
|
||||
RadioLogoType1.SetChecked(True, True)
|
||||
Hint("标题栏图片已清空!", HintType.Finish)
|
||||
Hint("标题栏图片已清空!", HintType.Green)
|
||||
Catch ex As Exception
|
||||
Log(ex, "清空标题栏图片失败", LogLevel.Msgbox)
|
||||
End Try
|
||||
@@ -381,7 +381,7 @@ Refresh:
|
||||
'删除文件
|
||||
Try
|
||||
DeleteDirectory(Path & "PCL\Musics")
|
||||
Hint("背景音乐已删除!", HintType.Finish)
|
||||
Hint("背景音乐已删除!", HintType.Green)
|
||||
Catch ex As Exception
|
||||
Log(ex, "删除背景音乐失败", LogLevel.Msgbox)
|
||||
End Try
|
||||
@@ -410,7 +410,7 @@ Refresh:
|
||||
If MyMsgBox("当前已存在布局文件,继续生成教学文件将会覆盖现有布局文件!", "覆盖确认", "继续", "取消", IsWarn:=True) = 2 Then Return
|
||||
End If
|
||||
WriteFile(Path & "PCL\Custom.xaml", GetResources("Custom"))
|
||||
Hint("教学文件已生成!", HintType.Finish)
|
||||
Hint("教学文件已生成!", HintType.Green)
|
||||
OpenExplorer(Path & "PCL\Custom.xaml")
|
||||
Catch ex As Exception
|
||||
Log(ex, "生成教学文件失败", LogLevel.Feedback)
|
||||
@@ -418,7 +418,7 @@ Refresh:
|
||||
End Sub
|
||||
Private Sub BtnCustomRefresh_Click() Handles BtnCustomRefresh.Click
|
||||
FrmLaunchRight.ForceRefresh()
|
||||
Hint("已刷新主页!", HintType.Finish)
|
||||
Hint("已刷新主页!", HintType.Green)
|
||||
End Sub
|
||||
Private Sub BtnCustomTutorial_Click(sender As Object, e As EventArgs) Handles BtnCustomTutorial.Click
|
||||
MyMsgBox("1. 点击 生成教学文件 按钮,这会在 PCL 文件夹下生成 Custom.xaml 布局文件。" & vbCrLf &
|
||||
|
||||
Reference in New Issue
Block a user