diff --git a/v2rayN/Directory.Build.props b/v2rayN/Directory.Build.props index 12693e1c..37a05fdc 100644 --- a/v2rayN/Directory.Build.props +++ b/v2rayN/Directory.Build.props @@ -1,7 +1,7 @@ - 7.19.3 + 7.19.4 diff --git a/v2rayN/Directory.Packages.props b/v2rayN/Directory.Packages.props index 0921f480..839b3384 100644 --- a/v2rayN/Directory.Packages.props +++ b/v2rayN/Directory.Packages.props @@ -9,18 +9,18 @@ - + - + - + - + - + diff --git a/v2rayN/ServiceLib/Handler/ConfigHandler.cs b/v2rayN/ServiceLib/Handler/ConfigHandler.cs index d1704b80..c70c3577 100644 --- a/v2rayN/ServiceLib/Handler/ConfigHandler.cs +++ b/v2rayN/ServiceLib/Handler/ConfigHandler.cs @@ -95,10 +95,7 @@ public static class ConfigHandler config.GuiItem ??= new(); config.MsgUIItem ??= new(); - config.UiItem ??= new UIItem() - { - EnableUpdateSubOnlyRemarksExist = true - }; + config.UiItem ??= new(); config.UiItem.MainColumnItem ??= new(); config.UiItem.WindowSizeItem ??= new(); @@ -1132,6 +1129,84 @@ public static class ConfigHandler } } + /// + /// Searches the specified collection for a profile item that matches the target profile item based on a series of + /// criteria. + /// + /// The method attempts to find a match by comparing the target's remarks, address, port, and + /// password in various combinations. The search is performed in order of specificity, starting with the most + /// detailed comparison. If no match is found at any stage, the method returns null. + /// An enumerable collection of profile items to search. This parameter can be null. + /// The profile item to match against items in the source collection. This parameter can be null. + /// A profile item from the source collection that matches the target item according to defined criteria; otherwise, + /// null if no match is found or if either parameter is null. + private static ProfileItem? FindMatchedProfileItem(IEnumerable? source, ProfileItem? target) + { + if (source == null || target == null) + { + return null; + } + + var matchedItem = source.FirstOrDefault(t => CompareProfileItem(t, target, true)); + if (matchedItem != null) + { + return matchedItem; + } + + if (target.Remarks.IsNotEmpty()) + { + matchedItem = source.FirstOrDefault(t => t.Remarks == target.Remarks); + if (matchedItem != null) + { + return matchedItem; + } + } + + if (target.Address.IsNotEmpty() && target.Port > 0 && target.Password.IsNotEmpty()) + { + matchedItem = source.FirstOrDefault(t => + IsSameText(t.Address, target.Address) && + t.Port == target.Port && + IsSameText(t.Password, target.Password)); + if (matchedItem != null) + { + return matchedItem; + } + } + + if (target.Address.IsNotEmpty() && target.Port > 0) + { + matchedItem = source.FirstOrDefault(t => + IsSameText(t.Address, target.Address) && + t.Port == target.Port); + if (matchedItem != null) + { + return matchedItem; + } + } + + if (target.Address.IsNotEmpty()) + { + matchedItem = source.FirstOrDefault(t => IsSameText(t.Address, target.Address)); + if (matchedItem != null) + { + return matchedItem; + } + } + + return null; + + static bool IsSameText(string? left, string? right) + { + if (left.IsNullOrEmpty() || right.IsNullOrEmpty()) + { + return false; + } + + return string.Equals(left.TrimEx(), right.TrimEx(), StringComparison.OrdinalIgnoreCase); + } + } + /// /// Remove a single server profile by its index ID /// Deletes the configuration file if it's a custom config @@ -1628,7 +1703,7 @@ public static class ConfigHandler if (activeProfile != null) { var lstSub = await AppManager.Instance.ProfileItems(subid); - var existItem = lstSub?.FirstOrDefault(t => config.UiItem.EnableUpdateSubOnlyRemarksExist ? t.Remarks == activeProfile.Remarks : CompareProfileItem(t, activeProfile, true)); + var existItem = FindMatchedProfileItem(lstSub, activeProfile); if (existItem != null) { await ConfigHandler.SetDefaultServerIndex(config, existItem.IndexId); @@ -1641,7 +1716,7 @@ public static class ConfigHandler var lstSub = await AppManager.Instance.ProfileItems(subid); foreach (var item in lstSub) { - var existItem = lstOriSub?.FirstOrDefault(t => config.UiItem.EnableUpdateSubOnlyRemarksExist ? t.Remarks == item.Remarks : CompareProfileItem(t, item, true)); + var existItem = FindMatchedProfileItem(lstOriSub, item); if (existItem != null) { await StatisticsManager.Instance.CloneServerStatItem(existItem.IndexId, item.IndexId); diff --git a/v2rayN/ServiceLib/Models/ConfigItems.cs b/v2rayN/ServiceLib/Models/ConfigItems.cs index 56e5fe47..741c21e5 100644 --- a/v2rayN/ServiceLib/Models/ConfigItems.cs +++ b/v2rayN/ServiceLib/Models/ConfigItems.cs @@ -87,7 +87,6 @@ public class MsgUIItem public class UIItem { public bool EnableAutoAdjustMainLvColWidth { get; set; } - public bool EnableUpdateSubOnlyRemarksExist { get; set; } public int MainGirdHeight1 { get; set; } public int MainGirdHeight2 { get; set; } public EGirdOrientation MainGirdOrientation { get; set; } = EGirdOrientation.Vertical; diff --git a/v2rayN/ServiceLib/Resx/ResUI.Designer.cs b/v2rayN/ServiceLib/Resx/ResUI.Designer.cs index b00bec2d..5a1ea759 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.Designer.cs +++ b/v2rayN/ServiceLib/Resx/ResUI.Designer.cs @@ -3376,7 +3376,7 @@ namespace ServiceLib.Resx { } /// - /// 查找类似 Process (Tun mode) 的本地化字符串。 + /// 查找类似 Process (Linux/Windows) 的本地化字符串。 /// public static string TbRoutingRuleProcess { get { @@ -3816,15 +3816,6 @@ namespace ServiceLib.Resx { } } - /// - /// 查找类似 Updating subscription, only determining if remarks exist 的本地化字符串。 - /// - public static string TbSettingsEnableUpdateSubOnlyRemarksExist { - get { - return ResourceManager.GetString("TbSettingsEnableUpdateSubOnlyRemarksExist", resourceCulture); - } - } - /// /// 查找类似 Exception 的本地化字符串。 /// diff --git a/v2rayN/ServiceLib/Resx/ResUI.fa-Ir.resx b/v2rayN/ServiceLib/Resx/ResUI.fa-Ir.resx index 16836861..1dd09e85 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.fa-Ir.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.fa-Ir.resx @@ -1027,7 +1027,7 @@ پروتکل sing-box Mux - Process (Tun mode) + Process (Linux/Windows) IP or IP CIDR @@ -1098,9 +1098,6 @@ آدرس اینترنتی تست پینگ سرعت - - اشتراک در حال به‌روزرسانی، فقط مشخص کنید که ملاحظاتی آیا وجود دارد! - پایان تست... diff --git a/v2rayN/ServiceLib/Resx/ResUI.fr.resx b/v2rayN/ServiceLib/Resx/ResUI.fr.resx index 253831ef..c873db43 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.fr.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.fr.resx @@ -1024,7 +1024,7 @@ Protocole de multiplexage Mux (sing-box) - Process (Tun mode) + Process (Linux/Windows) IP ou IP CIDR @@ -1095,9 +1095,6 @@ Adresse de test de connexion réelle - - Ne vérifier l’existence de l’alias qu’à la maj. des abonnements - Arrêt du test en cours... @@ -1668,4 +1665,4 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if Group by Region - + \ No newline at end of file diff --git a/v2rayN/ServiceLib/Resx/ResUI.hu.resx b/v2rayN/ServiceLib/Resx/ResUI.hu.resx index a29d8987..f59a652b 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.hu.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.hu.resx @@ -1027,7 +1027,7 @@ sing-box Mux protokoll - Process (Tun mode) + Process (Linux/Windows) IP vagy IP CIDR @@ -1098,9 +1098,6 @@ Sebesség Ping Teszt URL - - Előfizetés frissítése, csak a megjegyzések létezésének ellenőrzése - Teszt megszakítása... diff --git a/v2rayN/ServiceLib/Resx/ResUI.resx b/v2rayN/ServiceLib/Resx/ResUI.resx index 17416125..f299a877 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.resx @@ -1027,7 +1027,7 @@ sing-box Mux Protocol - Process (Tun mode) + Process (Linux/Windows) IP or IP CIDR @@ -1098,9 +1098,6 @@ Speed Ping Test URL - - Updating subscription, only determining if remarks exist - Test terminating... diff --git a/v2rayN/ServiceLib/Resx/ResUI.ru.resx b/v2rayN/ServiceLib/Resx/ResUI.ru.resx index d8a174d5..957e6052 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.ru.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.ru.resx @@ -1027,7 +1027,7 @@ Протокол Mux для sing-box - Process (Tun mode) + Process (Linux/Windows) IP-адрес или сеть CIDR @@ -1098,9 +1098,6 @@ URL для быстрой проверки реальной задержки - - Обновляя подписку, проверять лишь наличие примечаний - Отмена тестирования... diff --git a/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx b/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx index 3a4e4924..d655c30d 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.zh-Hans.resx @@ -1024,7 +1024,7 @@ sing-box Mux 多路复用协议 - 进程 (Tun 模式) + 进程 (Linux/Windows) IP 或 IP CIDR @@ -1095,9 +1095,6 @@ 真连接测试地址 - - 更新订阅时只判断别名已存在否 - 测试终止中... diff --git a/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx b/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx index c4125679..65b1dbfb 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx +++ b/v2rayN/ServiceLib/Resx/ResUI.zh-Hant.resx @@ -1024,7 +1024,7 @@ sing-box Mux 多路復用協定 - 行程 (Tun 模式) + 行程 (Linux/Windows) IP 或 IP CIDR @@ -1095,9 +1095,6 @@ 真連線測試位址 - - 更新訂閱時只判斷別名是否存在 - 測試終止中... diff --git a/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs b/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs index 7bcb36ea..dc31b41b 100644 --- a/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs @@ -204,7 +204,7 @@ public class CheckUpdateViewModel : MyReactiveObject private async Task UpdateFinishedSub(bool blReload) { - RxApp.MainThreadScheduler.Schedule(blReload, (scheduler, blReload) => + RxSchedulers.MainThreadScheduler.Schedule(blReload, (scheduler, blReload) => { _ = UpdateFinishedResult(blReload); return Disposable.Empty; @@ -317,7 +317,7 @@ public class CheckUpdateViewModel : MyReactiveObject Remarks = msg, }; - RxApp.MainThreadScheduler.Schedule(item, (scheduler, model) => + RxSchedulers.MainThreadScheduler.Schedule(item, (scheduler, model) => { _ = UpdateViewResult(model); return Disposable.Empty; diff --git a/v2rayN/ServiceLib/ViewModels/ClashConnectionsViewModel.cs b/v2rayN/ServiceLib/ViewModels/ClashConnectionsViewModel.cs index 48500f3e..07de23f2 100644 --- a/v2rayN/ServiceLib/ViewModels/ClashConnectionsViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/ClashConnectionsViewModel.cs @@ -56,7 +56,7 @@ public class ClashConnectionsViewModel : MyReactiveObject return; } - RxApp.MainThreadScheduler.Schedule(ret?.connections, (scheduler, model) => + RxSchedulers.MainThreadScheduler.Schedule(ret?.connections, (scheduler, model) => { _ = RefreshConnections(model); return Disposable.Empty; diff --git a/v2rayN/ServiceLib/ViewModels/ClashProxiesViewModel.cs b/v2rayN/ServiceLib/ViewModels/ClashProxiesViewModel.cs index 6628e11d..6220719b 100644 --- a/v2rayN/ServiceLib/ViewModels/ClashProxiesViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/ClashProxiesViewModel.cs @@ -90,7 +90,7 @@ public class ClashProxiesViewModel : MyReactiveObject AppEvents.ProxiesReloadRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(async _ => await ProxiesReload()); #endregion AppEvents @@ -173,7 +173,7 @@ public class ClashProxiesViewModel : MyReactiveObject if (refreshUI) { - RxApp.MainThreadScheduler.Schedule(() => _ = RefreshProxyGroups()); + RxSchedulers.MainThreadScheduler.Schedule(() => _ = RefreshProxyGroups()); } } @@ -387,7 +387,7 @@ public class ClashProxiesViewModel : MyReactiveObject } var model = new SpeedTestResult() { IndexId = item.Name, Delay = result }; - RxApp.MainThreadScheduler.Schedule(model, (scheduler, model) => + RxSchedulers.MainThreadScheduler.Schedule(model, (scheduler, model) => { _ = ProxiesDelayTestResult(model); return Disposable.Empty; diff --git a/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs b/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs index 0bd0c588..ee92a0cd 100644 --- a/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs @@ -228,22 +228,22 @@ public class MainWindowViewModel : MyReactiveObject AppEvents.ReloadRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(async _ => await Reload()); AppEvents.AddServerViaScanRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(async _ => await AddServerViaScanAsync()); AppEvents.AddServerViaClipboardRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(async _ => await AddServerViaClipboardAsync(null)); AppEvents.SubscriptionsUpdateRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(async blProxy => await UpdateSubscriptionProcess("", blProxy)); #endregion AppEvents @@ -583,7 +583,7 @@ public class MainWindowViewModel : MyReactiveObject private void ReloadResult(bool showClashUI) { - RxApp.MainThreadScheduler.Schedule(() => + RxSchedulers.MainThreadScheduler.Schedule(() => { ShowClashUI = showClashUI; TabMainSelectedIndex = showClashUI ? TabMainSelectedIndex : 0; @@ -592,7 +592,7 @@ public class MainWindowViewModel : MyReactiveObject private void SetReloadEnabled(bool enabled) { - RxApp.MainThreadScheduler.Schedule(() => BlReloadEnabled = enabled); + RxSchedulers.MainThreadScheduler.Schedule(() => BlReloadEnabled = enabled); } private async Task LoadCore(CoreConfigContext? mainContext, CoreConfigContext? preContext) diff --git a/v2rayN/ServiceLib/ViewModels/MsgViewModel.cs b/v2rayN/ServiceLib/ViewModels/MsgViewModel.cs index 68bf71b5..06657a93 100644 --- a/v2rayN/ServiceLib/ViewModels/MsgViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/MsgViewModel.cs @@ -31,7 +31,7 @@ public class MsgViewModel : MyReactiveObject AppEvents.SendMsgViewRequested .AsObservable() - //.ObserveOn(RxApp.MainThreadScheduler) + //.ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(content => _ = AppendQueueMsg(content)); } diff --git a/v2rayN/ServiceLib/ViewModels/OptionSettingViewModel.cs b/v2rayN/ServiceLib/ViewModels/OptionSettingViewModel.cs index b5bfe71f..d936c5df 100644 --- a/v2rayN/ServiceLib/ViewModels/OptionSettingViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/OptionSettingViewModel.cs @@ -47,7 +47,6 @@ public class OptionSettingViewModel : MyReactiveObject [Reactive] public bool KeepOlderDedupl { get; set; } [Reactive] public bool DisplayRealTimeSpeed { get; set; } [Reactive] public bool EnableAutoAdjustMainLvColWidth { get; set; } - [Reactive] public bool EnableUpdateSubOnlyRemarksExist { get; set; } [Reactive] public bool AutoHideStartup { get; set; } [Reactive] public bool Hide2TrayWhenClose { get; set; } [Reactive] public bool MacOSShowInDock { get; set; } @@ -180,7 +179,6 @@ public class OptionSettingViewModel : MyReactiveObject DisplayRealTimeSpeed = _config.GuiItem.DisplayRealTimeSpeed; KeepOlderDedupl = _config.GuiItem.KeepOlderDedupl; EnableAutoAdjustMainLvColWidth = _config.UiItem.EnableAutoAdjustMainLvColWidth; - EnableUpdateSubOnlyRemarksExist = _config.UiItem.EnableUpdateSubOnlyRemarksExist; AutoHideStartup = _config.UiItem.AutoHideStartup; Hide2TrayWhenClose = _config.UiItem.Hide2TrayWhenClose; MacOSShowInDock = _config.UiItem.MacOSShowInDock; @@ -345,7 +343,6 @@ public class OptionSettingViewModel : MyReactiveObject _config.GuiItem.DisplayRealTimeSpeed = DisplayRealTimeSpeed; _config.GuiItem.KeepOlderDedupl = KeepOlderDedupl; _config.UiItem.EnableAutoAdjustMainLvColWidth = EnableAutoAdjustMainLvColWidth; - _config.UiItem.EnableUpdateSubOnlyRemarksExist = EnableUpdateSubOnlyRemarksExist; _config.UiItem.AutoHideStartup = AutoHideStartup; _config.UiItem.Hide2TrayWhenClose = Hide2TrayWhenClose; _config.UiItem.MacOSShowInDock = MacOSShowInDock; diff --git a/v2rayN/ServiceLib/ViewModels/ProfilesSelectViewModel.cs b/v2rayN/ServiceLib/ViewModels/ProfilesSelectViewModel.cs index eb010c58..b3810b52 100644 --- a/v2rayN/ServiceLib/ViewModels/ProfilesSelectViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/ProfilesSelectViewModel.cs @@ -188,14 +188,9 @@ public class ProfilesSelectViewModel : MyReactiveObject { SubItems.Add(item); } - if (_subIndexId != null && SubItems.FirstOrDefault(t => t.Id == _subIndexId) != null) - { - SelectedSub = SubItems.FirstOrDefault(t => t.Id == _subIndexId); - } - else - { - SelectedSub = SubItems.First(); - } + SelectedSub = (_config.SubIndexId.IsNotEmpty() + ? SubItems.FirstOrDefault(t => t.Id == _config.SubIndexId) + : null) ?? SubItems.LastOrDefault(); } private async Task?> GetProfileItemsEx(string subid, string filter) diff --git a/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs b/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs index edeec49e..6e7e183c 100644 --- a/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs @@ -228,22 +228,22 @@ public class ProfilesViewModel : MyReactiveObject AppEvents.ProfilesRefreshRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(async _ => await RefreshServersBiz()); AppEvents.SubscriptionsRefreshRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(async _ => await RefreshSubscriptions()); AppEvents.DispatcherStatisticsRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(async result => await UpdateStatistics(result)); AppEvents.SetDefaultServerRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(async indexId => await SetDefaultServer(indexId)); #endregion AppEvents @@ -391,14 +391,9 @@ public class ProfilesViewModel : MyReactiveObject { SubItems.Add(item); } - if (_config.SubIndexId != null && SubItems.FirstOrDefault(t => t.Id == _config.SubIndexId) != null) - { - SelectedSub = SubItems.FirstOrDefault(t => t.Id == _config.SubIndexId); - } - else - { - SelectedSub = SubItems.First(); - } + SelectedSub = (_config.SubIndexId.IsNotEmpty() + ? SubItems.FirstOrDefault(t => t.Id == _config.SubIndexId) + : null) ?? SubItems.LastOrDefault(); } private async Task?> GetProfileItemsEx(string subid, string filter) @@ -732,7 +727,7 @@ public class ProfilesViewModel : MyReactiveObject _speedtestService ??= new SpeedtestService(_config, async (SpeedTestResult result) => { - RxApp.MainThreadScheduler.Schedule(result, (scheduler, result) => + RxSchedulers.MainThreadScheduler.Schedule(result, (scheduler, result) => { _ = SetSpeedTestResult(result); return Disposable.Empty; diff --git a/v2rayN/ServiceLib/ViewModels/StatusBarViewModel.cs b/v2rayN/ServiceLib/ViewModels/StatusBarViewModel.cs index 9269851d..b8154c16 100644 --- a/v2rayN/ServiceLib/ViewModels/StatusBarViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/StatusBarViewModel.cs @@ -200,27 +200,27 @@ public class StatusBarViewModel : MyReactiveObject AppEvents.DispatcherStatisticsRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(async result => await UpdateStatistics(result)); AppEvents.RoutingsMenuRefreshRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(async _ => await RefreshRoutingsMenu()); AppEvents.TestServerRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(async _ => await TestServerAvailability()); AppEvents.InboundDisplayRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(async _ => await InboundDisplayStatus()); AppEvents.SysProxyChangeRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(async result => await SetListenerType(result)); #endregion AppEvents @@ -243,7 +243,7 @@ public class StatusBarViewModel : MyReactiveObject { AppEvents.ProfilesRefreshRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(async _ => await RefreshServersBiz()); //.DisposeWith(_disposables); } } @@ -362,7 +362,7 @@ public class StatusBarViewModel : MyReactiveObject private async Task TestServerAvailabilitySub(string msg) { - RxApp.MainThreadScheduler.Schedule(msg, (scheduler, msg) => + RxSchedulers.MainThreadScheduler.Schedule(msg, (scheduler, msg) => { _ = TestServerAvailabilityResult(msg); return Disposable.Empty; diff --git a/v2rayN/v2rayN.Desktop/Program.cs b/v2rayN/v2rayN.Desktop/Program.cs index 70c43130..0ad036ec 100644 --- a/v2rayN/v2rayN.Desktop/Program.cs +++ b/v2rayN/v2rayN.Desktop/Program.cs @@ -59,7 +59,7 @@ internal class Program //.WithInterFont() .WithFontByDefault() .LogToTrace() - .UseReactiveUI(); + .UseReactiveUI(_ => { }); if (OperatingSystem.IsMacOS()) { diff --git a/v2rayN/v2rayN.Desktop/Views/ClashConnectionsView.axaml.cs b/v2rayN/v2rayN.Desktop/Views/ClashConnectionsView.axaml.cs index 4bf5237b..90690c1e 100644 --- a/v2rayN/v2rayN.Desktop/Views/ClashConnectionsView.axaml.cs +++ b/v2rayN/v2rayN.Desktop/Views/ClashConnectionsView.axaml.cs @@ -28,7 +28,7 @@ public partial class ClashConnectionsView : ReactiveUserControl StorageUI()) .DisposeWith(disposables); }); diff --git a/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs b/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs index 5c5ba9cb..7e96fad2 100644 --- a/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs +++ b/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs @@ -128,25 +128,25 @@ public partial class MainWindow : WindowBase AppEvents.SendSnackMsgRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(async content => await DelegateSnackMsg(content)) .DisposeWith(disposables); AppEvents.AppExitRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(_ => StorageUI()) .DisposeWith(disposables); AppEvents.ShutdownRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(content => Shutdown(content)) .DisposeWith(disposables); AppEvents.ShowHideWindowRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(blShow => ShowHideWindow(blShow)) .DisposeWith(disposables); }); diff --git a/v2rayN/v2rayN.Desktop/Views/OptionSettingWindow.axaml b/v2rayN/v2rayN.Desktop/Views/OptionSettingWindow.axaml index cfcb48f0..8c4f1fcc 100644 --- a/v2rayN/v2rayN.Desktop/Views/OptionSettingWindow.axaml +++ b/v2rayN/v2rayN.Desktop/Views/OptionSettingWindow.axaml @@ -410,19 +410,6 @@ Margin="{StaticResource Margin4}" HorizontalAlignment="Left" /> - - - this.Bind(ViewModel, vm => vm.DisplayRealTimeSpeed, v => v.togDisplayRealTimeSpeed.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.KeepOlderDedupl, v => v.togKeepOlderDedupl.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.EnableAutoAdjustMainLvColWidth, v => v.togEnableAutoAdjustMainLvColWidth.IsChecked).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.EnableUpdateSubOnlyRemarksExist, v => v.togEnableUpdateSubOnlyRemarksExist.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.AutoHideStartup, v => v.togAutoHideStartup.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.Hide2TrayWhenClose, v => v.togHide2TrayWhenClose.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.MacOSShowInDock, v => v.togMacOSShowInDock.IsChecked).DisposeWith(disposables); diff --git a/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs b/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs index 40336be5..7d803f10 100644 --- a/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs +++ b/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs @@ -90,13 +90,13 @@ public partial class ProfilesView : ReactiveUserControl AppEvents.AppExitRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(_ => StorageUI()) .DisposeWith(disposables); AppEvents.AdjustMainLvColWidthRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(_ => AutofitColumnWidth()) .DisposeWith(disposables); }); diff --git a/v2rayN/v2rayN/App.xaml.cs b/v2rayN/v2rayN/App.xaml.cs index ca56311b..3c5f1989 100644 --- a/v2rayN/v2rayN/App.xaml.cs +++ b/v2rayN/v2rayN/App.xaml.cs @@ -39,6 +39,11 @@ public partial class App : Application } AppManager.Instance.InitComponents(); + + RxAppBuilder.CreateReactiveUIBuilder() + .WithWpf() + .BuildApp(); + base.OnStartup(e); } diff --git a/v2rayN/v2rayN/GlobalUsings.cs b/v2rayN/v2rayN/GlobalUsings.cs index 1f2d1936..fb63f7eb 100644 --- a/v2rayN/v2rayN/GlobalUsings.cs +++ b/v2rayN/v2rayN/GlobalUsings.cs @@ -20,6 +20,7 @@ global using System.Windows.Threading; global using DynamicData; global using DynamicData.Binding; global using ReactiveUI; +global using ReactiveUI.Builder; global using ReactiveUI.Fody.Helpers; global using ServiceLib; global using ServiceLib.Base; diff --git a/v2rayN/v2rayN/Views/ClashConnectionsView.xaml.cs b/v2rayN/v2rayN/Views/ClashConnectionsView.xaml.cs index 47482b8e..337b38e4 100644 --- a/v2rayN/v2rayN/Views/ClashConnectionsView.xaml.cs +++ b/v2rayN/v2rayN/Views/ClashConnectionsView.xaml.cs @@ -33,7 +33,7 @@ public partial class ClashConnectionsView AppEvents.AppExitRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(_ => StorageUI()) .DisposeWith(disposables); }); diff --git a/v2rayN/v2rayN/Views/MainWindow.xaml.cs b/v2rayN/v2rayN/Views/MainWindow.xaml.cs index 93e62aad..42d8aabc 100644 --- a/v2rayN/v2rayN/Views/MainWindow.xaml.cs +++ b/v2rayN/v2rayN/Views/MainWindow.xaml.cs @@ -127,25 +127,25 @@ public partial class MainWindow AppEvents.SendSnackMsgRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(async content => await DelegateSnackMsg(content)) .DisposeWith(disposables); AppEvents.AppExitRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(_ => StorageUI()) .DisposeWith(disposables); AppEvents.ShutdownRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(content => Shutdown(content)) .DisposeWith(disposables); AppEvents.ShowHideWindowRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(blShow => ShowHideWindow(blShow)) .DisposeWith(disposables); }); diff --git a/v2rayN/v2rayN/Views/OptionSettingWindow.xaml b/v2rayN/v2rayN/Views/OptionSettingWindow.xaml index 8f0d24d4..133b4134 100644 --- a/v2rayN/v2rayN/Views/OptionSettingWindow.xaml +++ b/v2rayN/v2rayN/Views/OptionSettingWindow.xaml @@ -630,20 +630,6 @@ Margin="{StaticResource Margin8}" HorizontalAlignment="Left" /> - - - vm.DisplayRealTimeSpeed, v => v.togDisplayRealTimeSpeed.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.KeepOlderDedupl, v => v.togKeepOlderDedupl.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.EnableAutoAdjustMainLvColWidth, v => v.togEnableAutoAdjustMainLvColWidth.IsChecked).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.EnableUpdateSubOnlyRemarksExist, v => v.togEnableUpdateSubOnlyRemarksExist.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.AutoHideStartup, v => v.togAutoHideStartup.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.EnableDragDropSort, v => v.togEnableDragDropSort.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.DoubleClick2Activate, v => v.togDoubleClick2Activate.IsChecked).DisposeWith(disposables); diff --git a/v2rayN/v2rayN/Views/ProfilesView.xaml.cs b/v2rayN/v2rayN/Views/ProfilesView.xaml.cs index b088fe7b..7075d358 100644 --- a/v2rayN/v2rayN/Views/ProfilesView.xaml.cs +++ b/v2rayN/v2rayN/Views/ProfilesView.xaml.cs @@ -84,13 +84,13 @@ public partial class ProfilesView AppEvents.AppExitRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(_ => StorageUI()) .DisposeWith(disposables); AppEvents.AdjustMainLvColWidthRequested .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) + .ObserveOn(RxSchedulers.MainThreadScheduler) .Subscribe(_ => AutofitColumnWidth()) .DisposeWith(disposables); }); diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 9654625d..45cbc376 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -2,7 +2,7 @@ WinExe - net8.0-windows10.0.17763 + net8.0-windows10.0.19041.0 true true Resources\v2rayN.ico