PageInstanceSetup.xaml.vb 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  1. Public Class PageInstanceSetup
  2. Private Shadows IsLoaded As Boolean = False
  3. Private Sub PageSetupSystem_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
  4. '重复加载部分
  5. PanBack.ScrollToHome()
  6. RefreshRam(False)
  7. '由于各个版本不同,每次都需要重新加载
  8. AniControlEnabled += 1
  9. Reload()
  10. AniControlEnabled -= 1
  11. '非重复加载部分
  12. If IsLoaded Then Return
  13. IsLoaded = True
  14. '内存自动刷新
  15. Dim timer As New Threading.DispatcherTimer With {.Interval = New TimeSpan(0, 0, 0, 1)}
  16. AddHandler timer.Tick, AddressOf RefreshRam
  17. timer.Start()
  18. End Sub
  19. Public Sub Reload()
  20. Try
  21. '启动参数
  22. Dim _unused = PageInstanceLeft.Instance.PathIndie '触发自动判定
  23. ComboArgumentIndieV2.SelectedIndex = If(Settings.Get("VersionArgumentIndieV2", Instance:=PageInstanceLeft.Instance), 0, 1)
  24. RefreshJavaComboBox()
  25. '服务器
  26. ComboServerLogin.SelectedIndex = Settings.Get("VersionServerLogin", Instance:=PageInstanceLeft.Instance)
  27. ComboServerLoginLast = ComboServerLogin.SelectedIndex
  28. UpdateServerLoginUI()
  29. '高级设置
  30. If Settings.Get("VersionAdvanceAssets", Instance:=PageInstanceLeft.Instance) = 2 Then
  31. Log("[Setup] 已迁移老版本的关闭文件校验设置")
  32. Settings.Reset("VersionAdvanceAssets", Instance:=PageInstanceLeft.Instance)
  33. Settings.Set("VersionAdvanceAssetsV2", True, Instance:=PageInstanceLeft.Instance)
  34. End If
  35. SettingService.RefreshSettings(Me)
  36. '游戏内存
  37. OnVersionRamTypeChanged(Settings.Get("VersionRamType", Instance:=PageInstanceLeft.Instance))
  38. Catch ex As Exception
  39. Log(ex, "重载版本独立设置时出错", NotifyLevel.MsgBoxAndFeedback)
  40. End Try
  41. End Sub
  42. '初始化
  43. Public Sub Reset()
  44. Try
  45. SettingService.ResetSettings(Me)
  46. Settings.Reset("VersionServerLogin", Instance:=PageInstanceLeft.Instance)
  47. Settings.Reset("VersionArgumentIndieV2", Instance:=PageInstanceLeft.Instance)
  48. Settings.Reset("VersionAdvanceAssets", Instance:=PageInstanceLeft.Instance)
  49. Settings.Reset("VersionArgumentJavaSelect", Instance:=PageInstanceLeft.Instance)
  50. JavaSearchLoader.Start(IsForceRestart:=True)
  51. Log("[Setup] 已初始化版本独立设置")
  52. Hint("已初始化版本独立设置!", HintType.Green, False)
  53. Catch ex As Exception
  54. Log(ex, "初始化版本独立设置失败", NotifyLevel.MsgBox)
  55. End Try
  56. Reload()
  57. End Sub
  58. #Region "游戏内存"
  59. Public Shared Sub OnVersionRamTypeChanged(Type As Integer)
  60. If FrmInstanceSetup Is Nothing Then Return
  61. FrmInstanceSetup.RamType(Type)
  62. End Sub
  63. Public Sub RamType(Type As Integer)
  64. If SliderRamCustom Is Nothing Then Return
  65. SliderRamCustom.IsEnabled = (Type = 1)
  66. End Sub
  67. ''' <summary>
  68. ''' 刷新 UI 上的 RAM 显示。
  69. ''' </summary>
  70. Public Sub RefreshRam(ShowAnim As Boolean)
  71. If LabRamGame Is Nothing OrElse LabRamUsed Is Nothing OrElse FrmMain.PageCurrent <> FormMain.PageType.InstanceSetup OrElse FrmInstanceLeft.PageID <> FormMain.PageSubType.InstanceSetup Then Return
  72. '获取内存情况
  73. Dim RamGame As Double = Math.Round(GetRam(PageInstanceLeft.Instance), 5)
  74. Dim RamTotal As Double = Math.Round(My.Computer.Info.TotalPhysicalMemory / 1024 / 1024 / 1024, 1)
  75. Dim RamAvailable As Double = Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024, 1)
  76. Dim RamGameActual As Double = Math.Round(Math.Min(RamGame, RamAvailable), 5)
  77. Dim RamUsed As Double = Math.Round(RamTotal - RamAvailable, 5)
  78. Dim RamEmpty As Double = Math.Round((RamTotal - RamUsed - RamGame).Clamp(0, 1000), 1)
  79. '设置最大可用内存
  80. If RamTotal <= 1.5 Then
  81. SliderRamCustom.MaxValue = Math.Max(Math.Floor((RamTotal - 0.3) / 0.1), 1)
  82. ElseIf RamTotal <= 8 Then
  83. SliderRamCustom.MaxValue = Math.Floor((RamTotal - 1.5) / 0.5) + 12
  84. ElseIf RamTotal <= 16 Then
  85. SliderRamCustom.MaxValue = Math.Floor((RamTotal - 8) / 1) + 25
  86. Else
  87. SliderRamCustom.MaxValue = Math.Floor((RamTotal - 16) / 2) + 33
  88. End If
  89. '设置文本
  90. LabRamGame.Text = If(RamGame = Math.Floor(RamGame), RamGame & ".0", RamGame) & " GB" &
  91. If(RamGame <> RamGameActual, " (可用 " & If(RamGameActual = Math.Floor(RamGameActual), RamGameActual & ".0", RamGameActual) & " GB)", "")
  92. LabRamUsed.Text = If(RamUsed = Math.Floor(RamUsed), RamUsed & ".0", RamUsed) & " GB"
  93. LabRamTotal.Text = " / " & If(RamTotal = Math.Floor(RamTotal), RamTotal & ".0", RamTotal) & " GB"
  94. LabRamWarn.Visibility = If(RamGame = 1 AndAlso Not JavaIs64Bit(PageInstanceLeft.Instance) AndAlso Not Is32BitSystem AndAlso JavaList.Any, Visibility.Visible, Visibility.Collapsed)
  95. If ShowAnim Then
  96. '宽度动画
  97. AniStart({
  98. AaGridLengthWidth(ColumnRamUsed, RamUsed - ColumnRamUsed.Width.Value, 800,, New AniEaseOutFluent(AniEasePower.Strong)),
  99. AaGridLengthWidth(ColumnRamGame, RamGameActual - ColumnRamGame.Width.Value, 800,, New AniEaseOutFluent(AniEasePower.Strong)),
  100. AaGridLengthWidth(ColumnRamEmpty, RamEmpty - ColumnRamEmpty.Width.Value, 800,, New AniEaseOutFluent(AniEasePower.Strong))
  101. }, "VersionSetup Ram Grid")
  102. Else
  103. '宽度设置
  104. ColumnRamUsed.Width = New GridLength(RamUsed, GridUnitType.Star)
  105. ColumnRamGame.Width = New GridLength(RamGameActual, GridUnitType.Star)
  106. ColumnRamEmpty.Width = New GridLength(RamEmpty, GridUnitType.Star)
  107. End If
  108. End Sub
  109. Private Sub RefreshRam() Handles SliderRamCustom.Change, RadioRamType0.Check, RadioRamType1.Check, RadioRamType2.Check
  110. RefreshRam(True)
  111. End Sub
  112. Private RamTextLeft As Integer = 2, RamTextRight As Integer = 1
  113. ''' <summary>
  114. ''' 刷新 UI 上的文本位置。
  115. ''' </summary>
  116. Private Sub RefreshRamText() Handles RectRamGame.SizeChanged, RectRamEmpty.SizeChanged, LabRamGame.SizeChanged
  117. '获取宽度信息
  118. Dim RectUsedWidth = RectRamUsed.ActualWidth
  119. Dim TotalWidth = PanRamDisplay.ActualWidth
  120. Dim LabGameWidth = LabRamGame.ActualWidth, LabUsedWidth = LabRamUsed.ActualWidth, LabTotalWidth = LabRamTotal.ActualWidth
  121. Dim LabGameTitleWidth = LabRamGameTitle.ActualWidth, LabUsedTitleWidth = LabRamUsedTitle.ActualWidth
  122. '左侧
  123. Dim Left As Integer
  124. If RectUsedWidth - 30 < LabUsedWidth OrElse RectUsedWidth - 30 < LabUsedTitleWidth Then
  125. '全写不下了
  126. Left = 0
  127. ElseIf RectUsedWidth - 25 < (LabUsedWidth + LabTotalWidth) Then
  128. '显示不下完整数据
  129. Left = 1
  130. Else
  131. '正常
  132. Left = 2
  133. End If
  134. If RamTextLeft <> Left Then
  135. RamTextLeft = Left
  136. Select Case Left
  137. Case 0
  138. AniStart({
  139. AaOpacity(LabRamUsed, -LabRamUsed.Opacity, 100),
  140. AaOpacity(LabRamTotal, -LabRamTotal.Opacity, 100),
  141. AaOpacity(LabRamUsedTitle, -LabRamUsedTitle.Opacity, 100)
  142. }, "VersionSetup Ram TextLeft")
  143. Case 1
  144. AniStart({
  145. AaOpacity(LabRamUsed, 1 - LabRamUsed.Opacity, 100),
  146. AaOpacity(LabRamTotal, -LabRamTotal.Opacity, 100),
  147. AaOpacity(LabRamUsedTitle, 0.7 - LabRamUsedTitle.Opacity, 100)
  148. }, "VersionSetup Ram TextLeft")
  149. Case 2
  150. AniStart({
  151. AaOpacity(LabRamUsed, 1 - LabRamUsed.Opacity, 100),
  152. AaOpacity(LabRamTotal, 1 - LabRamTotal.Opacity, 100),
  153. AaOpacity(LabRamUsedTitle, 0.7 - LabRamUsedTitle.Opacity, 100)
  154. }, "VersionSetup Ram TextLeft")
  155. End Select
  156. End If
  157. '右侧
  158. Dim Right As Integer
  159. If TotalWidth < LabGameWidth + 2 + RectUsedWidth OrElse TotalWidth < LabGameTitleWidth + 2 + RectUsedWidth Then
  160. '挤到最右边
  161. Right = 0
  162. Else
  163. '正常情况
  164. Right = 1
  165. End If
  166. If Right = 0 Then
  167. If AniControlEnabled = 0 AndAlso (RamTextRight <> Right OrElse AniIsRun("VersionSetup Ram TextRight")) Then
  168. '需要动画
  169. AniStart({
  170. AaX(LabRamGame, TotalWidth - LabGameWidth - LabRamGame.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak)),
  171. AaX(LabRamGameTitle, TotalWidth - LabGameTitleWidth - LabRamGameTitle.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak))
  172. }, "VersionSetup Ram TextRight")
  173. Else
  174. '不需要动画
  175. LabRamGame.Margin = New Thickness(TotalWidth - LabGameWidth, 3, 0, 0)
  176. LabRamGameTitle.Margin = New Thickness(TotalWidth - LabGameTitleWidth, 0, 0, 5)
  177. End If
  178. Else
  179. If AniControlEnabled = 0 AndAlso (RamTextRight <> Right OrElse AniIsRun("VersionSetup Ram TextRight")) Then
  180. '需要动画
  181. AniStart({
  182. AaX(LabRamGame, 2 + RectUsedWidth - LabRamGame.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak)),
  183. AaX(LabRamGameTitle, 2 + RectUsedWidth - LabRamGameTitle.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak))
  184. }, "VersionSetup Ram TextRight")
  185. Else
  186. '不需要动画
  187. LabRamGame.Margin = New Thickness(2 + RectUsedWidth, 3, 0, 0)
  188. LabRamGameTitle.Margin = New Thickness(2 + RectUsedWidth, 0, 0, 5)
  189. End If
  190. End If
  191. RamTextRight = Right
  192. End Sub
  193. ''' <summary>
  194. ''' 获取当前设置的 RAM 值。单位为 GB。
  195. ''' </summary>
  196. Public Shared Function GetRam(Instance As McInstance, Optional Is32BitJava As Boolean? = Nothing) As Double
  197. '跟随全局设置
  198. If Settings.Get("VersionRamType", Instance:=Instance) = 2 Then
  199. Return PageSetupLaunch.GetRam(Instance, True, Is32BitJava)
  200. End If
  201. '------------------------------------------
  202. ' 修改下方代码时需要一并修改 PageSetupLaunch
  203. '------------------------------------------
  204. '使用当前版本的设置
  205. Dim RamGive As Double
  206. If Settings.Get("VersionRamType", Instance:=Instance) = 0 Then
  207. '自动配置
  208. Dim RamAvailable As Double = Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024 * 10) / 10
  209. '确定需求的内存值
  210. Dim RamMininum As Double '无论如何也需要保证的最低限度内存
  211. Dim RamTarget1 As Double '估计能勉强带动了的内存
  212. Dim RamTarget2 As Double '估计没啥问题了的内存
  213. Dim RamTarget3 As Double '安装过多附加组件需要的内存
  214. If Instance IsNot Nothing AndAlso Not Instance.IsLoaded Then Instance.Load()
  215. If Instance IsNot Nothing AndAlso Instance.Modable Then
  216. '可安装 Mod 的版本
  217. Dim ModDir As New DirectoryInfo(Instance.PathIndie & "mods\")
  218. Dim ModCount As Integer = If(ModDir.Exists, ModDir.GetFiles.Count(Function(f) {".jar", ".zip", ".litemod"}.Contains(f.Extension.Lower)), 0)
  219. RamMininum = 0.5 + ModCount / 150
  220. RamTarget1 = 1.5 + ModCount / 90
  221. RamTarget2 = 2.7 + ModCount / 50
  222. RamTarget3 = 4.5 + ModCount / 25
  223. ElseIf Instance IsNot Nothing AndAlso Instance.Version.HasOptiFine Then
  224. 'OptiFine 版本
  225. RamMininum = 0.5
  226. RamTarget1 = 1.5
  227. RamTarget2 = 3
  228. RamTarget3 = 5
  229. Else
  230. '普通版本
  231. RamMininum = 0.5
  232. RamTarget1 = 1.5
  233. RamTarget2 = 2.5
  234. RamTarget3 = 4
  235. End If
  236. Dim RamDelta As Double
  237. '预分配内存,阶段一,0 ~ T1,100%
  238. RamDelta = RamTarget1
  239. RamGive += Math.Min(RamAvailable, RamDelta)
  240. RamAvailable -= RamDelta
  241. If RamAvailable < 0.1 Then GoTo PreFin
  242. '预分配内存,阶段二,T1 ~ T2,70%
  243. RamDelta = RamTarget2 - RamTarget1
  244. RamGive += Math.Min(RamAvailable * 0.7, RamDelta)
  245. RamAvailable -= RamDelta / 0.7
  246. If RamAvailable < 0.1 Then GoTo PreFin
  247. '预分配内存,阶段三,T2 ~ T3,40%
  248. RamDelta = RamTarget3 - RamTarget2
  249. RamGive += Math.Min(RamAvailable * 0.4, RamDelta)
  250. RamAvailable -= RamDelta / 0.4
  251. If RamAvailable < 0.1 Then GoTo PreFin
  252. '预分配内存,阶段四,T3 ~ T3 * 2,15%
  253. RamDelta = RamTarget3
  254. RamGive += Math.Min(RamAvailable * 0.15, RamDelta)
  255. RamAvailable -= RamDelta / 0.15
  256. If RamAvailable < 0.1 Then GoTo PreFin
  257. PreFin:
  258. '不低于最低值
  259. RamGive = Math.Round(Math.Max(RamGive, RamMininum), 1)
  260. Else
  261. '手动配置
  262. Dim Value As Integer = Settings.Get("VersionRamCustom", Instance:=Instance)
  263. If Value <= 12 Then
  264. RamGive = Value * 0.1 + 0.3
  265. ElseIf Value <= 25 Then
  266. RamGive = (Value - 12) * 0.5 + 1.5
  267. ElseIf Value <= 33 Then
  268. RamGive = (Value - 25) * 1 + 8
  269. Else
  270. RamGive = (Value - 33) * 2 + 16
  271. End If
  272. End If
  273. '若使用 32 位 Java,则限制为 1G
  274. If If(Is32BitJava, Not JavaIs64Bit(PageInstanceLeft.Instance)) Then RamGive = Math.Min(1, RamGive)
  275. Return RamGive
  276. End Function
  277. #End Region
  278. #Region "服务器"
  279. '当第三方登录更改时,清空版本列表缓存以更新版本分类
  280. 'TODO: 这会不会导致拖拽改变第三方登录的时候版本列表缓存没有更新?
  281. Public Shared Sub OnVersionServerLoginChanged(Type As Integer)
  282. If FrmInstanceSetup Is Nothing Then Return
  283. WriteIni(McFolderSelected & "PCL.ini", "InstanceCache", "")
  284. If PageInstanceLeft.Instance Is Nothing Then Return
  285. PageInstanceLeft.Instance = New McInstance(PageInstanceLeft.Instance.Name).Load()
  286. LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
  287. End Sub
  288. '自动替换标点
  289. Private Sub TextServerEnter_Change() Handles TextServerEnter.TextChanged
  290. Dim NewText = TextServerEnter.Text.Replace(":", ":").Replace("。", ".")
  291. If NewText = TextServerEnter.Text Then Return
  292. Dim CurrentPosition = TextServerEnter.SelectionStart '重设焦点
  293. TextServerEnter.Text = NewText
  294. TextServerEnter.SelectionStart = CurrentPosition
  295. End Sub
  296. '全局
  297. Private ComboServerLoginLast As Integer
  298. Private Sub ComboServerLogin_Changed() Handles ComboServerLogin.SelectionChanged, TextServerNide.ValidatedTextChanged, TextServerAuthServer.ValidatedTextChanged, TextServerAuthRegister.ValidatedTextChanged
  299. If AniControlEnabled <> 0 Then Return
  300. UpdateServerLoginUI()
  301. '检查是否输入正确,正确才触发设置改变
  302. If ComboServerLogin.SelectedIndex = 3 AndAlso Not TextServerNide.IsValidated Then Return
  303. If ComboServerLogin.SelectedIndex = 4 AndAlso Not TextServerAuthServer.IsValidated Then Return
  304. '检查结果是否发生改变,未改变则不触发设置改变
  305. If ComboServerLoginLast = ComboServerLogin.SelectedIndex Then Return
  306. '触发
  307. ComboServerLoginLast = ComboServerLogin.SelectedIndex
  308. Settings.Set("VersionServerLogin", ComboServerLogin.SelectedIndex, Instance:=PageInstanceLeft.Instance)
  309. End Sub
  310. Private Sub UpdateServerLoginUI()
  311. If LabServerNide Is Nothing Then Return
  312. Dim Type = ComboServerLogin.SelectedIndex
  313. LabServerNide.Visibility = If(Type = 3, Visibility.Visible, Visibility.Collapsed)
  314. TextServerNide.Visibility = If(Type = 3, Visibility.Visible, Visibility.Collapsed)
  315. PanServerNide.Visibility = If(Type = 3, Visibility.Visible, Visibility.Collapsed)
  316. LabServerAuthName.Visibility = If(Type = 4, Visibility.Visible, Visibility.Collapsed)
  317. TextServerAuthName.Visibility = If(Type = 4, Visibility.Visible, Visibility.Collapsed)
  318. LabServerAuthRegister.Visibility = If(Type = 4, Visibility.Visible, Visibility.Collapsed)
  319. TextServerAuthRegister.Visibility = If(Type = 4, Visibility.Visible, Visibility.Collapsed)
  320. LabServerAuthServer.Visibility = If(Type = 4, Visibility.Visible, Visibility.Collapsed)
  321. TextServerAuthServer.Visibility = If(Type = 4, Visibility.Visible, Visibility.Collapsed)
  322. BtnServerAuthLittle.Visibility = If(Type = 4, Visibility.Visible, Visibility.Collapsed)
  323. CardServer.TriggerForceResize()
  324. End Sub
  325. 'LittleSkin
  326. Private Sub BtnServerAuthLittle_Click(sender As Object, e As EventArgs) Handles BtnServerAuthLittle.Click
  327. If TextServerAuthServer.Text <> "" AndAlso TextServerAuthServer.Text <> "https://littleskin.cn/api/yggdrasil" AndAlso
  328. MyMsgBox("即将把第三方登录设置覆盖为 LittleSkin 登录。" & vbCrLf & "除非你是服主,或者服主要求你这样做,否则请不要继续。" & vbCrLf & vbCrLf & "是否确实需要覆盖当前设置?",
  329. "设置覆盖确认", "继续", "取消") = 2 Then Return
  330. TextServerAuthServer.Text = "https://littleskin.cn/api/yggdrasil"
  331. TextServerAuthRegister.Text = "https://littleskin.cn/auth/register"
  332. TextServerAuthName.Text = "LittleSkin 登录"
  333. End Sub
  334. #End Region
  335. #Region "Java 选择"
  336. '刷新 Java 下拉框显示
  337. Public Sub RefreshJavaComboBox()
  338. If ComboArgumentJava Is Nothing Then Return
  339. '初始化列表
  340. ComboArgumentJava.Items.Clear()
  341. ComboArgumentJava.Items.Add(New MyComboBoxItem With {.Content = "跟随全局设置", .Tag = "使用全局设置"})
  342. ComboArgumentJava.Items.Add(New MyComboBoxItem With {.Content = "自动选择合适的 Java", .Tag = "自动选择"})
  343. '更新列表
  344. Dim SelectedItem As MyComboBoxItem = Nothing
  345. Dim SelectedBySetup As String = Settings.Get("VersionArgumentJavaSelect", Instance:=PageInstanceLeft.Instance)
  346. Try
  347. For Each Java In JavaList.ToList().OrderByDescending(Function(v) v.MajorVersion)
  348. Dim ListItem = New MyComboBoxItem With {.Content = Java.ToString, .ToolTip = Java.PathFolder, .Tag = Java}
  349. ToolTipService.SetHorizontalOffset(ListItem, 400)
  350. ComboArgumentJava.Items.Add(ListItem)
  351. '判断人为选中
  352. If SelectedBySetup = "" OrElse SelectedBySetup = "使用全局设置" Then Continue For
  353. If JavaEntry.FromJson(GetJson(SelectedBySetup)).PathFolder = Java.PathFolder Then SelectedItem = ListItem
  354. Next
  355. Catch ex As Exception
  356. Settings.Set("VersionArgumentJavaSelect", "使用全局设置", Instance:=PageInstanceLeft.Instance)
  357. Log(ex, "更新版本设置 Java 下拉框失败", NotifyLevel.MsgBoxAndFeedback)
  358. End Try
  359. '更新选择项
  360. If SelectedItem Is Nothing AndAlso JavaList.Any Then
  361. If SelectedBySetup = "" Then
  362. SelectedItem = ComboArgumentJava.Items(1) '选中 “自动选择”
  363. Else
  364. SelectedItem = ComboArgumentJava.Items(0) '选中 “跟随全局设置”
  365. End If
  366. End If
  367. ComboArgumentJava.SelectedItem = SelectedItem
  368. '结束处理
  369. If SelectedItem Is Nothing Then
  370. ComboArgumentJava.Items.Clear()
  371. ComboArgumentJava.Items.Add(New ComboBoxItem With {.Content = "未找到可用的 Java", .IsSelected = True})
  372. End If
  373. RefreshRam(True)
  374. End Sub
  375. '阻止在特定情况下展开下拉框
  376. Private Sub ComboArgumentJava_DropDownOpened(sender As Object, e As EventArgs) Handles ComboArgumentJava.DropDownOpened
  377. If ComboArgumentJava.SelectedItem Is Nothing OrElse ComboArgumentJava.Items(0).Content = "未找到可用的 Java" OrElse ComboArgumentJava.Items(0).Content = "加载中……" Then
  378. ComboArgumentJava.IsDropDownOpen = False
  379. End If
  380. End Sub
  381. '下拉框选择更改
  382. Private Sub JavaSelectionUpdate() Handles ComboArgumentJava.SelectionChanged
  383. If AniControlEnabled <> 0 Then Return
  384. 'Java 不可用时也不清空,会导致刷新时找不到对象
  385. If ComboArgumentJava.SelectedItem Is Nothing OrElse ComboArgumentJava.SelectedItem.Tag Is Nothing Then Return
  386. '设置新的 Java
  387. Dim SelectedJava = ComboArgumentJava.SelectedItem.Tag
  388. If "使用全局设置".Equals(SelectedJava) Then
  389. '选择 “自动”
  390. Settings.Set("VersionArgumentJavaSelect", "使用全局设置", Instance:=PageInstanceLeft.Instance)
  391. Log("[Java] 修改版本 Java 选择设置:跟随全局设置")
  392. ElseIf "自动选择".Equals(SelectedJava) Then
  393. '选择 “自动”
  394. Settings.Set("VersionArgumentJavaSelect", "", Instance:=PageInstanceLeft.Instance)
  395. Log("[Java] 修改版本 Java 选择设置:自动选择")
  396. Else
  397. '选择指定项
  398. Settings.Set("VersionArgumentJavaSelect", CType(SelectedJava.ToJson(), JObject).ToString(Newtonsoft.Json.Formatting.None), Instance:=PageInstanceLeft.Instance)
  399. Log("[Java] 修改版本 Java 选择设置:" & SelectedJava.ToString)
  400. End If
  401. RefreshRam(True)
  402. End Sub
  403. #End Region
  404. #Region "版本隔离"
  405. Private Sub ComboArgumentIndieV2_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboArgumentIndieV2.SelectionChanged
  406. If AniControlEnabled <> 0 Then Return
  407. Static IsReverting As Boolean = False
  408. If IsReverting Then Return
  409. If MyMsgBox("调整版本隔离设置后,你需要游戏存档、Mod 等文件手动迁移到新的游戏文件夹中。" & vbCrLf &
  410. "如果发现存档消失,把这项设置改回来就能恢复。" & vbCrLf &
  411. "如果你不会迁移存档,不建议修改这项设置!",
  412. "警告", "我知道我在做什么", "取消", IsWarn:=True) = 2 Then
  413. IsReverting = True
  414. ComboArgumentIndieV2.SelectedItem = e.RemovedItems(0)
  415. IsReverting = False
  416. End If
  417. '实际应用设置
  418. Settings.Set("VersionArgumentIndieV2", sender.SelectedIndex = 0, Instance:=PageInstanceLeft.Instance)
  419. End Sub
  420. #End Region
  421. #Region "高级设置"
  422. Private Sub TextAdvanceRun_TextChanged(sender As Object, e As TextChangedEventArgs) Handles TextAdvanceRun.TextChanged
  423. CheckAdvanceRunWait.Visibility = If(TextAdvanceRun.Text = "", Visibility.Collapsed, Visibility.Visible)
  424. End Sub
  425. #End Region
  426. '切换到全局设置
  427. Private Sub BtnSwitch_Click(sender As Object, e As MouseButtonEventArgs) Handles BtnSwitch.Click
  428. FrmMain.PageChange(FormMain.PageType.Setup, FormMain.PageSubType.SetupLaunch)
  429. End Sub
  430. '去除参数中的回车
  431. Private Sub ReplaceEnter(sender As MyTextBox, e As TextChangedEventArgs) Handles TextAdvanceJvm.TextChanged, TextAdvanceGame.TextChanged
  432. Dim NewText = sender.Text.ReplaceLineEndings(" ", mergeMultiple:=True)
  433. If NewText = sender.Text Then Return
  434. Dim CaretIndex = sender.CaretIndex
  435. sender.Text = NewText
  436. sender.CaretIndex = Math.Max(0, CaretIndex - 1)
  437. End Sub
  438. End Class