Public Class ModSetup ''' ''' 设置的更新号。 ''' Public Const VersionSetup As Integer = 1 ''' ''' 设置列表。 ''' Private ReadOnly SetupDict As New Dictionary(Of String, SetupEntry) From { {"Identify", New SetupEntry("", Source:=SetupSource.Registry)}, {"HintDownloadThread", New SetupEntry(False, Source:=SetupSource.Registry)}, {"HintNotice", New SetupEntry(0, Source:=SetupSource.Registry)}, {"HintDownload", New SetupEntry(0, Source:=SetupSource.Registry)}, {"HintInstallBack", New SetupEntry(False, Source:=SetupSource.Registry)}, {"HintHide", New SetupEntry(False, Source:=SetupSource.Registry)}, {"HintHandInstall", New SetupEntry(False, Source:=SetupSource.Registry)}, {"HintBuy", New SetupEntry(False, Source:=SetupSource.Registry)}, {"HintClearRubbish", New SetupEntry(0, Source:=SetupSource.Registry)}, {"HintUpdateMod", New SetupEntry(False, Source:=SetupSource.Registry)}, {"TestSetupReader", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"SystemEula", New SetupEntry(False, Source:=SetupSource.Registry)}, {"SystemCount", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)}, {"SystemLaunchCount", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)}, {"SystemLastVersionReg", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)}, {"SystemHighestBetaVersionReg", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)}, {"SystemHighestAlphaVersionReg", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)}, {"SystemSetupVersionReg", New SetupEntry(VersionSetup, Source:=SetupSource.Registry)}, {"SystemSetupVersionIni", New SetupEntry(VersionSetup)}, {"SystemHelpVersion", New SetupEntry(0, Source:=SetupSource.Registry)}, {"SystemDebugMode", New SetupEntry(False, Source:=SetupSource.Registry)}, {"SystemDebugAnim", New SetupEntry(9, Source:=SetupSource.Registry)}, {"SystemDebugDelay", New SetupEntry(False, Source:=SetupSource.Registry)}, {"SystemDebugSkipCopy", New SetupEntry(False, Source:=SetupSource.Registry)}, {"SystemSystemCache", New SetupEntry("", Source:=SetupSource.Registry)}, {"SystemSystemUpdate", New SetupEntry(0)}, {"SystemSystemActivity", New SetupEntry(0)}, {"CacheSavedPageUrl", New SetupEntry("", Source:=SetupSource.Registry)}, {"CacheSavedPageVersion", New SetupEntry("", Source:=SetupSource.Registry)}, {"CacheMsOAuthRefresh", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"CacheMsAccess", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"CacheMsProfileJson", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"CacheMsUuid", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"CacheMsName", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"CacheNideAccess", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"CacheNideClient", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"CacheNideUuid", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"CacheNideName", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"CacheNideUsername", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"CacheNidePass", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"CacheNideServer", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"CacheAuthAccess", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"CacheAuthClient", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"CacheAuthUuid", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"CacheAuthName", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"CacheAuthUsername", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"CacheAuthPass", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"CacheAuthServerServer", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"CacheAuthServerName", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"CacheAuthServerRegister", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"CacheDownloadFolder", New SetupEntry("", Source:=SetupSource.Registry)}, {"CacheJavaListVersion", New SetupEntry(0, Source:=SetupSource.Registry)}, {"LoginRemember", New SetupEntry(True, Source:=SetupSource.Registry, Encoded:=True)}, {"LoginLegacyName", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"LoginMsJson", New SetupEntry("{}", Source:=SetupSource.Registry, Encoded:=True)}, '{UserName: OAuthToken, ...} {"LoginNideEmail", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"LoginNidePass", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"LoginAuthEmail", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"LoginAuthPass", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"LoginType", New SetupEntry(McLoginType.Legacy, Source:=SetupSource.Registry)}, {"LoginPageType", New SetupEntry(0)}, {"LaunchSkinID", New SetupEntry("", Source:=SetupSource.Registry)}, {"LaunchSkinType", New SetupEntry(0, Source:=SetupSource.Registry)}, {"LaunchSkinSlim", New SetupEntry(False, Source:=SetupSource.Registry)}, {"LaunchVersionSelect", New SetupEntry("")}, {"LaunchFolderSelect", New SetupEntry("")}, {"LaunchFolders", New SetupEntry("", Source:=SetupSource.Registry)}, {"LaunchArgumentTitle", New SetupEntry("")}, {"LaunchArgumentInfo", New SetupEntry("PCL")}, {"LaunchArgumentJavaSelect", New SetupEntry("", Source:=SetupSource.Registry)}, {"LaunchArgumentJavaAll", New SetupEntry("[]", Source:=SetupSource.Registry)}, {"LaunchArgumentIndie", New SetupEntry(0)}, {"LaunchArgumentVisible", New SetupEntry(5, Source:=SetupSource.Registry)}, {"LaunchArgumentPriority", New SetupEntry(1, Source:=SetupSource.Registry)}, {"LaunchArgumentWindowWidth", New SetupEntry(854)}, {"LaunchArgumentWindowHeight", New SetupEntry(480)}, {"LaunchArgumentWindowType", New SetupEntry(1)}, {"LaunchArgumentRam", New SetupEntry(False, Source:=SetupSource.Registry)}, {"LaunchAdvanceJvm", New SetupEntry("-XX:+UseG1GC -XX:-UseAdaptiveSizePolicy -XX:-OmitStackTraceInFastThrow -Dfml.ignoreInvalidMinecraftCertificates=True -Dfml.ignorePatchDiscrepancies=True -Dlog4j2.formatMsgNoLookups=true")}, {"LaunchAdvanceGame", New SetupEntry("")}, {"LaunchAdvanceRun", New SetupEntry("")}, {"LaunchAdvanceRunWait", New SetupEntry(True)}, {"LaunchAdvanceAssets", New SetupEntry(False)}, {"LaunchAdvanceJava", New SetupEntry(False)}, {"LaunchRamType", New SetupEntry(0)}, {"LaunchRamCustom", New SetupEntry(15)}, {"LinkEula", New SetupEntry(False, Source:=SetupSource.Registry)}, {"LinkName", New SetupEntry("", Source:=SetupSource.Registry)}, {"LinkHiperCertLast", New SetupEntry("", Source:=SetupSource.Registry)}, {"LinkHiperCertTime", New SetupEntry("", Source:=SetupSource.Registry)}, {"LinkHiperCertWarn", New SetupEntry(True, Source:=SetupSource.Registry)}, {"LinkIoiVersion", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)}, {"ToolHelpChinese", New SetupEntry(True, Source:=SetupSource.Registry)}, {"ToolDownloadThread", New SetupEntry(63, Source:=SetupSource.Registry)}, {"ToolDownloadSpeed", New SetupEntry(42, Source:=SetupSource.Registry)}, {"ToolDownloadVersion", New SetupEntry(0, Source:=SetupSource.Registry)}, {"ToolDownloadTranslate", New SetupEntry(0, Source:=SetupSource.Registry)}, {"ToolDownloadKeepModpack", New SetupEntry(False, Source:=SetupSource.Registry)}, {"ToolDownloadIgnoreQuilt", New SetupEntry(True, Source:=SetupSource.Registry)}, {"ToolDownloadCert", New SetupEntry(True, Source:=SetupSource.Registry)}, {"ToolDownloadMod", New SetupEntry(1, Source:=SetupSource.Registry)}, {"ToolUpdateAlpha", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)}, {"ToolUpdateRelease", New SetupEntry(False, Source:=SetupSource.Registry)}, {"ToolUpdateSnapshot", New SetupEntry(False, Source:=SetupSource.Registry)}, {"ToolUpdateReleaseLast", New SetupEntry("", Source:=SetupSource.Registry)}, {"ToolUpdateSnapshotLast", New SetupEntry("", Source:=SetupSource.Registry)}, {"UiLauncherTransparent", New SetupEntry(600)}, '避免与 PCL1 设置冲突(UiLauncherOpacity) {"UiLauncherHue", New SetupEntry(180)}, {"UiLauncherSat", New SetupEntry(80)}, {"UiLauncherDelta", New SetupEntry(90)}, {"UiLauncherLight", New SetupEntry(20)}, {"UiLauncherTheme", New SetupEntry(0)}, {"UiLauncherThemeGold", New SetupEntry("", Source:=SetupSource.Registry, Encoded:=True)}, {"UiLauncherThemeHide", New SetupEntry("0|1|2|3|4", Source:=SetupSource.Registry, Encoded:=True)}, {"UiLauncherThemeHide2", New SetupEntry("0|1|2|3|4", Source:=SetupSource.Registry, Encoded:=True)}, {"UiLauncherLogo", New SetupEntry(True)}, {"UiLauncherEmail", New SetupEntry(False)}, {"UiBackgroundColorful", New SetupEntry(True)}, {"UiBackgroundOpacity", New SetupEntry(1000)}, {"UiBackgroundBlur", New SetupEntry(0)}, {"UiBackgroundSuit", New SetupEntry(0)}, {"UiCustomType", New SetupEntry(0)}, {"UiCustomPreset", New SetupEntry(0)}, {"UiCustomNet", New SetupEntry("")}, {"UiLogoType", New SetupEntry(1)}, {"UiLogoText", New SetupEntry("")}, {"UiLogoLeft", New SetupEntry(False)}, {"UiMusicVolume", New SetupEntry(500)}, {"UiMusicStop", New SetupEntry(False)}, {"UiMusicStart", New SetupEntry(False)}, {"UiMusicRandom", New SetupEntry(True)}, {"UiMusicAuto", New SetupEntry(True)}, {"UiHiddenPageDownload", New SetupEntry(False)}, {"UiHiddenPageLink", New SetupEntry(False)}, {"UiHiddenPageSetup", New SetupEntry(False)}, {"UiHiddenPageOther", New SetupEntry(False)}, {"UiHiddenFunctionSelect", New SetupEntry(False)}, {"UiHiddenFunctionHidden", New SetupEntry(False)}, {"UiHiddenSetupLaunch", New SetupEntry(False)}, {"UiHiddenSetupUi", New SetupEntry(False)}, {"UiHiddenSetupLink", New SetupEntry(False)}, {"UiHiddenSetupSystem", New SetupEntry(False)}, {"UiHiddenOtherHelp", New SetupEntry(False)}, {"UiHiddenOtherFeedback", New SetupEntry(False)}, {"UiHiddenOtherVote", New SetupEntry(False)}, {"UiHiddenOtherAbout", New SetupEntry(False)}, {"UiHiddenOtherTest", New SetupEntry(False)}, {"VersionAdvanceJvm", New SetupEntry("", Source:=SetupSource.Version)}, {"VersionAdvanceGame", New SetupEntry("", Source:=SetupSource.Version)}, {"VersionAdvanceAssets", New SetupEntry(0, Source:=SetupSource.Version)}, {"VersionAdvanceAssetsV2", New SetupEntry(False, Source:=SetupSource.Version)}, {"VersionAdvanceJava", New SetupEntry(False, Source:=SetupSource.Version)}, {"VersionAdvanceRun", New SetupEntry("", Source:=SetupSource.Version)}, {"VersionAdvanceRunWait", New SetupEntry(True, Source:=SetupSource.Version)}, {"VersionRamType", New SetupEntry(2, Source:=SetupSource.Version)}, {"VersionRamCustom", New SetupEntry(15, Source:=SetupSource.Version)}, {"VersionRamOptimize", New SetupEntry(0, Source:=SetupSource.Version)}, {"VersionArgumentTitle", New SetupEntry("", Source:=SetupSource.Version)}, {"VersionArgumentInfo", New SetupEntry("", Source:=SetupSource.Version)}, {"VersionArgumentIndie", New SetupEntry(-1, Source:=SetupSource.Version)}, {"VersionArgumentJavaSelect", New SetupEntry("使用全局设置", Source:=SetupSource.Version)}, {"VersionServerEnter", New SetupEntry("", Source:=SetupSource.Version)}, {"VersionServerLogin", New SetupEntry(0, Source:=SetupSource.Version)}, {"VersionServerNide", New SetupEntry("", Source:=SetupSource.Version)}, {"VersionServerAuthRegister", New SetupEntry("", Source:=SetupSource.Version)}, {"VersionServerAuthName", New SetupEntry("", Source:=SetupSource.Version)}, {"VersionServerAuthServer", New SetupEntry("", Source:=SetupSource.Version)} } #Region "基础" Private Enum SetupSource Normal Registry Version End Enum Private Class SetupEntry Public Encoded As Boolean Public DefaultValue Public DefaultValueEncoded Public Value Public Source As SetupSource '加载状态:0/未读取 1/已读取未处理 2/已处理 Public State As Byte = 0 Public Type Public Sub New(Value, Optional Source = SetupSource.Normal, Optional Encoded = False) Me.DefaultValue = Value Me.DefaultValueEncoded = If(Encoded, SecretEncrypt(Value, "PCL" & UniqueAddress), Value) Me.Encoded = Encoded Me.Value = Value Me.Source = Source Type = If(Value, New Object).GetType End Sub End Class ''' ''' 改变某个设置项的值。 ''' 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 Private Sub [Set](Key As String, Value As Object, E As SetupEntry, ForceReload As Boolean, Version As McVersion) Try Value = CTypeDynamic(Value, E.Type) If E.State = 2 Then '如果已应用,且值相同,则无需再次更改 If E.Value = Value AndAlso Not ForceReload Then Exit Sub Else '如果未应用,则直接更改并应用 If E.Source <> SetupSource.Version Then E.State = 2 End If '设置新值 E.Value = Value '写入值 If E.Encoded Then Try If Value Is Nothing Then Value = "" Value = SecretEncrypt(Value, "PCL" & UniqueAddress) Catch ex As Exception Log(ex, "加密设置失败:" & Key, LogLevel.Developer) End Try End If Select Case E.Source Case SetupSource.Normal WriteIni("Setup", Key, Value) Case SetupSource.Registry WriteReg(Key, Value) Case SetupSource.Version If Version Is Nothing Then Throw New Exception("更改版本设置 " & Key & " 时未提供目标版本") Else WriteIni(Version.Path & "PCL\Setup.ini", Key, Value) End If End Select '应用 '例如 VersionServerLogin 要求在设置之后再引发事件 Dim Method As Reflection.MethodInfo = GetType(ModSetup).GetMethod(Key) If Method IsNot Nothing Then Method.Invoke(Me, {Value}) Catch ex As Exception Log(ex, "设置设置项时出错(" & Key & ", " & Value & ")", LogLevel.Feedback) End Try End Sub ''' ''' 应用某个设置项的值。 ''' Public Function Load(Key As String, Optional ForceReload As Boolean = False, Optional Version As McVersion = Nothing) Return Load(Key, SetupDict(Key), ForceReload, Version) End Function Private Function Load(Key As String, E As SetupEntry, ForceReload As Boolean, Version As McVersion) '如果已经应用过,则什么也不干 If E.State = 2 AndAlso Not ForceReload Then Return E.Value '读取,应用并设置状态 Read(Key, E, Version) If E.Source <> SetupSource.Version Then E.State = 2 Dim Method As Reflection.MethodInfo = GetType(ModSetup).GetMethod(Key) If Method IsNot Nothing Then Method.Invoke(Me, {E.Value}) Return E.Value End Function ''' ''' 获取某个设置项的值。 ''' Public Function [Get](Key As String, Optional Version As McVersion = Nothing) If Not SetupDict.ContainsKey(Key) Then Throw New KeyNotFoundException("未找到设置项:" & Key) With {.Source = Key} Return [Get](Key, SetupDict(Key), Version) End Function Private Function [Get](Key As String, E As SetupEntry, Version As McVersion) '获取强制值 Dim Force As String = ForceValue(Key) If Force IsNot Nothing Then E.Value = CTypeDynamic(Force, E.Type) E.State = 1 End If '如果尚未读取过,则读取 If E.State = 0 Then Read(Key, E, Version) If E.Source <> SetupSource.Version Then E.State = 1 End If '返回现在的值 Return E.Value End Function ''' ''' 初始化某个设置项的值。 ''' Public Sub Reset(Key As String, Optional ForceReload As Boolean = False, Optional Version As McVersion = Nothing) Dim E As SetupEntry = SetupDict(Key) [Set](Key, E.DefaultValue, E, ForceReload, Version) End Sub Private Sub Read(Key As String, ByRef E As SetupEntry, Version As McVersion) Try If Not E.State = 0 Then Exit Sub Dim SourceValue As String '先用 String 储存,避免类型转换 Select Case E.Source Case SetupSource.Normal SourceValue = ReadIni("Setup", Key, E.DefaultValueEncoded) Case SetupSource.Registry SourceValue = ReadReg(Key, E.DefaultValueEncoded) Case Else 'SetupSource.Version If Version Is Nothing Then Throw New Exception("读取版本设置 " & Key & " 时未提供目标版本") Else SourceValue = ReadIni(Version.Path & "PCL\Setup.ini", Key, E.DefaultValueEncoded) End If End Select If E.Encoded Then If SourceValue.Equals(E.DefaultValueEncoded) Then SourceValue = E.DefaultValue Else Try SourceValue = SecretDecrypt(SourceValue, "PCL" & UniqueAddress) Catch ex As Exception Log(ex, "解密设置失败:" & Key, LogLevel.Developer) SourceValue = E.DefaultValue Setup.Set(Key, E.DefaultValue, True) End Try End If End If E.Value = CTypeDynamic(SourceValue, E.Type) Catch ex As Exception Log(ex, "读取设置失败:" & Key, LogLevel.Hint) E.Value = CTypeDynamic(E.DefaultValue, E.Type) End Try End Sub '对部分设置强制赋值 Private Function ForceValue(Key As String) As String #If BETA Then If Key = "UiLauncherTheme" Then Return "0" #End If If Key = "UiHiddenPageLink" Then Return True If Key = "UiHiddenSetupLink" Then Return True Return Nothing End Function #End Region #Region "Launch" '切换选择 Public Sub LaunchVersionSelect(Value As String) Log("[Setup] 当前选择的 Minecraft 版本:" & Value) WriteIni(PathMcFolder & "PCL.ini", "Version", If(IsNothing(McVersionCurrent), "", McVersionCurrent.Name)) End Sub Public Sub LaunchFolderSelect(Value As String) Log("[Setup] 当前选择的 Minecraft 文件夹:" & Value.ToString.Replace("$", Path)) PathMcFolder = Value.ToString.Replace("$", Path) End Sub '游戏内存 Public Sub LaunchRamType(Type As Integer) If FrmSetupLaunch Is Nothing Then Exit Sub FrmSetupLaunch.RamType(Type) End Sub '离线皮肤 Public Sub LaunchSkinType(Value As Integer) RunInUi(Sub() If Not IsNothing(FrmSetupLaunch) Then Select Case Value 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 If PageLaunchLeft.SkinLegacy.Start() End Sub) End Sub Public Sub LaunchSkinID(Value As String) PageLaunchLeft.SkinLegacy.Start() End Sub #End Region #Region "Tool" Public Sub ToolDownloadThread(Value As Integer) NetTaskThreadLimit = Value + 1 End Sub Public Sub ToolDownloadCert(Value As Boolean) Net.ServicePointManager.ServerCertificateValidationCallback = If(Value, Nothing, New Net.Security.RemoteCertificateValidationCallback(Function() True)) End Sub Public Sub ToolDownloadSpeed(Value As Integer) If Value <= 14 Then NetTaskSpeedLimitHigh = (Value + 1) * 0.1 * 1024 * 1024L ElseIf Value <= 31 Then NetTaskSpeedLimitHigh = (Value - 11) * 0.5 * 1024 * 1024L ElseIf Value <= 41 Then NetTaskSpeedLimitHigh = (Value - 21) * 1024 * 1024L Else NetTaskSpeedLimitHigh = -1 End If End Sub #End Region #Region "UI" '启动器 Public Sub UiLauncherTransparent(Value As Integer) FrmMain.Opacity = Value / 1000 + 0.4 End Sub #If Not BETA Then Public Sub UiLauncherTheme(Value As Integer) ThemeRefresh(Value) End Sub #End If Public Sub UiBackgroundColorful(Value As Boolean) ThemeRefresh() End Sub '背景图片 Public Sub UiBackgroundOpacity(Value As Integer) FrmMain.ImgBack.Opacity = Value / 1000 End Sub Public Sub UiBackgroundBlur(Value As Integer) If Value = 0 Then FrmMain.ImgBack.Effect = Nothing Else FrmMain.ImgBack.Effect = New Effects.BlurEffect With {.Radius = Value + 1} End If FrmMain.ImgBack.Margin = New Thickness(-(Value + 1) / 1.8) End Sub Public Sub UiBackgroundSuit(Value As Integer) If IsNothing(FrmMain.ImgBack.Background) Then Exit Sub Dim Width As Double = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width Dim Height As Double = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height If Value = 0 Then '智能:当图片较小时平铺,较大时适应 If Width < FrmMain.PanMain.ActualWidth / 2 AndAlso Height < FrmMain.PanMain.ActualHeight / 2 Then Value = 4 '平铺 Else Value = 2 '适应 End If End If CType(FrmMain.ImgBack.Background, ImageBrush).TileMode = TileMode.None CType(FrmMain.ImgBack.Background, ImageBrush).Viewport = New Rect(0, 0, 1, 1) CType(FrmMain.ImgBack.Background, ImageBrush).ViewportUnits = BrushMappingMode.RelativeToBoundingBox Select Case Value Case 1 '居中 FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Center FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Center CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height Case 2 '适应 FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Stretch FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Stretch CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.UniformToFill FrmMain.ImgBack.Width = Double.NaN FrmMain.ImgBack.Height = Double.NaN Case 3 '拉伸 FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Stretch FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Stretch CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.Fill FrmMain.ImgBack.Width = Double.NaN FrmMain.ImgBack.Height = Double.NaN Case 4 '平铺 FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Stretch FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Stretch CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None CType(FrmMain.ImgBack.Background, ImageBrush).TileMode = TileMode.Tile CType(FrmMain.ImgBack.Background, ImageBrush).Viewport = New Rect(0, 0, CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width, CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height) CType(FrmMain.ImgBack.Background, ImageBrush).ViewportUnits = BrushMappingMode.Absolute FrmMain.ImgBack.Width = Double.NaN FrmMain.ImgBack.Height = Double.NaN Case 5 '左上 FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Left FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Top CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height Case 6 '右上 FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Right FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Top CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height Case 7 '左下 FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Left FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Bottom CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height Case 8 '右下 FrmMain.ImgBack.HorizontalAlignment = HorizontalAlignment.Right FrmMain.ImgBack.VerticalAlignment = VerticalAlignment.Bottom CType(FrmMain.ImgBack.Background, ImageBrush).Stretch = Stretch.None FrmMain.ImgBack.Width = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Width FrmMain.ImgBack.Height = CType(FrmMain.ImgBack.Background, ImageBrush).ImageSource.Height End Select End Sub '主页 Public Sub UiCustomType(Value As Integer) If FrmSetupUI Is Nothing Then Exit Sub Select Case Value Case 0 '无 FrmSetupUI.PanCustomPreset.Visibility = Visibility.Collapsed FrmSetupUI.PanCustomLocal.Visibility = Visibility.Collapsed FrmSetupUI.PanCustomNet.Visibility = Visibility.Collapsed FrmSetupUI.HintCustom.Visibility = Visibility.Collapsed Case 1 '本地 FrmSetupUI.PanCustomPreset.Visibility = Visibility.Collapsed FrmSetupUI.PanCustomLocal.Visibility = Visibility.Visible FrmSetupUI.PanCustomNet.Visibility = Visibility.Collapsed FrmSetupUI.HintCustom.Visibility = Visibility.Visible FrmSetupUI.HintCustom.Text = $"从 PCL 文件夹下的 Custom.xaml 读取主页内容。{vbCrLf}你可以手动编辑该文件,向主页添加文本、图片、常用网站、快捷启动等功能。" FrmSetupUI.HintCustom.EventType = "" FrmSetupUI.HintCustom.EventData = "" Case 2 '联网 FrmSetupUI.PanCustomPreset.Visibility = Visibility.Collapsed FrmSetupUI.PanCustomLocal.Visibility = Visibility.Collapsed FrmSetupUI.PanCustomNet.Visibility = Visibility.Visible FrmSetupUI.HintCustom.Visibility = Visibility.Visible FrmSetupUI.HintCustom.Text = $"从指定网址联网获取主页内容。服主也可以用于动态更新服务器公告。{vbCrLf}如果你制作了稳定运行的联网主页,可以点击这条提示投稿,若合格即可加入预设!" FrmSetupUI.HintCustom.EventType = "打开网页" FrmSetupUI.HintCustom.EventData = "https://github.com/Hex-Dragon/PCL2/discussions/2528" Case 3 '预设 FrmSetupUI.PanCustomPreset.Visibility = Visibility.Visible FrmSetupUI.PanCustomLocal.Visibility = Visibility.Collapsed FrmSetupUI.PanCustomNet.Visibility = Visibility.Collapsed FrmSetupUI.HintCustom.Visibility = Visibility.Collapsed End Select FrmSetupUI.CardCustom.TriggerForceResize() End Sub '顶部栏 Public Sub UiLogoType(Value As Integer) Select Case Value Case 0 '无 FrmMain.ShapeTitleLogo.Visibility = Visibility.Collapsed FrmMain.LabTitleLogo.Visibility = Visibility.Collapsed FrmMain.ImageTitleLogo.Visibility = Visibility.Collapsed If Not IsNothing(FrmSetupUI) Then FrmSetupUI.CheckLogoLeft.Visibility = Visibility.Visible FrmSetupUI.PanLogoText.Visibility = Visibility.Collapsed FrmSetupUI.PanLogoChange.Visibility = Visibility.Collapsed End If Case 1 '默认 FrmMain.ShapeTitleLogo.Visibility = Visibility.Visible FrmMain.LabTitleLogo.Visibility = Visibility.Collapsed FrmMain.ImageTitleLogo.Visibility = Visibility.Collapsed If Not IsNothing(FrmSetupUI) Then FrmSetupUI.CheckLogoLeft.Visibility = Visibility.Collapsed FrmSetupUI.PanLogoText.Visibility = Visibility.Collapsed FrmSetupUI.PanLogoChange.Visibility = Visibility.Collapsed End If Case 2 '文本 FrmMain.ShapeTitleLogo.Visibility = Visibility.Collapsed FrmMain.LabTitleLogo.Visibility = Visibility.Visible FrmMain.ImageTitleLogo.Visibility = Visibility.Collapsed If Not IsNothing(FrmSetupUI) Then FrmSetupUI.CheckLogoLeft.Visibility = Visibility.Collapsed FrmSetupUI.PanLogoText.Visibility = Visibility.Visible FrmSetupUI.PanLogoChange.Visibility = Visibility.Collapsed End If Setup.Load("UiLogoText", True) Case 3 '图片 FrmMain.ShapeTitleLogo.Visibility = Visibility.Collapsed FrmMain.LabTitleLogo.Visibility = Visibility.Collapsed FrmMain.ImageTitleLogo.Visibility = Visibility.Visible If Not IsNothing(FrmSetupUI) Then FrmSetupUI.CheckLogoLeft.Visibility = Visibility.Collapsed FrmSetupUI.PanLogoText.Visibility = Visibility.Collapsed FrmSetupUI.PanLogoChange.Visibility = Visibility.Visible End If Try FrmMain.ImageTitleLogo.Source = New MyBitmap(Path & "PCL\Logo.png") Catch ex As Exception FrmMain.ImageTitleLogo.Source = Nothing Log(ex, "显示标题栏图片失败", LogLevel.Msgbox) End Try End Select Setup.Load("UiLogoLeft", True) If Not IsNothing(FrmSetupUI) Then FrmSetupUI.CardLogo.TriggerForceResize() End Sub Public Sub UiLogoText(Value As String) FrmMain.LabTitleLogo.Text = Value End Sub Public Sub UiLogoLeft(Value As Boolean) FrmMain.PanTitleMain.ColumnDefinitions(0).Width = New GridLength(If(Value AndAlso (Setup.Get("UiLogoType") = 0), 0, 1), GridUnitType.Star) End Sub '功能隐藏 Public Sub UiHiddenPageLink(Value As Boolean) PageSetupUI.HiddenRefresh() End Sub Public Sub UiHiddenPageDownload(Value As Boolean) PageSetupUI.HiddenRefresh() End Sub Public Sub UiHiddenPageSetup(Value As Boolean) PageSetupUI.HiddenRefresh() End Sub Public Sub UiHiddenPageOther(Value As Boolean) PageSetupUI.HiddenRefresh() End Sub Public Sub UiHiddenFunctionSelect(Value As Boolean) PageSetupUI.HiddenRefresh() End Sub Public Sub UiHiddenFunctionHidden(Value As Boolean) PageSetupUI.HiddenRefresh() End Sub Public Sub UiHiddenSetupLaunch(Value As Boolean) PageSetupUI.HiddenRefresh() End Sub Public Sub UiHiddenSetupUi(Value As Boolean) PageSetupUI.HiddenRefresh() End Sub Public Sub UiHiddenSetupLink(Value As Boolean) PageSetupUI.HiddenRefresh() End Sub Public Sub UiHiddenSetupSystem(Value As Boolean) PageSetupUI.HiddenRefresh() End Sub Public Sub UiHiddenOtherHelp(Value As Boolean) PageSetupUI.HiddenRefresh() End Sub Public Sub UiHiddenOtherFeedback(Value As Boolean) PageSetupUI.HiddenRefresh() End Sub Public Sub UiHiddenOtherVote(Value As Boolean) PageSetupUI.HiddenRefresh() End Sub Public Sub UiHiddenOtherAbout(Value As Boolean) PageSetupUI.HiddenRefresh() End Sub Public Sub UiHiddenOtherTest(Value As Boolean) PageSetupUI.HiddenRefresh() End Sub #End Region #Region "System" '调试选项 Public Sub SystemDebugMode(Value As Boolean) ModeDebug = Value End Sub Public Sub SystemDebugAnim(Value As Integer) AniSpeed = If(Value >= 30, 200, MathClamp(Value * 0.1 + 0.1, 0.1, 3)) End Sub #End Region #Region "Version" '游戏内存 Public Sub VersionRamType(Type As Integer) If FrmVersionSetup Is Nothing Then Exit Sub FrmVersionSetup.RamType(Type) End Sub '服务器 Public Sub VersionServerLogin(Type As Integer) If FrmVersionSetup Is Nothing Then Exit Sub '为第三方登录清空缓存以更新描述 WriteIni(PathMcFolder & "PCL.ini", "VersionCache", "") If PageVersionLeft.Version Is Nothing Then Exit Sub PageVersionLeft.Version = New McVersion(PageVersionLeft.Version.Name).Load() LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\") End Sub #End Region End Class