diff --git a/Shadowsocks.WPF/ViewModels/MainWindowViewModel.cs b/Shadowsocks.WPF/ViewModels/MainWindowViewModel.cs index c024f127..87d22bfc 100644 --- a/Shadowsocks.WPF/ViewModels/MainWindowViewModel.cs +++ b/Shadowsocks.WPF/ViewModels/MainWindowViewModel.cs @@ -1,4 +1,6 @@ using ReactiveUI; +using ReactiveUI.Fody.Helpers; +using Shadowsocks.WPF.Views; namespace Shadowsocks.WPF.ViewModels { @@ -6,6 +8,18 @@ namespace Shadowsocks.WPF.ViewModels { public MainWindowViewModel() { + GetDashboardView = new(); + GetServersView = new(); + GetRoutingView = new(); + GetSettingsView = new(); } + + public DashboardView GetDashboardView { get; } + + public ServersView GetServersView { get; } + + public RoutingView GetRoutingView { get; } + + public SettingsView GetSettingsView { get; } } } diff --git a/Shadowsocks.WPF/Views/DashboardView.xaml b/Shadowsocks.WPF/Views/DashboardView.xaml index 4614e373..84d0f9cd 100644 --- a/Shadowsocks.WPF/Views/DashboardView.xaml +++ b/Shadowsocks.WPF/Views/DashboardView.xaml @@ -8,20 +8,31 @@ xmlns:local="clr-namespace:Shadowsocks.WPF.Views" xmlns:vms="clr-namespace:Shadowsocks.WPF.ViewModels" xmlns:reactiveui="http://reactiveui.net" + xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" xmlns:lex="http://wpflocalizeextension.codeplex.com" lex:LocalizeDictionary.DesignCulture="en" lex:ResxLocalizationProvider.DefaultAssembly="Shadowsocks" lex:ResxLocalizationProvider.DefaultDictionary="Strings" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> - - - - - - - - - - + + + + + + + + + + + + Dashboard + + + diff --git a/Shadowsocks.WPF/Views/MainWindow.xaml.cs b/Shadowsocks.WPF/Views/MainWindow.xaml.cs index 25115d9a..98434331 100644 --- a/Shadowsocks.WPF/Views/MainWindow.xaml.cs +++ b/Shadowsocks.WPF/Views/MainWindow.xaml.cs @@ -1,6 +1,6 @@ using ReactiveUI; - using Shadowsocks.WPF.ViewModels; +using System.Reactive.Disposables; namespace Shadowsocks.WPF.Views { @@ -15,7 +15,22 @@ namespace Shadowsocks.WPF.Views ViewModel = new MainWindowViewModel(); this.WhenActivated(disposables => { - + this.OneWayBind(ViewModel, + viewModel => viewModel.GetDashboardView, + view => view.dashboardTabItem.Content) + .DisposeWith(disposables); + this.OneWayBind(ViewModel, + viewModel => viewModel.GetServersView, + view => view.serversTabItem.Content) + .DisposeWith(disposables); + this.OneWayBind(ViewModel, + viewModel => viewModel.GetRoutingView, + view => view.routingTabItem.Content) + .DisposeWith(disposables); + this.OneWayBind(ViewModel, + viewModel => viewModel.GetSettingsView, + view => view.settingsTabItem.Content) + .DisposeWith(disposables); }); } } diff --git a/Shadowsocks.WPF/Views/RoutingView.xaml b/Shadowsocks.WPF/Views/RoutingView.xaml index 01766672..3bcdb00c 100644 --- a/Shadowsocks.WPF/Views/RoutingView.xaml +++ b/Shadowsocks.WPF/Views/RoutingView.xaml @@ -8,20 +8,102 @@ xmlns:local="clr-namespace:Shadowsocks.WPF.Views" xmlns:vms="clr-namespace:Shadowsocks.WPF.ViewModels" xmlns:reactiveui="http://reactiveui.net" + xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" xmlns:lex="http://wpflocalizeextension.codeplex.com" lex:LocalizeDictionary.DesignCulture="en" lex:ResxLocalizationProvider.DefaultAssembly="Shadowsocks" lex:ResxLocalizationProvider.DefaultDictionary="Strings" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> - - - - - - - - - - + + + + + + + + + + + + + + + Routing + + + + Preset + + + + + + + + + + Domain strategy + + + + AsIs + + + IPIfNonMatch + + + IPOnDemand + + + + + Rules + + + + diff --git a/Shadowsocks.WPF/Views/ServersView.xaml b/Shadowsocks.WPF/Views/ServersView.xaml index d2cbd701..46f3caa3 100644 --- a/Shadowsocks.WPF/Views/ServersView.xaml +++ b/Shadowsocks.WPF/Views/ServersView.xaml @@ -8,20 +8,31 @@ xmlns:local="clr-namespace:Shadowsocks.WPF.Views" xmlns:vms="clr-namespace:Shadowsocks.WPF.ViewModels" xmlns:reactiveui="http://reactiveui.net" + xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" xmlns:lex="http://wpflocalizeextension.codeplex.com" lex:LocalizeDictionary.DesignCulture="en" lex:ResxLocalizationProvider.DefaultAssembly="Shadowsocks" lex:ResxLocalizationProvider.DefaultDictionary="Strings" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> - - - - - - - - - - + + + + + + + + + + + + Servers + + + diff --git a/Shadowsocks.WPF/Views/SettingsView.xaml b/Shadowsocks.WPF/Views/SettingsView.xaml index 471ef2c7..6a2a6fe3 100644 --- a/Shadowsocks.WPF/Views/SettingsView.xaml +++ b/Shadowsocks.WPF/Views/SettingsView.xaml @@ -8,20 +8,151 @@ xmlns:local="clr-namespace:Shadowsocks.WPF.Views" xmlns:vms="clr-namespace:Shadowsocks.WPF.ViewModels" xmlns:reactiveui="http://reactiveui.net" + xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" xmlns:lex="http://wpflocalizeextension.codeplex.com" lex:LocalizeDictionary.DesignCulture="en" lex:ResxLocalizationProvider.DefaultAssembly="Shadowsocks" lex:ResxLocalizationProvider.DefaultDictionary="Strings" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + Settings + + + + UI + + + + Color Mode + + + + System + + + Light + + + Dark + + + + + Backend + + + Start on boot + + + + + shadowsocks-rust Path + + + + + + V2Ray Path + + + + + + Network + + + Forward Proxy + + + +