PageSetupLaunch.xaml.vb 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515
  1. Public Class PageSetupLaunch
  2. Private Sub PageSetupLaunch_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
  3. '重复加载部分
  4. PanBack.ScrollToHome()
  5. RefreshRam(False)
  6. BtnSwitch.Visibility = If(McInstanceSelected Is Nothing, Visibility.Collapsed, Visibility.Visible)
  7. 'Java 可能在版本设置被修改,所以总是重新加载(反正其他的 Refresh 也不太吃性能)
  8. AniControlEnabled += 1
  9. Refresh()
  10. AniControlEnabled -= 1
  11. '非重复加载部分
  12. Static Reloaded As Boolean = False
  13. If Reloaded Then Return
  14. Reloaded = True
  15. '内存自动刷新
  16. Dim timer As New Threading.DispatcherTimer With {.Interval = New TimeSpan(0, 0, 0, 1)}
  17. AddHandler timer.Tick, AddressOf RefreshRam
  18. timer.Start()
  19. End Sub
  20. Public Sub Refresh()
  21. Try
  22. SettingService.RefreshSettings(Me)
  23. UpdateSkinType()
  24. UpdateRamType()
  25. UpdateJavaList()
  26. Catch ex As NullReferenceException
  27. Logger.Error(ex, "启动设置项存在异常,已被自动重置", LogBehavior.Alert)
  28. Reset()
  29. Catch ex As Exception
  30. Logger.Error(ex, "重载启动设置时出错")
  31. End Try
  32. End Sub
  33. Public Sub Reset()
  34. Try
  35. SettingService.ResetSettings(Me)
  36. Settings.Set("LaunchArgumentIndieV2", Settings.GetDefault("LaunchArgumentIndieV2"))
  37. Configs.JavaList.Reset()
  38. Configs.JavaRemovedList.Reset()
  39. JavaListRefreshWorker.Start()
  40. Hint("已初始化启动设置!", HintType.Green)
  41. Catch ex As Exception
  42. Logger.Error(ex, "初始化启动设置失败", LogBehavior.Alert)
  43. End Try
  44. Refresh()
  45. End Sub
  46. #Region "离线皮肤"
  47. Private Sub BtnSkinChange_Click(sender As Object, e As EventArgs) Handles BtnSkinChange.Click
  48. Dim SkinInfo As McSkinInfo = McSkinSelect()
  49. If Not SkinInfo.IsVaild Then Return
  50. ChangeSkin(SkinInfo)
  51. End Sub
  52. Private Sub RadioSkinType3_Check(sender As Object, e As RouteEventArgs) Handles RadioSkinType4.PreviewCheck
  53. If Not (AniControlEnabled = 0 AndAlso e.RaiseByMouse) Then Return
  54. '已有图片则不再选择
  55. If FileUtils.Exists(Paths.AppDataThenName & "CustomSkin.png") Then Return
  56. '没有图片则要求选择
  57. Dim SkinInfo As McSkinInfo = McSkinSelect()
  58. If Not SkinInfo.IsVaild Then
  59. e.Handled = True
  60. Return
  61. End If
  62. '正式改变
  63. If Not ChangeSkin(SkinInfo) Then e.Handled = True
  64. End Sub
  65. '返回是否成功改变
  66. Private Function ChangeSkin(SkinInfo As McSkinInfo) As Boolean
  67. Try
  68. '复制文件
  69. FileUtils.Copy(SkinInfo.LocalFile, Paths.AppDataThenName & "CustomSkin.png")
  70. '将单层皮肤扩展到双层
  71. Dim Bitmap As New MyBitmap(Paths.AppDataThenName & "CustomSkin.png")
  72. If Bitmap.Pic.Width = 64 AndAlso Bitmap.Pic.Height = 32 Then
  73. Dim Img As System.Drawing.Image = Bitmap
  74. Dim NewBitmap As New System.Drawing.Bitmap(64, 64)
  75. Using g As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(NewBitmap)
  76. g.DrawImageUnscaled(Img, New System.Drawing.Point(0, 0))
  77. End Using
  78. FileUtils.Delete(Paths.AppDataThenName & "CustomSkin.png")
  79. NewBitmap.Save(Paths.AppDataThenName & "CustomSkin.png")
  80. End If
  81. '更新设置
  82. Settings.Set("LaunchSkinSlim", SkinInfo.IsSlim)
  83. Return True
  84. Catch ex As Exception
  85. Logger.Error(ex, "改变离线皮肤失败", LogBehavior.Alert)
  86. Return False
  87. Finally
  88. '设置当前显示
  89. PageLaunchLeft.SkinLegacy.Start(IsForceRestart:=True)
  90. End Try
  91. End Function
  92. Private Sub BtnSkinDelete_Click(sender As Object, e As EventArgs) Handles BtnSkinDelete.Click
  93. Try
  94. FileUtils.Delete(Paths.AppDataThenName & "CustomSkin.png")
  95. RadioSkinType0.SetChecked(True, True)
  96. Hint("离线皮肤已清空!", HintType.Green)
  97. Catch ex As Exception
  98. Logger.Error(ex, "清空离线皮肤失败", LogBehavior.Alert)
  99. End Try
  100. End Sub
  101. Private Sub BtnSkinSave_Click(sender As Object, e As EventArgs) Handles BtnSkinSave.Click
  102. MySkin.Save(PageLaunchLeft.SkinLegacy)
  103. End Sub
  104. Private Sub BtnSkinCache_Click(sender As Object, e As EventArgs) Handles BtnSkinCache.Click
  105. MySkin.RefreshCache(Nothing)
  106. End Sub
  107. Public Shared Sub UpdateSkinType()
  108. PageLaunchLeft.SkinLegacy.Start()
  109. '设置 UI 改变
  110. If FrmSetupLaunch Is Nothing Then Return
  111. Select Case Settings.Get(Of Integer)("LaunchSkinType")
  112. Case 0, 1, 2 '默认
  113. FrmSetupLaunch.PanSkinID.Visibility = Visibility.Collapsed
  114. FrmSetupLaunch.PanSkinChange.Visibility = Visibility.Collapsed
  115. Case 3 '正版
  116. FrmSetupLaunch.PanSkinID.Visibility = Visibility.Visible
  117. FrmSetupLaunch.PanSkinChange.Visibility = Visibility.Collapsed
  118. Case 4 '自定义
  119. FrmSetupLaunch.PanSkinID.Visibility = Visibility.Collapsed
  120. FrmSetupLaunch.PanSkinChange.Visibility = Visibility.Visible
  121. End Select
  122. FrmSetupLaunch.CardSkin.TriggerForceResize()
  123. End Sub
  124. #End Region
  125. #Region "游戏内存"
  126. Public Shared Sub UpdateRamType()
  127. If FrmSetupLaunch?.SliderRamCustom Is Nothing Then Return
  128. FrmSetupLaunch.SliderRamCustom.IsEnabled = Settings.Get(Of Integer)("LaunchRamType") = 1
  129. End Sub
  130. ''' <summary>
  131. ''' 刷新 UI 上的 RAM 显示。
  132. ''' </summary>
  133. Public Sub RefreshRam(ShowAnim As Boolean)
  134. If LabRamGame Is Nothing OrElse LabRamUsed Is Nothing OrElse FrmMain.PageCurrent <> FormMain.PageType.Setup OrElse FrmSetupLeft.PageID <> FormMain.PageSubType.SetupLaunch Then Return
  135. '获取内存情况
  136. Dim RamGame As Double = Math.Round(GetRam(McInstanceSelected, False), 5)
  137. Dim RamTotal As Double = Math.Round(My.Computer.Info.TotalPhysicalMemory / 1024 / 1024 / 1024, 1)
  138. Dim RamAvailable As Double = Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024, 1)
  139. Dim RamGameActual As Double = Math.Round(Math.Min(RamGame, RamAvailable), 5)
  140. Dim RamUsed As Double = Math.Round(RamTotal - RamAvailable, 5)
  141. Dim RamEmpty As Double = Math.Round((RamTotal - RamUsed - RamGame).Clamp(0, 1000), 1)
  142. '设置最大可用内存
  143. If RamTotal <= 1.5 Then
  144. SliderRamCustom.MaxValue = Math.Max(Math.Floor((RamTotal - 0.3) / 0.1), 1)
  145. ElseIf RamTotal <= 8 Then
  146. SliderRamCustom.MaxValue = Math.Floor((RamTotal - 1.5) / 0.5) + 12
  147. ElseIf RamTotal <= 16 Then
  148. SliderRamCustom.MaxValue = Math.Floor((RamTotal - 8) / 1) + 25
  149. Else
  150. SliderRamCustom.MaxValue = Math.Floor((RamTotal - 16) / 2) + 33
  151. End If
  152. '设置文本
  153. LabRamGame.Text = If(RamGame = Math.Floor(RamGame), RamGame & ".0", RamGame) & " GB" &
  154. If(RamGame <> RamGameActual, " (可用 " & If(RamGameActual = Math.Floor(RamGameActual), RamGameActual & ".0", RamGameActual) & " GB)", "")
  155. LabRamUsed.Text = If(RamUsed = Math.Floor(RamUsed), RamUsed & ".0", RamUsed) & " GB"
  156. LabRamTotal.Text = " / " & If(RamTotal = Math.Floor(RamTotal), RamTotal & ".0", RamTotal) & " GB"
  157. If ShowAnim Then
  158. '宽度动画
  159. AniStart({
  160. AaGridLengthWidth(ColumnRamUsed, RamUsed - ColumnRamUsed.Width.Value, 800,, New AniEaseOutFluent(AniEasePower.Strong)),
  161. AaGridLengthWidth(ColumnRamGame, RamGameActual - ColumnRamGame.Width.Value, 800,, New AniEaseOutFluent(AniEasePower.Strong)),
  162. AaGridLengthWidth(ColumnRamEmpty, RamEmpty - ColumnRamEmpty.Width.Value, 800,, New AniEaseOutFluent(AniEasePower.Strong))
  163. }, "SetupLaunch Ram Grid")
  164. Else
  165. '宽度设置
  166. ColumnRamUsed.Width = New GridLength(RamUsed, GridUnitType.Star)
  167. ColumnRamGame.Width = New GridLength(RamGameActual, GridUnitType.Star)
  168. ColumnRamEmpty.Width = New GridLength(RamEmpty, GridUnitType.Star)
  169. End If
  170. End Sub
  171. Private Sub RefreshRam() Handles SliderRamCustom.Change, RadioRamType0.Check, RadioRamType1.Check
  172. RefreshRam(True)
  173. End Sub
  174. Private RamTextLeft As Integer = 2, RamTextRight As Integer = 1
  175. ''' <summary>
  176. ''' 刷新 UI 上的文本位置。
  177. ''' </summary>
  178. Private Sub RefreshRamText() Handles RectRamGame.SizeChanged, RectRamEmpty.SizeChanged, LabRamGame.SizeChanged
  179. '获取宽度信息
  180. Dim RectUsedWidth = RectRamUsed.ActualWidth
  181. Dim TotalWidth = PanRamDisplay.ActualWidth
  182. Dim LabGameWidth = LabRamGame.ActualWidth, LabUsedWidth = LabRamUsed.ActualWidth, LabTotalWidth = LabRamTotal.ActualWidth
  183. Dim LabGameTitleWidth = LabRamGameTitle.ActualWidth, LabUsedTitleWidth = LabRamUsedTitle.ActualWidth
  184. '左侧
  185. Dim Left As Integer
  186. If RectUsedWidth - 30 < LabUsedWidth OrElse RectUsedWidth - 30 < LabUsedTitleWidth Then
  187. '全写不下了
  188. Left = 0
  189. ElseIf RectUsedWidth - 25 < (LabUsedWidth + LabTotalWidth) Then
  190. '显示不下完整数据
  191. Left = 1
  192. Else
  193. '正常
  194. Left = 2
  195. End If
  196. If RamTextLeft <> Left Then
  197. RamTextLeft = Left
  198. Select Case Left
  199. Case 0
  200. AniStart({
  201. AaOpacity(LabRamUsed, -LabRamUsed.Opacity, 100),
  202. AaOpacity(LabRamTotal, -LabRamTotal.Opacity, 100),
  203. AaOpacity(LabRamUsedTitle, -LabRamUsedTitle.Opacity, 100)
  204. }, "SetupLaunch Ram TextLeft")
  205. Case 1
  206. AniStart({
  207. AaOpacity(LabRamUsed, 1 - LabRamUsed.Opacity, 100),
  208. AaOpacity(LabRamTotal, -LabRamTotal.Opacity, 100),
  209. AaOpacity(LabRamUsedTitle, 0.7 - LabRamUsedTitle.Opacity, 100)
  210. }, "SetupLaunch Ram TextLeft")
  211. Case 2
  212. AniStart({
  213. AaOpacity(LabRamUsed, 1 - LabRamUsed.Opacity, 100),
  214. AaOpacity(LabRamTotal, 1 - LabRamTotal.Opacity, 100),
  215. AaOpacity(LabRamUsedTitle, 0.7 - LabRamUsedTitle.Opacity, 100)
  216. }, "SetupLaunch Ram TextLeft")
  217. End Select
  218. End If
  219. '右侧
  220. Dim Right As Integer
  221. If TotalWidth < LabGameWidth + 2 + RectUsedWidth OrElse TotalWidth < LabGameTitleWidth + 2 + RectUsedWidth Then
  222. '挤到最右边
  223. Right = 0
  224. Else
  225. '正常情况
  226. Right = 1
  227. End If
  228. If Right = 0 Then
  229. If AniControlEnabled = 0 AndAlso (RamTextRight <> Right OrElse AniIsRun("SetupLaunch Ram TextRight")) Then
  230. '需要动画
  231. AniStart({
  232. AaX(LabRamGame, TotalWidth - LabGameWidth - LabRamGame.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak)),
  233. AaX(LabRamGameTitle, TotalWidth - LabGameTitleWidth - LabRamGameTitle.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak))
  234. }, "SetupLaunch Ram TextRight")
  235. Else
  236. '不需要动画
  237. AniStop("SetupLaunch Ram TextRight")
  238. LabRamGame.Margin = New Thickness(TotalWidth - LabGameWidth, 3, 0, 0)
  239. LabRamGameTitle.Margin = New Thickness(TotalWidth - LabGameTitleWidth, 0, 0, 5)
  240. End If
  241. Else
  242. If AniControlEnabled = 0 AndAlso (RamTextRight <> Right OrElse AniIsRun("SetupLaunch Ram TextRight")) Then
  243. '需要动画
  244. AniStart({
  245. AaX(LabRamGame, 2 + RectUsedWidth - LabRamGame.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak)),
  246. AaX(LabRamGameTitle, 2 + RectUsedWidth - LabRamGameTitle.Margin.Left, 100,, New AniEaseOutFluent(AniEasePower.Weak))
  247. }, "SetupLaunch Ram TextRight")
  248. Else
  249. '不需要动画
  250. AniStop("SetupLaunch Ram TextRight")
  251. LabRamGame.Margin = New Thickness(2 + RectUsedWidth, 3, 0, 0)
  252. LabRamGameTitle.Margin = New Thickness(2 + RectUsedWidth, 0, 0, 5)
  253. End If
  254. End If
  255. RamTextRight = Right
  256. End Sub
  257. ''' <summary>
  258. ''' 获取当前设置的 RAM 值。单位为 GB。
  259. ''' </summary>
  260. Public Shared Function GetRam(Instance As McInstance, UseVersionJavaSetup As Boolean) As Double
  261. '------------------------------------------
  262. ' 修改下方代码时需要一并修改 PageInstanceSetup
  263. '------------------------------------------
  264. Dim RamGive As Double
  265. If Settings.Get(Of Integer)("LaunchRamType") = 0 Then
  266. '自动配置
  267. Dim RamAvailable As Double = Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024 * 10) / 10
  268. '确定需求的内存值
  269. Dim RamMininum As Double '无论如何也需要保证的最低限度内存
  270. Dim RamTarget1 As Double '估计能勉强带动了的内存
  271. Dim RamTarget2 As Double '估计没啥问题了的内存
  272. Dim RamTarget3 As Double '放一百万个材质和 Mod 和光影需要的内存
  273. If Instance IsNot Nothing AndAlso Not Instance.IsLoaded Then Instance.Load()
  274. If Instance IsNot Nothing AndAlso Instance.Modable Then
  275. '可安装 Mod 的版本
  276. Dim ModDir = DirectoryUtils.GetInfo(Instance.PathIndie & "mods\")
  277. Dim ModCount As Integer = If(ModDir.Exists, ModDir.GetFiles.Count(Function(f) {".jar", ".zip", ".litemod"}.Contains(f.Extension.Lower)), 0)
  278. RamMininum = 0.5 + ModCount / 150
  279. RamTarget1 = 1.5 + ModCount / 90
  280. RamTarget2 = 2.7 + ModCount / 50
  281. RamTarget3 = 4.5 + ModCount / 25
  282. ElseIf Instance IsNot Nothing AndAlso Instance.Version.HasOptiFine Then
  283. 'OptiFine 版本
  284. RamMininum = 0.5
  285. RamTarget1 = 1.5
  286. RamTarget2 = 3
  287. RamTarget3 = 5
  288. Else
  289. '普通版本
  290. RamMininum = 0.5
  291. RamTarget1 = 1.5
  292. RamTarget2 = 2.5
  293. RamTarget3 = 4
  294. End If
  295. Dim RamDelta As Double
  296. '预分配内存,阶段一,0 ~ T1,100%
  297. RamDelta = RamTarget1
  298. RamGive += Math.Min(RamAvailable, RamDelta)
  299. RamAvailable -= RamDelta
  300. If RamAvailable < 0.1 Then GoTo PreFin
  301. '预分配内存,阶段二,T1 ~ T2,70%
  302. RamDelta = RamTarget2 - RamTarget1
  303. RamGive += Math.Min(RamAvailable * 0.7, RamDelta)
  304. RamAvailable -= RamDelta / 0.7
  305. If RamAvailable < 0.1 Then GoTo PreFin
  306. '预分配内存,阶段三,T2 ~ T3,40%
  307. RamDelta = RamTarget3 - RamTarget2
  308. RamGive += Math.Min(RamAvailable * 0.4, RamDelta)
  309. RamAvailable -= RamDelta / 0.4
  310. If RamAvailable < 0.1 Then GoTo PreFin
  311. '预分配内存,阶段四,T3 ~ T3 * 2,15%
  312. RamDelta = RamTarget3
  313. RamGive += Math.Min(RamAvailable * 0.15, RamDelta)
  314. RamAvailable -= RamDelta / 0.15
  315. If RamAvailable < 0.1 Then GoTo PreFin
  316. PreFin:
  317. '不低于最低值
  318. RamGive = Math.Round(Math.Max(RamGive, RamMininum), 1)
  319. Else
  320. '手动配置
  321. Dim Value = Settings.Get(Of Integer)("LaunchRamCustom")
  322. If Value <= 12 Then
  323. RamGive = Value * 0.1 + 0.3
  324. ElseIf Value <= 25 Then
  325. RamGive = (Value - 12) * 0.5 + 1.5
  326. ElseIf Value <= 33 Then
  327. RamGive = (Value - 25) * 1 + 8
  328. Else
  329. RamGive = (Value - 33) * 2 + 16
  330. End If
  331. End If
  332. Return RamGive
  333. End Function
  334. #End Region
  335. #Region "Java 选择"
  336. '注意:修改此处代码时需要同时修改 PageInstanceSetup.xaml.vb
  337. '刷新 Java 下拉框显示
  338. Public Sub UpdateJavaList()
  339. If ComboAdvanceJava Is Nothing OrElse LabAdvanceJava Is Nothing OrElse Not ComboAdvanceJava.IsLoaded Then Return
  340. ComboAdvanceJava.Items.Clear()
  341. '还需要等待搜索结束
  342. If JavaListRefreshWorker.Running Then
  343. BtnAdvanceJavaSearch.IsEnabled = False
  344. ComboAdvanceJava.IsEnabled = False
  345. LabAdvanceJava.Text = "搜索中 …"
  346. Return
  347. End If
  348. '========================================== 显示结果 ==========================================
  349. BtnAdvanceJavaSearch.IsEnabled = True
  350. ComboAdvanceJava.IsEnabled = True
  351. '更新下拉框文本
  352. Dim Count = Configs.JavaList.Get().Count
  353. LabAdvanceJava.Text = If(Count > 0, $"共有 {Count} 个 Java …", "未找到 Java,点击以导入已有的 Java")
  354. '更新列表
  355. Try
  356. Dim JavaEntries = Configs.JavaList.Get()
  357. For i = 0 To JavaEntries.Count - 1
  358. Dim JavaEntry = JavaEntries(i)
  359. Dim JavaItem As New MyListItem With {
  360. .FontSize = 13, .Height = 24, .IsScaleAnimationEnabled = False, .Type = MyListItem.CheckType.Clickable,
  361. .Tag = JavaEntry, .Title = JavaEntry.ToString}
  362. AddHandler JavaItem.MouseLeftButtonUp, Sub(sender As Object, e As MouseButtonEventArgs) e.Handled = True
  363. AddHandler JavaItem.Click, Sub() Hint("点击选项右侧的箭头可以进行排序,以控制 PCL 优先选择哪个 Java!")
  364. ComboAdvanceJava.Items.Add(JavaItem)
  365. Dim Buttons As New List(Of MyIconButton)
  366. '向上移动按钮
  367. Dim UpButton As New MyIconButton With {.Logo = Logo.IconButtonArrowUp, .LogoScale = 0.95, .Height = 24, .Width = 24}
  368. UpButton.IsEnabled = i > 0
  369. UpButton.ToolTip = "提高优先级"
  370. ToolTipService.SetShowOnDisabled(UpButton, True)
  371. AddHandler UpButton.Click, Sub() MoveJavaInList(JavaEntry, -1)
  372. Buttons.Add(UpButton)
  373. '向下移动按钮
  374. Dim DownButton As New MyIconButton With {.Logo = Logo.IconButtonArrowDown, .LogoScale = 0.95, .Height = 24, .Width = 24}
  375. DownButton.IsEnabled = i < JavaEntries.Count - 1
  376. DownButton.ToolTip = "降低优先级"
  377. ToolTipService.SetShowOnDisabled(DownButton, True)
  378. AddHandler DownButton.Click, Sub() MoveJavaInList(JavaEntry, 1)
  379. Buttons.Add(DownButton)
  380. '从列表中移除按钮
  381. Dim IsOfficial As Boolean = PathUtils.IsParentOf($"{Paths.AppData}.minecraft\runtime\", JavaEntry.Folder)
  382. Dim DeleteButton As New MyIconButton With {.Logo = Logo.IconButtonStop, .Height = 24, .Width = 24}
  383. DeleteButton.IsEnabled = Not IsOfficial
  384. DeleteButton.ToolTip = If(DeleteButton.IsEnabled, "从列表中移除", "无法移除官方 Java")
  385. AddHandler DeleteButton.Click, Sub() ManuallyRemoveJava(JavaEntry)
  386. ToolTipService.SetShowOnDisabled(DeleteButton, True)
  387. Buttons.Add(DeleteButton)
  388. '打开文件夹按钮
  389. Dim OpenButton As New MyIconButton With {.Logo = Logo.IconButtonOpen, .LogoScale = 1.1, .Height = 24, .Width = 24}
  390. OpenButton.ToolTip = "打开文件夹"
  391. AddHandler OpenButton.Click, Sub() OpenExplorer(JavaEntry.JavaExePath)
  392. Buttons.Add(OpenButton)
  393. JavaItem.Buttons = Buttons
  394. Next
  395. Dim ImportItem As New MyListItem With {
  396. .FontSize = 13, .Height = 24, .IsScaleAnimationEnabled = False, .Title = "导入电脑中已有的 Java…", .Type = MyListItem.CheckType.Clickable}
  397. AddHandler ImportItem.MouseLeftButtonUp,
  398. Sub(sender As Object, e As MouseButtonEventArgs)
  399. e.Handled = True
  400. ManuallyImportJava()
  401. End Sub
  402. ComboAdvanceJava.Items.Add(ImportItem)
  403. Catch ex As Exception
  404. Logger.Error(ex, "更新 Java 列表下拉框失败")
  405. End Try
  406. End Sub
  407. Private Sub MoveJavaInList(JavaEntry As Java, Offset As Integer)
  408. Configs.JavaList.Edit(
  409. Sub(ByRef List)
  410. Dim Index = List.IndexOf(JavaEntry)
  411. Dim NewIndex = Index + Offset
  412. If Index < 0 OrElse NewIndex < 0 OrElse NewIndex >= List.Count Then Return
  413. List.RemoveAt(Index)
  414. List.Insert(NewIndex, JavaEntry)
  415. End Sub)
  416. UpdateJavaLists()
  417. End Sub
  418. Private Sub BtnAdvanceJavaSearch_Click() Handles BtnAdvanceJavaSearch.Click
  419. ManuallySearchJava()
  420. End Sub
  421. #End Region
  422. #Region "其他选项"
  423. Private Sub WindowTypeUIRefresh() Handles ComboArgumentWindowType.SelectionChanged
  424. Dim IsVisibie = (ComboArgumentWindowType.SelectedIndex = 3).ToVisibility
  425. TextArgumentWindowHeight.Visibility = IsVisibie
  426. LabArgumentWindowMiddle.Visibility = IsVisibie
  427. TextArgumentWindowWidth.Visibility = IsVisibie
  428. End Sub
  429. '可见性选择直接关闭的警告
  430. Private Sub ComboArgumentVisibie_SizeChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboArgumentVisibie.SelectionChanged
  431. If AniControlEnabled <> 0 Then Return
  432. If ComboArgumentVisibie.SelectedIndex = 0 Then
  433. If MyMsgBox("若在游戏启动后立即关闭启动器,崩溃检测、更改游戏标题等功能将失效。" & vbCrLf &
  434. "如果想保留这些功能,可以选择让启动器在游戏启动后隐藏,游戏退出后自动关闭。", "提醒", "继续", "取消") = 2 Then
  435. If e.RemovedItems.Count > 0 Then ComboArgumentVisibie.SelectedItem = e.RemovedItems(0)
  436. End If
  437. End If
  438. End Sub
  439. '开启自动内存优化的警告
  440. Private Sub CheckArgumentRam_Change() Handles CheckArgumentRam.Change
  441. If AniControlEnabled <> 0 Then Return
  442. If Not CheckArgumentRam.Checked Then Return
  443. If MyMsgBox("内存优化会显著延长启动耗时,建议仅在内存不足时开启。" & vbCrLf &
  444. "如果你在使用机械硬盘,这还可能导致一小段时间的严重卡顿。" &
  445. If(WindowsUtils.HasAdminRole(), "", $"{vbCrLf}{vbCrLf}每次启动游戏,PCL 都需要申请管理员权限以进行内存优化。{vbCrLf}若想自动授予权限,可以右键 PCL,打开 属性 → 兼容性 → 以管理员身份运行此程序。"),
  446. "提醒", "确定", "取消") = 2 Then
  447. CheckArgumentRam.Checked = False
  448. End If
  449. End Sub
  450. '版本隔离提示
  451. Private Sub ComboArgumentIndie_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboArgumentIndieV2.SelectionChanged
  452. If AniControlEnabled <> 0 Then Return
  453. MyMsgBox("本设置仅会对之后新安装的版本生效。" & vbCrLf & "如果要修改已安装的版本的隔离方式,请在它的版本独立设置中调整。")
  454. End Sub
  455. #End Region
  456. #Region "高级设置"
  457. Private Sub TextAdvanceRun_TextChanged(sender As Object, e As TextChangedEventArgs) Handles TextAdvanceRun.TextChanged
  458. CheckAdvanceRunWait.Visibility = If(TextAdvanceRun.Text = "", Visibility.Collapsed, Visibility.Visible)
  459. End Sub
  460. 'JVM 参数重设
  461. Private Sub TextAdvanceJvm_TextChanged() Handles TextAdvanceJvm.ValidatedTextChanged
  462. BtnAdvanceJvmReset.Visibility = If(TextAdvanceJvm.Text = Settings.GetDefault("LaunchAdvanceJvm"), Visibility.Hidden, Visibility.Visible)
  463. End Sub
  464. Private Sub BtnAdvanceJvmReset_Click(sender As Object, e As EventArgs) Handles BtnAdvanceJvmReset.Click
  465. Settings.Reset("LaunchAdvanceJvm")
  466. Refresh()
  467. End Sub
  468. '去除参数中的回车
  469. Private Sub ReplaceEnter(sender As MyTextBox, e As TextChangedEventArgs) Handles TextAdvanceJvm.TextChanged, TextAdvanceGame.TextChanged
  470. Dim NewText = sender.Text.ReplaceLineEndings(" ", mergeMultiple:=True)
  471. If NewText = sender.Text Then Return
  472. Dim CaretIndex = sender.CaretIndex
  473. sender.Text = NewText
  474. sender.CaretIndex = Math.Max(0, CaretIndex - 1)
  475. End Sub
  476. #End Region
  477. '切换到版本独立设置
  478. Private Sub BtnSwitch_Click(sender As Object, e As MouseButtonEventArgs) Handles BtnSwitch.Click
  479. McInstanceSelected.Load()
  480. PageInstanceLeft.Instance = McInstanceSelected
  481. FrmMain.PageChange(FormMain.PageType.InstanceSetup, FormMain.PageSubType.InstanceSetup)
  482. End Sub
  483. End Class