diff --git a/VPet.Solution/Converters/AllIsBoolConverter.cs b/VPet.Solution/Converters/AllIsBoolConverter.cs index 80a9a09..50dd217 100644 --- a/VPet.Solution/Converters/AllIsBoolConverter.cs +++ b/VPet.Solution/Converters/AllIsBoolConverter.cs @@ -47,6 +47,6 @@ public class AllIsBoolConverter : MultiValueToBoolConverter { var boolValue = TargetBoolValue; var nullValue = BoolOnNull; - return values.All(o => Utils.GetBool(o, boolValue, nullValue)); + return values.All(o => HKWUtils.HKWUtils.GetBool(o, boolValue, nullValue)); } } diff --git a/VPet.Solution/Converters/AllIsBoolToVisibilityConverter.cs b/VPet.Solution/Converters/AllIsBoolToVisibilityConverter.cs index b2ec4c9..998db68 100644 --- a/VPet.Solution/Converters/AllIsBoolToVisibilityConverter.cs +++ b/VPet.Solution/Converters/AllIsBoolToVisibilityConverter.cs @@ -90,7 +90,7 @@ public class AllIsBoolToVisibilityConverter { var boolValue = TargetBoolValue; var nullValue = BoolOnNull; - return values.All(o => Utils.GetBool(o, boolValue, nullValue)) + return values.All(o => HKWUtils.HKWUtils.GetBool(o, boolValue, nullValue)) ? VisibilityOnTrue : VisibilityOnFalse; } diff --git a/VPet.Solution/Converters/BoolToVisibilityConverter.cs b/VPet.Solution/Converters/BoolToVisibilityConverter.cs index a24c4c9..bd30319 100644 --- a/VPet.Solution/Converters/BoolToVisibilityConverter.cs +++ b/VPet.Solution/Converters/BoolToVisibilityConverter.cs @@ -56,7 +56,7 @@ public class BoolToVisibilityConverter : BoolToValueConverterBase public const string MsgModLineName = "msgmod"; public const string WorkShopLineName = "workshop"; public static string ModDirectory = Path.Combine(Environment.CurrentDirectory, "mod"); - public static Dictionary LocalMods = Directory.Exists(ModDirectory) is false - ? new(StringComparer.OrdinalIgnoreCase) - : new( - Directory - .EnumerateDirectories(ModDirectory) - .Select(d => new ModLoader(d)) - .Distinct(CompareUtils.Create(m => m.Name)) - .ToDictionary(m => m.Name, m => m), - StringComparer.OrdinalIgnoreCase - ); + public static Dictionary LocalMods { get; private set; } = null; + #region Mods private ObservableCollection _mods = new(); public ObservableCollection Mods @@ -41,6 +35,7 @@ public class ModSettingModel : ObservableClass public ModSettingModel(Setting setting) { + LocalMods ??= GetLocalMods(); foreach (var item in setting[ModLineName]) { var modName = item.Name; @@ -77,6 +72,24 @@ public class ModSettingModel : ObservableClass } } + private static Dictionary GetLocalMods() + { + var dic = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (var dir in Directory.EnumerateDirectories(ModDirectory)) + { + try + { + var loader = new ModLoader(dir); + dic.TryAdd(loader.Name, loader); + } + catch (Exception ex) + { + MessageBox.Show("模组载入错误\n路径:{0}\n异常:{1}".Translate(dir, ex)); + } + } + return dic; + } + public void Close() { foreach (var modLoader in LocalMods) diff --git a/VPet.Solution/Utils/Utils.cs b/VPet.Solution/Utils/HKWUtils.cs similarity index 84% rename from VPet.Solution/Utils/Utils.cs rename to VPet.Solution/Utils/HKWUtils.cs index 7b1aec3..76fc63a 100644 --- a/VPet.Solution/Utils/Utils.cs +++ b/VPet.Solution/Utils/HKWUtils.cs @@ -1,11 +1,12 @@ -using System.Windows.Media.Imaging; +using System.Text; +using System.Windows.Media.Imaging; namespace HKW.HKWUtils; /// /// 工具 /// -public static class Utils +public static class HKWUtils { /// /// 解码像素宽度 @@ -123,4 +124,17 @@ public static class Utils .Start("Explorer", $"/select,{Path.GetFullPath(filePath)}") ?.Close(); } + + /// + /// 从文件获取只读流 (用于目标文件被其它进程访问的情况) + /// + /// 文件 + /// 编码 + /// 流读取器 + public static StreamReader StreamReaderOnReadOnly(string path, Encoding? encoding = null) + { + encoding ??= Encoding.UTF8; + var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + return new StreamReader(fs, encoding); + } } diff --git a/VPet.Solution/VPet.Solution.csproj b/VPet.Solution/VPet.Solution.csproj index 9150693..b0ac722 100644 --- a/VPet.Solution/VPet.Solution.csproj +++ b/VPet.Solution/VPet.Solution.csproj @@ -227,7 +227,7 @@ - + diff --git a/VPet.Solution/ViewModels/MainWindowVM.cs b/VPet.Solution/ViewModels/MainWindowVM.cs index e5ca79c..abb6b8f 100644 --- a/VPet.Solution/ViewModels/MainWindowVM.cs +++ b/VPet.Solution/ViewModels/MainWindowVM.cs @@ -23,7 +23,7 @@ public class MainWindowVM : ObservableClass _mainSetting = SettingWindowVM.Current.ShowSettings.FirstOrDefault( m => m.Name == nameof(Setting) ); - if (string.IsNullOrWhiteSpace(_mainSetting.GraphicsSetting.Language)) + if (string.IsNullOrWhiteSpace(_mainSetting?.GraphicsSetting?.Language)) CurrentCulture = LocalizeCore.CurrentCulture; else CurrentCulture = _mainSetting.GraphicsSetting.Language; @@ -43,9 +43,11 @@ public class MainWindowVM : ObservableClass private void FirstStartFailedCommand_ExecuteCommand() { if (LocalizeCore.CurrentCulture == "zh-Hans") - Utils.OpenLink("https://www.bilibili.com/read/cv26510496/"); + HKWUtils.OpenLink("https://www.bilibili.com/read/cv26510496/"); else - Utils.OpenLink("https://steamcommunity.com/games/1920960/announcements/detail/3681184905256253203"); + HKWUtils.OpenLink( + "https://steamcommunity.com/games/1920960/announcements/detail/3681184905256253203" + ); } #region Property diff --git a/VPet.Solution/ViewModels/SaveViewer/SaveWindowVM.cs b/VPet.Solution/ViewModels/SaveViewer/SaveWindowVM.cs index f3a04ea..34fb4e6 100644 --- a/VPet.Solution/ViewModels/SaveViewer/SaveWindowVM.cs +++ b/VPet.Solution/ViewModels/SaveViewer/SaveWindowVM.cs @@ -72,12 +72,12 @@ public class SaveWindowVM : ObservableClass private void OpenFileInExplorerCommand_ExecuteCommand(SaveModel parameter) { - Utils.OpenFileInExplorer(parameter.FilePath); + HKWUtils.OpenFileInExplorer(parameter.FilePath); } private void OpenFileCommand_ExecuteCommand(SaveModel parameter) { - Utils.OpenLink(parameter.FilePath); + HKWUtils.OpenLink(parameter.FilePath); } public void RefreshShowSaves(string name) diff --git a/VPet.Solution/ViewModels/SettingEditor/ModSettingPageVM.cs b/VPet.Solution/ViewModels/SettingEditor/ModSettingPageVM.cs index cf262e1..5a9cb4d 100644 --- a/VPet.Solution/ViewModels/SettingEditor/ModSettingPageVM.cs +++ b/VPet.Solution/ViewModels/SettingEditor/ModSettingPageVM.cs @@ -130,7 +130,7 @@ public class ModSettingPageVM : ObservableClass private void OpenSteamCommunityCommand_ExecuteCommand(ModModel parameter) { - Utils.OpenLink( + HKWUtils.OpenLink( "https://steamcommunity.com/sharedfiles/filedetails/?id=" + parameter.ItemId ); } @@ -139,7 +139,7 @@ public class ModSettingPageVM : ObservableClass { try { - Utils.OpenLink(parameter.ModPath); + HKWUtils.OpenLink(parameter.ModPath); } catch { diff --git a/VPet.Solution/ViewModels/SettingEditor/SettingWindowVM.cs b/VPet.Solution/ViewModels/SettingEditor/SettingWindowVM.cs index 114cee7..b83d178 100644 --- a/VPet.Solution/ViewModels/SettingEditor/SettingWindowVM.cs +++ b/VPet.Solution/ViewModels/SettingEditor/SettingWindowVM.cs @@ -111,12 +111,12 @@ public class SettingWindowVM : ObservableClass private void OpenFileInExplorerCommand_ExecuteCommand(SettingModel parameter) { - Utils.OpenFileInExplorer(parameter.FilePath); + HKWUtils.OpenFileInExplorer(parameter.FilePath); } private void OpenFileCommand_ExecuteCommand(SettingModel parameter) { - Utils.OpenLink(parameter.FilePath); + HKWUtils.OpenLink(parameter.FilePath); } private void SaveAllSettingCommand_ExecuteCommand()