using System.Windows; using System.Windows.Controls; using System.Windows.Input; using PCL.Core.App; using PCL.Core.App.Configuration; using PCL.Core.App.Localization; using PCL.Core.Link.Scaffolding.EasyTier; namespace PCL; public partial class PageSetupGameLink { private bool isFirstLoad = true; private new bool isLoaded; public PageSetupGameLink() { InitializeComponent(); TextUdpNatType.Text = Lang.Text("Setup.GameLink.NetworkTest.UdpNatType", Lang.Text("Setup.GameLink.NetworkTest.NotTested")); TextTcpNatType.Text = Lang.Text("Setup.GameLink.NetworkTest.TcpNatType", Lang.Text("Setup.GameLink.NetworkTest.NotTested")); TextIpv6Status.Text = Lang.Text("Setup.GameLink.NetworkTest.Ipv6Status", Lang.Text("Setup.GameLink.NetworkTest.NotTested")); Loaded += PageSetupLink_Loaded; Loaded += (_, _) => Reload(); } private void PageSetupLink_Loaded(object sender, RoutedEventArgs e) { // 重复加载部分 PanBack.ScrollToHome(); // 非重复加载部分 if (isLoaded) return; isLoaded = true; ModAnimation.AniControlEnabled += 1; Reload(); ModAnimation.AniControlEnabled -= 1; } public void Reload() { TextLinkUsername.Text = Config.Link.Username; // TextLinkRelay.Text = Config.Link.RelayServer // ComboRelayType.SelectedIndex = Config.Link.RelayType // ComboServerType.SelectedIndex = Config.Link.ServerType CheckLatencyFirstMode.Checked = Config.Link.UseLatencyFirstMode; ComboPreferProtocol.SelectedIndex = (int)Config.Link.ProtocolPreference; CheckTryPunchSym.Checked = Config.Link.TryPunchSym; CheckEnableIPv6.Checked = Config.Link.EnableIPv6; CheckEnableCliOutput.Checked = Config.Link.EnableCliOutput; // TextRelays.Text = "正在获取信息..." // Do While Not (PageLinkLobby.LobbyAnnouncementLoader.State = LoadState.Finished OrElse PageLinkLobby.LobbyAnnouncementLoader.State = LoadState.Failed) // Thread.Sleep(500) // Loop // If ETRelay.RelayList.Count > 0 Then // TextRelays.Text = "" // For Each Relay In ETRelay.RelayList // Select Case Relay.Type // Case ETRelayType.Community // TextRelays.Text += "[社区] " // Case ETRelayType.Selfhosted // TextRelays.Text += "[自有] " // Case Else 'ETRelayType.Custom // TextRelays.Text += "[自定义] " // End Select // TextRelays.Text += Relay.Name & "," // Next // TextRelays.Text = TextRelays.Text.BeforeLast(",") // Else // TextRelays.Text = "暂无,你可能需要手动添加中继服务器" // End If } // 初始化 public void Reset() { try { Config.Link.Reset(); ModBase.Log("[Setup] 已初始化联机页设置"); HintService.Hint(Lang.Text("Setup.GameLink.Initialized"), HintType.Success, false); Reload(); } catch (Exception ex) { ModBase.Log( ex, Lang.Text("Setup.GameLink.Error.InitFailed"), ModBase.LogLevel.Msgbox, userSummary: Lang.Text("Setup.GameLink.Error.InitFailed")); } Reload(); } // 将控件改变路由到设置改变 private void TextBoxChange(object senderRaw, TextChangedEventArgs e) { var sender = (MyTextBox)senderRaw; if (ModAnimation.AniControlEnabled == 0) SetByTag(sender.Tag?.ToString(), sender.Text); } private static void ComboBoxChange(MyComboBox sender, object e) { if (ModAnimation.AniControlEnabled == 0) SetByTag(sender.Tag?.ToString(), sender.SelectedIndex); } private void CheckBoxChange(object senderRaw, bool user) { var sender = (MyCheckBox)senderRaw; if (ModAnimation.AniControlEnabled == 0) SetByTag(sender.Tag?.ToString(), sender.Checked); } private static void SetByTag(string tag, object value) => ConfigService.TrySetValue(tag, value); private void LinkProtocolPerferenceChange(object sender, SelectionChangedEventArgs e) { if (ModAnimation.AniControlEnabled == 0) try { var selection = (LinkProtocolPreference)((MyComboBox)sender).SelectedIndex; Config.Link.ProtocolPreference = selection; } catch (Exception ex) { ModBase.Log( ex, Lang.Text("Setup.GameLink.Error.ConfigChangeFailed"), ModBase.LogLevel.Hint, userSummary: Lang.Text("Setup.GameLink.Error.ConfigChangeFailed")); } } // 网络测试 private void BtnNetTest_Click(object sender, MouseButtonEventArgs e) { try { BtnNetTest.IsEnabled = false; BtnNetTest.Text = Lang.Text("Setup.GameLink.NetworkTest.Testing"); ModBase.RunInNewThread(() => { var status = CliNetTest.GetNetStatusAsync().GetAwaiter().GetResult(); ModBase.RunInUi(() => { TextUdpNatType.Text = Lang.Text("Setup.GameLink.NetworkTest.UdpNatType", CliNetTest.GetNatTypeString(status.UdpNatType)); TextTcpNatType.Text = Lang.Text("Setup.GameLink.NetworkTest.TcpNatType", CliNetTest.GetNatTypeString(status.TcpNatType)); TextIpv6Status.Text = Lang.Text("Setup.GameLink.NetworkTest.Ipv6Status", status.SupportIPv6 ? Lang.Text("Setup.GameLink.NetworkTest.Supported") : Lang.Text("Setup.GameLink.NetworkTest.Unsupported")); BtnNetTest.IsEnabled = true; BtnNetTest.Text = Lang.Text("Setup.GameLink.NetworkTest.Start"); }); }); } catch (Exception ex) { ModBase.Log(ex, "[Link] 获取网络测试结果失败", ModBase.LogLevel.Hint, userSummary: Lang.Text("Setup.GameLink.Error.NetworkTestFailed")); BtnNetTest.IsEnabled = true; BtnNetTest.Text = Lang.Text("Setup.GameLink.NetworkTest.Start"); } } }