Public Class PageSetupLaunch Private Sub PageSetupLaunch_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded '重复加载部分 PanBack.ScrollToHome() RefreshRam(False) BtnSwitch.Visibility = If(McInstanceSelected Is Nothing, Visibility.Collapsed, Visibility.Visible) '非重复加载部分 Static Reloaded As Boolean = False If Reloaded Then Return Reloaded = True AniControlEnabled += 1 Refresh() AniControlEnabled -= 1 '内存自动刷新 Dim timer As New Threading.DispatcherTimer With {.Interval = New TimeSpan(0, 0, 0, 1)} AddHandler timer.Tick, AddressOf RefreshRam timer.Start() End Sub Public Sub Refresh() Try SettingService.RefreshSettings(Me) UpdateSkinType() UpdateRamType() UpdateJavaComboBox() Catch ex As NullReferenceException Logger.Error(ex, "启动设置项存在异常,已被自动重置", LogBehavior.Alert) Reset() Catch ex As Exception Logger.Error(ex, "重载启动设置时出错") End Try End Sub Public Sub Reset() Try SettingService.ResetSettings(Me) Settings.Set("LaunchArgumentIndieV2", Settings.GetDefault("LaunchArgumentIndieV2")) Settings.Reset("LaunchArgumentJavaAll") Settings.Reset("LaunchArgumentJavaSelect") JavaSearchLoader.Start(IsForceRestart:=True) Hint("已初始化启动设置!", HintType.Green) Catch ex As Exception Logger.Error(ex, "初始化启动设置失败", LogBehavior.Alert) End Try Refresh() End Sub #Region "离线皮肤" Private Sub BtnSkinChange_Click(sender As Object, e As EventArgs) Handles BtnSkinChange.Click Dim SkinInfo As McSkinInfo = McSkinSelect() If Not SkinInfo.IsVaild Then Return ChangeSkin(SkinInfo) End Sub Private Sub RadioSkinType3_Check(sender As Object, e As RouteEventArgs) Handles RadioSkinType4.PreviewCheck If Not (AniControlEnabled = 0 AndAlso e.RaiseByMouse) Then Return '已有图片则不再选择 If FileUtils.Exists(PathAppdata & "CustomSkin.png") Then Return '没有图片则要求选择 Dim SkinInfo As McSkinInfo = McSkinSelect() If Not SkinInfo.IsVaild Then e.Handled = True Return End If '正式改变 If Not ChangeSkin(SkinInfo) Then e.Handled = True End Sub '返回是否成功改变 Private Function ChangeSkin(SkinInfo As McSkinInfo) As Boolean Try '复制文件 FileUtils.Copy(SkinInfo.LocalFile, PathAppdata & "CustomSkin.png") '将单层皮肤扩展到双层 Dim Bitmap As New MyBitmap(PathAppdata & "CustomSkin.png") If Bitmap.Pic.Width = 64 AndAlso Bitmap.Pic.Height = 32 Then Dim Img As System.Drawing.Image = Bitmap Dim NewBitmap As New System.Drawing.Bitmap(64, 64) Using g As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(NewBitmap) g.DrawImageUnscaled(Img, New System.Drawing.Point(0, 0)) End Using FileUtils.Delete(PathAppdata & "CustomSkin.png") NewBitmap.Save(PathAppdata & "CustomSkin.png") End If '更新设置 Settings.Set("LaunchSkinSlim", SkinInfo.IsSlim) Return True Catch ex As Exception Logger.Error(ex, "改变离线皮肤失败", LogBehavior.Alert) Return False Finally '设置当前显示 PageLaunchLeft.SkinLegacy.Start(IsForceRestart:=True) End Try End Function Private Sub BtnSkinDelete_Click(sender As Object, e As EventArgs) Handles BtnSkinDelete.Click Try FileUtils.Delete(PathAppdata & "CustomSkin.png") RadioSkinType0.SetChecked(True, True) Hint("离线皮肤已清空!", HintType.Green) Catch ex As Exception Logger.Error(ex, "清空离线皮肤失败", LogBehavior.Alert) End Try End Sub Private Sub BtnSkinSave_Click(sender As Object, e As EventArgs) Handles BtnSkinSave.Click MySkin.Save(PageLaunchLeft.SkinLegacy) End Sub Private Sub BtnSkinCache_Click(sender As Object, e As EventArgs) Handles BtnSkinCache.Click MySkin.RefreshCache(Nothing) End Sub Public Shared Sub UpdateSkinType() PageLaunchLeft.SkinLegacy.Start() '设置 UI 改变 If FrmSetupLaunch Is Nothing Then Return Select Case Settings.Get(Of Integer)("LaunchSkinType") Case 0, 1, 2 '默认 FrmSetupLaunch.PanSkinID.Visibility = Visibility.Collapsed FrmSetupLaunch.PanSkinChange.Visibility = Visibility.Collapsed Case 3 '正版 FrmSetupLaunch.PanSkinID.Visibility = Visibility.Visible FrmSetupLaunch.PanSkinChange.Visibility = Visibility.Collapsed Case 4 '自定义 FrmSetupLaunch.PanSkinID.Visibility = Visibility.Collapsed FrmSetupLaunch.PanSkinChange.Visibility = Visibility.Visible End Select FrmSetupLaunch.CardSkin.TriggerForceResize() End Sub #End Region #Region "游戏内存" Public Shared Sub UpdateRamType() If FrmSetupLaunch?.SliderRamCustom Is Nothing Then Return FrmSetupLaunch.SliderRamCustom.IsEnabled = Settings.Get(Of Integer)("LaunchRamType") = 1 End Sub ''' ''' 刷新 UI 上的 RAM 显示。 ''' Public Sub RefreshRam(ShowAnim As Boolean) If LabRamGame Is Nothing OrElse LabRamUsed Is Nothing OrElse FrmMain.PageCurrent <> FormMain.PageType.Setup OrElse FrmSetupLeft.PageID <> FormMain.PageSubType.SetupLaunch Then Return '获取内存情况 Dim RamGame As Double = Math.Round(GetRam(McInstanceSelected, False), 5) Dim RamTotal As Double = Math.Round(My.Computer.Info.TotalPhysicalMemory / 1024 / 1024 / 1024, 1) Dim RamAvailable As Double = Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024, 1) Dim RamGameActual As Double = Math.Round(Math.Min(RamGame, RamAvailable), 5) Dim RamUsed As Double = Math.Round(RamTotal - RamAvailable, 5) Dim RamEmpty As Double = Math.Round((RamTotal - RamUsed - RamGame).Clamp(0, 1000), 1) '设置最大可用内存 If RamTotal <= 1.5 Then SliderRamCustom.MaxValue = Math.Max(Math.Floor((RamTotal - 0.3) / 0.1), 1) ElseIf RamTotal <= 8 Then SliderRamCustom.MaxValue = Math.Floor((RamTotal - 1.5) / 0.5) + 12 ElseIf RamTotal <= 16 Then SliderRamCustom.MaxValue = Math.Floor((RamTotal - 8) / 1) + 25 Else SliderRamCustom.MaxValue = Math.Floor((RamTotal - 16) / 2) + 33 End If '设置文本 LabRamGame.Text = If(RamGame = Math.Floor(RamGame), RamGame & ".0", RamGame) & " GB" & If(RamGame <> RamGameActual, " (可用 " & If(RamGameActual = Math.Floor(RamGameActual), RamGameActual & ".0", RamGameActual) & " GB)", "") LabRamUsed.Text = If(RamUsed = Math.Floor(RamUsed), RamUsed & ".0", RamUsed) & " GB" LabRamTotal.Text = " / " & If(RamTotal = Math.Floor(RamTotal), RamTotal & ".0", RamTotal) & " GB" LabRamWarn.Visibility = If(RamGame = 1 AndAlso Not JavaIs64Bit() AndAlso Not Is32BitSystem AndAlso JavaList.Any, Visibility.Visible, Visibility.Collapsed) If ShowAnim Then '宽度动画 AniStart({ AaGridLengthWidth(ColumnRamUsed, RamUsed - ColumnRamUsed.Width.Value, 800,, New AniEaseOutFluent(AniEasePower.Strong)), AaGridLengthWidth(ColumnRamGame, RamGameActual - ColumnRamGame.Width.Value, 800,, New AniEaseOutFluent(AniEasePower.Strong)), AaGridLengthWidth(ColumnRamEmpty, RamEmpty - ColumnRamEmpty.Width.Value, 800,, New AniEaseOutFluent(AniEasePower.Strong)) }, "SetupLaunch Ram Grid") Else '宽度设置 ColumnRamUsed.Width = New GridLength(RamUsed, GridUnitType.Star) ColumnRamGame.Width = New GridLength(RamGameActual, GridUnitType.Star) ColumnRamEmpty.Width = New GridLength(RamEmpty, GridUnitType.Star) End If End Sub Private Sub RefreshRam() Handles SliderRamCustom.Change, RadioRamType0.Check, RadioRamType1.Check RefreshRam(True) End Sub Private RamTextLeft As Integer = 2, RamTextRight As Integer = 1 ''' ''' 刷新 UI 上的文本位置。 ''' Private Sub RefreshRamText() Handles RectRamGame.SizeChanged, RectRamEmpty.SizeChanged, LabRamGame.SizeChanged '获取宽度信息 Dim RectUsedWidth = RectRamUsed.ActualWidth Dim TotalWidth = PanRamDisplay.ActualWidth Dim LabGameWidth = LabRamGame.ActualWidth, LabUsedWidth = LabRamUsed.ActualWidth, LabTotalWidth = LabRamTotal.ActualWidth Dim LabGameTitleWidth = LabRamGameTitle.ActualWidth, LabUsedTitleWidth = LabRamUsedTitle.ActualWidth '左侧 Dim Left As Integer If RectUsedWidth - 30 < LabUsedWidth OrElse RectUsedWidth - 30 < LabUsedTitleWidth Then '全写不下了 Left = 0 ElseIf RectUsedWidth - 25 < (LabUsedWidth + LabTotalWidth) Then '显示不下完整数据 Left = 1 Else '正常 Left = 2 End If If RamTextLeft <> Left Then RamTextLeft = Left Select Case Left Case 0 AniStart({ AaOpacity(LabRamUsed, -LabRamUsed.Opacity, 100), AaOpacity(LabRamTotal, -LabRamTotal.Opacity, 100), AaOpacity(LabRamUsedTitle, -LabRamUsedTitle.Opacity, 100) }, "SetupLaunch Ram TextLeft") Case 1 AniStart({ AaOpacity(LabRamUsed, 1 - LabRamUsed.Opacity, 100), AaOpacity(LabRamTotal, -LabRamTotal.Opacity, 100), AaOpacity(LabRamUsedTitle, 0.7 - LabRamUsedTitle.Opacity, 100) }, "SetupLaunch Ram TextLeft") Case 2 AniStart({ AaOpacity(LabRamUsed, 1 - LabRamUsed.Opacity, 100), AaOpacity(LabRamTotal, 1 - LabRamTotal.Opacity, 100), AaOpacity(LabRamUsedTitle, 0.7 - LabRamUsedTitle.Opacity, 100) }, "SetupLaunch Ram TextLeft") End Select End If '右侧 Dim Right As Integer If TotalWidth < LabGameWidth + 2 + RectUsedWidth OrElse TotalWidth < LabGameTitleWidth + 2 + RectUsedWidth Then '挤到最右边 Right = 0 Else '正常情况 Right = 1 End If If Right = 0 Then If AniControlEnabled = 0 AndAlso (RamTextRight <> Right OrElse AniIsRun("SetupLaunch Ram TextRight")) Then '需要动画 AniStart({ AaX(LabRamGame, TotalWidth - LabGameWidth - LabRamGame.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak)), AaX(LabRamGameTitle, TotalWidth - LabGameTitleWidth - LabRamGameTitle.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak)) }, "SetupLaunch Ram TextRight") Else '不需要动画 AniStop("SetupLaunch Ram TextRight") LabRamGame.Margin = New Thickness(TotalWidth - LabGameWidth, 3, 0, 0) LabRamGameTitle.Margin = New Thickness(TotalWidth - LabGameTitleWidth, 0, 0, 5) End If Else If AniControlEnabled = 0 AndAlso (RamTextRight <> Right OrElse AniIsRun("SetupLaunch Ram TextRight")) Then '需要动画 AniStart({ AaX(LabRamGame, 2 + RectUsedWidth - LabRamGame.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak)), AaX(LabRamGameTitle, 2 + RectUsedWidth - LabRamGameTitle.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak)) }, "SetupLaunch Ram TextRight") Else '不需要动画 AniStop("SetupLaunch Ram TextRight") LabRamGame.Margin = New Thickness(2 + RectUsedWidth, 3, 0, 0) LabRamGameTitle.Margin = New Thickness(2 + RectUsedWidth, 0, 0, 5) End If End If RamTextRight = Right End Sub ''' ''' 获取当前设置的 RAM 值。单位为 GB。 ''' Public Shared Function GetRam(Instance As McInstance, UseVersionJavaSetup As Boolean, Optional Is32BitJava As Boolean? = Nothing) As Double '------------------------------------------ ' 修改下方代码时需要一并修改 PageInstanceSetup '------------------------------------------ Dim RamGive As Double If Settings.Get(Of Integer)("LaunchRamType") = 0 Then '自动配置 Dim RamAvailable As Double = Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024 * 10) / 10 '确定需求的内存值 Dim RamMininum As Double '无论如何也需要保证的最低限度内存 Dim RamTarget1 As Double '估计能勉强带动了的内存 Dim RamTarget2 As Double '估计没啥问题了的内存 Dim RamTarget3 As Double '放一百万个材质和 Mod 和光影需要的内存 If Instance IsNot Nothing AndAlso Not Instance.IsLoaded Then Instance.Load() If Instance IsNot Nothing AndAlso Instance.Modable Then '可安装 Mod 的版本 Dim ModDir = DirectoryUtils.GetInfo(Instance.PathIndie & "mods\") Dim ModCount As Integer = If(ModDir.Exists, ModDir.GetFiles.Count(Function(f) {".jar", ".zip", ".litemod"}.Contains(f.Extension.Lower)), 0) RamMininum = 0.5 + ModCount / 150 RamTarget1 = 1.5 + ModCount / 90 RamTarget2 = 2.7 + ModCount / 50 RamTarget3 = 4.5 + ModCount / 25 ElseIf Instance IsNot Nothing AndAlso Instance.Version.HasOptiFine Then 'OptiFine 版本 RamMininum = 0.5 RamTarget1 = 1.5 RamTarget2 = 3 RamTarget3 = 5 Else '普通版本 RamMininum = 0.5 RamTarget1 = 1.5 RamTarget2 = 2.5 RamTarget3 = 4 End If Dim RamDelta As Double '预分配内存,阶段一,0 ~ T1,100% RamDelta = RamTarget1 RamGive += Math.Min(RamAvailable, RamDelta) RamAvailable -= RamDelta If RamAvailable < 0.1 Then GoTo PreFin '预分配内存,阶段二,T1 ~ T2,70% RamDelta = RamTarget2 - RamTarget1 RamGive += Math.Min(RamAvailable * 0.7, RamDelta) RamAvailable -= RamDelta / 0.7 If RamAvailable < 0.1 Then GoTo PreFin '预分配内存,阶段三,T2 ~ T3,40% RamDelta = RamTarget3 - RamTarget2 RamGive += Math.Min(RamAvailable * 0.4, RamDelta) RamAvailable -= RamDelta / 0.4 If RamAvailable < 0.1 Then GoTo PreFin '预分配内存,阶段四,T3 ~ T3 * 2,15% RamDelta = RamTarget3 RamGive += Math.Min(RamAvailable * 0.15, RamDelta) RamAvailable -= RamDelta / 0.15 If RamAvailable < 0.1 Then GoTo PreFin PreFin: '不低于最低值 RamGive = Math.Round(Math.Max(RamGive, RamMininum), 1) Else '手动配置 Dim Value = Settings.Get(Of Integer)("LaunchRamCustom") If Value <= 12 Then RamGive = Value * 0.1 + 0.3 ElseIf Value <= 25 Then RamGive = (Value - 12) * 0.5 + 1.5 ElseIf Value <= 33 Then RamGive = (Value - 25) * 1 + 8 Else RamGive = (Value - 33) * 2 + 16 End If End If '若使用 32 位 Java,则限制为 1G If If(Is32BitJava, Not JavaIs64Bit(If(UseVersionJavaSetup, Instance, Nothing))) Then RamGive = Math.Min(1, RamGive) Return RamGive End Function #End Region #Region "Java 选择" '刷新 Java 下拉框显示 Public Sub UpdateJavaComboBox() If ComboArgumentJava Is Nothing Then Return '初始化列表 ComboArgumentJava.Items.Clear() ComboArgumentJava.Items.Add(New MyComboBoxItem With {.Content = "自动选择(推荐)", .Tag = "自动选择"}) '更新列表 Dim SelectedItem As MyComboBoxItem = Nothing Dim SelectedBySetup As String = Settings.Get(Of String)("LaunchArgumentJavaSelect") Try For Each Java In JavaList.ToList().OrderByDescending(Function(v) v.MajorVersion) Dim ListItem = New MyComboBoxItem With {.Content = Java.ToString, .ToolTip = Java.PathFolder, .Tag = Java} ToolTipService.SetHorizontalOffset(ListItem, 400) ComboArgumentJava.Items.Add(ListItem) '判断人为选中 If SelectedBySetup = "" Then Continue For If JavaEntry.FromJson(GetJson(SelectedBySetup)).PathFolder = Java.PathFolder Then SelectedItem = ListItem Next Catch ex As Exception Settings.Set("LaunchArgumentJavaSelect", "") Logger.Error(ex, "更新设置 Java 下拉框失败") End Try '更新选择项 If SelectedItem Is Nothing AndAlso JavaList.Any Then SelectedItem = ComboArgumentJava.Items(0) '选中 “自动选择” ComboArgumentJava.SelectedItem = SelectedItem '结束处理 If SelectedItem Is Nothing Then ComboArgumentJava.Items.Clear() ComboArgumentJava.Items.Add(New ComboBoxItem With {.Content = "未找到可用的 Java", .IsSelected = True}) End If RefreshRam(True) End Sub '阻止在特定情况下展开下拉框 Private Sub ComboArgumentJava_DropDownOpened(sender As Object, e As EventArgs) Handles ComboArgumentJava.DropDownOpened If ComboArgumentJava.SelectedItem Is Nothing OrElse ComboArgumentJava.Items(0).Content = "未找到可用的 Java" OrElse ComboArgumentJava.Items(0).Content = "加载中……" Then ComboArgumentJava.IsDropDownOpen = False End If End Sub '下拉框选择更改 Private Sub JavaSelectionUpdate() Handles ComboArgumentJava.SelectionChanged If AniControlEnabled <> 0 Then Return 'Java 不可用时也不清空,会导致刷新时找不到对象 If ComboArgumentJava.SelectedItem Is Nothing OrElse ComboArgumentJava.SelectedItem.Tag Is Nothing Then Return '设置新的 Java Dim SelectedJava = ComboArgumentJava.SelectedItem.Tag If "自动选择".Equals(SelectedJava) Then '选择 “自动” Settings.Set("LaunchArgumentJavaSelect", "") Logger.Info("修改 Java 选择设置:自动选择") Else '选择指定项 Settings.Set("LaunchArgumentJavaSelect", CType(SelectedJava.ToJson(), JObject).ToString(Newtonsoft.Json.Formatting.None)) Logger.Info($"修改 Java 选择设置:{SelectedJava}") End If RefreshRam(True) End Sub '手动选择 Private Sub BtnArgumentJavaSelect_Click(sender As Object, e As EventArgs) Handles BtnArgumentJavaSelect.Click If JavaSearchLoader.State = LoadState.Loading Then Hint("正在搜索 Java,请稍候!", HintType.Red) Return End If '选择 Java Dim JavaSelected As String = Dialogs.SelectFile("选择 bin 文件夹中的 javaw.exe 文件", False, filter:={({"exe"}, "javaw.exe")}).FirstOrDefault() If String.IsNullOrEmpty(JavaSelected) Then Return JavaSelected = PathUtils.AddSlashSuffix(PathUtils.RemoveLastPart(JavaSelected)) Try '验证 Java 可用 Dim NewEntry As New JavaEntry(JavaSelected, True) NewEntry.Check() '加入列表 Dim JavaNewList As New JArray From {NewEntry.ToJson} For Each JsonEntry In GetJson(Settings.Get(Of String)("LaunchArgumentJavaAll")) Dim Entry = JavaEntry.FromJson(JsonEntry) If Entry.PathFolder = NewEntry.PathFolder Then Continue For JavaNewList.Add(JsonEntry) Next Settings.Set("LaunchArgumentJavaAll", JavaNewList.ToString(Newtonsoft.Json.Formatting.None)) '重新加载列表 JavaSearchLoader.Start(IsForceRestart:=True) Hint("已将该 Java 加入 Java 列表!", HintType.Green) Catch ex As Exception Logger.Error(ex, "该 Java 存在异常,无法使用", LogBehavior.Alert) Return End Try End Sub '自动查找 Private Sub BtnArgumentJavaSearch_Click(sender As Object, e As EventArgs) Handles BtnArgumentJavaSearch.Click If JavaSearchLoader.State = LoadState.Loading Then Hint("正在搜索 Java,请稍候!", HintType.Red) Return End If RunInThread( Sub() Hint("正在搜索 Java!") JavaSearchLoader.WaitForExit(IsForceRestart:=True) If Not JavaList.Any() Then Hint("未找到可用的 Java!", HintType.Red) Else Hint("已找到 " & JavaList.Count & " 个 Java,请检查下拉框查看列表!", HintType.Green) End If End Sub) End Sub #End Region #Region "其他选项" Private Sub WindowTypeUIRefresh() Handles ComboArgumentWindowType.SelectionChanged Dim IsVisibie = (ComboArgumentWindowType.SelectedIndex = 3).ToVisibility TextArgumentWindowHeight.Visibility = IsVisibie LabArgumentWindowMiddle.Visibility = IsVisibie TextArgumentWindowWidth.Visibility = IsVisibie End Sub '可见性选择直接关闭的警告 Private Sub ComboArgumentVisibie_SizeChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboArgumentVisibie.SelectionChanged If AniControlEnabled <> 0 Then Return If ComboArgumentVisibie.SelectedIndex = 0 Then If MyMsgBox("若在游戏启动后立即关闭启动器,崩溃检测、更改游戏标题等功能将失效。" & vbCrLf & "如果想保留这些功能,可以选择让启动器在游戏启动后隐藏,游戏退出后自动关闭。", "提醒", "继续", "取消") = 2 Then ComboArgumentVisibie.SelectedItem = e.RemovedItems(0) End If End If End Sub '开启自动内存优化的警告 Private Sub CheckArgumentRam_Change() Handles CheckArgumentRam.Change If AniControlEnabled <> 0 Then Return If Not CheckArgumentRam.Checked Then Return If MyMsgBox("内存优化会显著延长启动耗时,建议仅在内存不足时开启。" & vbCrLf & "如果你在使用机械硬盘,这还可能导致一小段时间的严重卡顿。" & If(SystemUtils.HasAdminRole(), "", $"{vbCrLf}{vbCrLf}每次启动游戏,PCL 都需要申请管理员权限以进行内存优化。{vbCrLf}若想自动授予权限,可以右键 PCL,打开 属性 → 兼容性 → 以管理员身份运行此程序。"), "提醒", "确定", "取消") = 2 Then CheckArgumentRam.Checked = False End If End Sub '版本隔离提示 Private Sub ComboArgumentIndie_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboArgumentIndieV2.SelectionChanged If AniControlEnabled <> 0 Then Return MyMsgBox("本设置仅会对之后新安装的版本生效。" & vbCrLf & "如果要修改已安装的版本的隔离方式,请在它的版本独立设置中调整。") End Sub #End Region #Region "高级设置" Private Sub TextAdvanceRun_TextChanged(sender As Object, e As TextChangedEventArgs) Handles TextAdvanceRun.TextChanged CheckAdvanceRunWait.Visibility = If(TextAdvanceRun.Text = "", Visibility.Collapsed, Visibility.Visible) End Sub 'JVM 参数重设 Private Sub TextAdvanceJvm_TextChanged() Handles TextAdvanceJvm.ValidatedTextChanged BtnAdvanceJvmReset.Visibility = If(TextAdvanceJvm.Text = Settings.GetDefault("LaunchAdvanceJvm"), Visibility.Hidden, Visibility.Visible) End Sub Private Sub BtnAdvanceJvmReset_Click(sender As Object, e As EventArgs) Handles BtnAdvanceJvmReset.Click Settings.Reset("LaunchAdvanceJvm") Refresh() End Sub '去除参数中的回车 Private Sub ReplaceEnter(sender As MyTextBox, e As TextChangedEventArgs) Handles TextAdvanceJvm.TextChanged, TextAdvanceGame.TextChanged Dim NewText = sender.Text.ReplaceLineEndings(" ", mergeMultiple:=True) If NewText = sender.Text Then Return Dim CaretIndex = sender.CaretIndex sender.Text = NewText sender.CaretIndex = Math.Max(0, CaretIndex - 1) End Sub #End Region '切换到版本独立设置 Private Sub BtnSwitch_Click(sender As Object, e As MouseButtonEventArgs) Handles BtnSwitch.Click McInstanceSelected.Load() PageInstanceLeft.Instance = McInstanceSelected FrmMain.PageChange(FormMain.PageType.InstanceSetup, FormMain.PageSubType.InstanceSetup) End Sub End Class