using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using PCL.Core.UI; using PCL.Core.UI.Theme; using PCL.Core.App.Localization; namespace PCL; public partial class ServerCard { private readonly IconManager _manager; public MinecraftServerInfo server; public ServerCard() { InitializeComponent(); DataContext = new IconManager(); // 示例:可在代码中切换图标 _manager = DataContext as IconManager; _manager.AddIconFromXaml("signal_1", ""); _manager.AddIconFromXaml("signal_2", ""); _manager.AddIconFromXaml("signal_3", ""); _manager.AddIconFromXaml("signal_4", ""); _manager.AddIconFromXaml("signal_5", ""); _manager.AddIconFromXaml("signal_offline", ""); _manager.AddIconFromXaml("loading", ""); } public event EventHandler? RemoveServer; public event EventHandler? EditServer; private void BtnSkin_Click(object sender, EventArgs eventArgs) { BtnSetting.ContextMenu.IsOpen = true; } /// /// 初始化服务器卡片 /// public void UpdateServerInfo(MinecraftServerInfo serverInfo) { server = serverInfo; ModBase.RunInUi(() => UpdateServerUi()); } /// /// 更新服务器UI /// private async void UpdateServerUi() { if (server is null) return; // 更新服务器名称 ServerName.Text = server.Name; await ImageLoaderHelper.SetServerLogoAsync(server.Icon, ServerIcon); if (server.Status == ServerStatus.Online) { _manager.SetSelectedIconByName(GetSignalIcon(server.Ping)); Signal.ToolTip = $"{server.Ping}ms"; ToolTipService.SetInitialShowDelay(Signal, 0); ToolTipService.SetBetweenShowDelay(Signal, 50); ToolTipService.SetPlacement(Signal, PlacementMode.Top); if (server.PlayerCount != default && server.MaxPlayers != default) ServerPlayer.Text = $"{server.PlayerCount} / {server.MaxPlayers}"; else ServerPlayer.Text = "???"; ServerMotD.Visibility = Visibility.Collapsed; MotdRenderer.RenderMotd(server.Description, ThemeService.IsDarkMode, 2); MotdRenderer.RenderCanvas(); } else if (server.Status == ServerStatus.Pinging) { _manager.SetSelectedIconByName("loading"); MotdRenderer.ClearCanvas(); ServerPlayer.Text = Lang.Text("Instance.Server.Card.Connecting"); ServerMotD.Text = Lang.Text("Instance.Server.Card.ConnectingDots"); ServerMotD.Visibility = Visibility.Visible; } else if (server.Status == ServerStatus.Offline) { _manager.SetSelectedIconByName("signal_offline"); MotdRenderer.ClearCanvas(); ServerPlayer.Text = Lang.Text("Instance.Server.Card.Offline"); ServerMotD.Text = Lang.Text("Instance.Server.Card.ServerOffline"); ServerMotD.Visibility = Visibility.Visible; } } private string GetSignalIcon(int ping) { switch (ping) { case var @case when 0 <= @case && @case <= 99: { return "signal_5"; // 5 条信号 } case var case1 when 100 <= case1 && case1 <= 299: { return "signal_4"; // 4 条信号 } case var case2 when 300 <= case2 && case2 <= 599: { return "signal_3"; // 3 条信号 } case var case3 when 600 <= case3 && case3 <= 999: { return "signal_2"; // 2 条信号 } default: { return "signal_1"; // 1 条信号 } } } /// /// 刷新服务器状态 /// public async Task RefreshServerStatusAsync(bool withHint, CancellationToken token = default) { if (withHint) HintService.Hint(Lang.Text("Instance.Server.Card.RefreshingStatus", server.Name)); server.Status = ServerStatus.Pinging; await Dispatcher.InvokeAsync(() => UpdateServerUi()); var serverInfo = await PageInstanceServer.PingServerAsync(server, token); UpdateServerInfo(serverInfo); } /// /// 连接到服务器 /// private void BtnConnect_Click(object sender, EventArgs e) { try { var launchOptions = new ModLaunch.McLaunchOptions { ServerIp = server.Address, instance = PageInstanceLeft.McInstance }; ModLaunch.McLaunchStart(launchOptions); ModMain.frmMain.PageChange(new FormMain.PageStackData { page = FormMain.PageType.Launch }); HintService.Hint(Lang.Text("Instance.Server.Card.ConnectingTo", server.Name)); } catch (Exception ex) { ModBase.Log( ex, Lang.Text("Instance.Server.Card.LaunchFailed"), ModBase.LogLevel.Feedback, userSummary: Lang.Text("Instance.Server.Card.LaunchFailed")); HintService.Hint(Lang.Text("Instance.Server.Card.LaunchFailedMsg", ex.Message), HintType.Error); } } /// /// 复制服务器地址 /// private void BtnCopy_Click(object sender, RoutedEventArgs e) { try { Clipboard.SetText(server.Address); HintService.Hint(Lang.Text("Instance.Server.Card.AddressCopied", server.Address), HintType.Success); } catch (Exception ex) { ModBase.Log(ex, Lang.Text("Instance.Server.Card.CopyAddressFailed")); HintService.Hint(Lang.Text("Instance.Server.Card.CopyAddressFailed"), HintType.Error); } } /// /// 刷新服务器状态 /// private async void BtnRefresh_Click(object sender, RoutedEventArgs e) { await Task.Run(async () => await RefreshServerStatusAsync(true)); } /// /// 编辑服务器信息 /// private void BtnEdit_Click(object sender, RoutedEventArgs e) { try { // Get server information var result = PageInstanceServer.GetServerInfo(server); if (!result.Success) return; EditServer?.Invoke(this, new ResultEventArgs(result.Name, result.Address)); } // Update server object // _server.Name = result.Name // _server.Address = result.Address catch (Exception ex) { HintService.Hint(Lang.Text("Instance.Server.Card.EditFailed", ex.Message), HintType.Error); } } private void BtnRemove_Click(object sender, RoutedEventArgs e) { if (ModMain.MyMsgBox( Lang.Text("Instance.Server.Card.RemoveConfirmMessage", server.Name, server.Address), Lang.Text("Instance.Server.Card.RemoveConfirmTitle"), Lang.Text("Common.Action.Confirm"), Lang.Text("Common.Action.Cancel") ) == 1) RemoveServer?.Invoke(this, EventArgs.Empty); } public class ResultEventArgs : EventArgs { public ResultEventArgs(string param1, string param2) { Param1 = param1; Param2 = param2; } public string Param1 { get; set; } public string Param2 { get; set; } } }