XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

LumaTunnel

【WinUI】LumaTunnel 是一个面向个人多设备的 Windows 代理系统。客户端在本机提供 HTTP/HTTPS CONNECT 与 SOCKS5 TCP 代理,并通过一个受信任 TLS 证书保护的 WSS 会话,将多个 TCP 流复用到自建 Windows Server 节点。

公开
关注 0 Fork 0 Star 0
UTF-8
using System.Diagnostics;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;

namespace LumaTunnel.Client.Views;

public sealed partial class SettingsPage : Page
{
    public SettingsPage() => InitializeComponent();
    private void OnLoaded(object sender, RoutedEventArgs e)
    {
        var profile = AppServices.Profile;
        HttpPortBox.Value = profile.HttpPort;
        SocksPortBox.Value = profile.SocksPort;
        StartupToggle.IsOn = profile.StartAtLogin;
        CloseToTrayToggle.IsOn = profile.CloseToTray;
        ThemeBox.SelectedIndex = profile.Theme switch { "Light" => 1, "Dark" => 2, _ => 0 };
    }

    private async void OnSave(object sender, RoutedEventArgs e)
    {
        var http = checked((int)HttpPortBox.Value);
        var socks = checked((int)SocksPortBox.Value);
        if (http == socks || http is < 1 or > 65535 || socks is < 1 or > 65535)
        {
            Show("端口必须有效且不能相同。", InfoBarSeverity.Error);
            return;
        }
        if (AppServices.IsEnabled)
        {
            Show("请先关闭代理,再修改监听端口。", InfoBarSeverity.Warning);
            return;
        }
        var theme = ThemeBox.SelectedIndex switch { 1 => "Light", 2 => "Dark", _ => "System" };
        await AppServices.UpdateSettingsAsync(http, socks, CloseToTrayToggle.IsOn, StartupToggle.IsOn, theme);
        if (App.MainWindow?.Content is FrameworkElement root)
            root.RequestedTheme = theme switch { "Light" => ElementTheme.Light, "Dark" => ElementTheme.Dark, _ => ElementTheme.Default };
        Show("设置已保存。", InfoBarSeverity.Success);
    }

    private void OnOpenLogs(object sender, RoutedEventArgs e)
    {
        Directory.CreateDirectory(AppServices.ProfileStore.LogPath);
        Process.Start(new ProcessStartInfo("explorer.exe", AppServices.ProfileStore.LogPath) { UseShellExecute = true });
    }

    private void Show(string message, InfoBarSeverity severity) { MessageBar.Message = message; MessageBar.Severity = severity; MessageBar.IsOpen = true; }
}