using System.IO; using System.Reflection; using System.Windows; using System.Windows.Interop; using CommunityToolkit.Mvvm.ComponentModel; using Microsoft.Win32; namespace Sai.Toolkit.Core.Helpers; public static class WinDialogHelper { /// /// 对话框过滤器 /// /// 过滤器的名称 /// 仅扩展名,*代表所有文件 /// public static string CreateFilter(string filterName, params string[] extensions) { if (extensions[0] == "*") { return "所有文件(*)|*"; } var str = string.Empty; for (var i = 0; i < extensions.Length; i++) { var extension = extensions[i]; str += $"*.{extension}"; if (i < extensions.Length - 1) { str += ";"; } } return $"{filterName}({str})|{str}"; } /// /// 选择文件 /// /// /// /// public static string GetSelectedFilePath(string title, params string[] extensions) { OpenFileDialog dialog = new() { CheckFileExists = true, Filter = CreateFilter(title, extensions), InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), }; return dialog.ShowDialog() == true ? dialog.FileName : null; } ///// ///// 单选文件夹路径 ///// ///// //public static string GetSelectedFolderPath() //{ // var dialog = new Ookii.Dialogs.Wpf.VistaFolderBrowserDialog { Multiselect = false }; // var folderPath = dialog.ShowDialog() == true ? dialog.SelectedPath : null; // return folderPath; //} ///// ///// 多选文件夹路径 ///// ///// //public static string[] GetSelectedFolderPaths() //{ // var dialog = new Ookii.Dialogs.Wpf.VistaFolderBrowserDialog { Multiselect = true }; // return dialog.ShowDialog() == true ? dialog.SelectedPaths : null; //} /// /// 打开窗口,非模态窗口置顶显示,默认非模态 /// /// private static void ShowAhead(this Window window) { _ = new WindowInteropHelper(window) { Owner = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle }; window.Show(); } public static void ShowModeless(ObservableObject viewModel) where T : Window, new() { var view = SingletonViewHelper.GetInstance(out var isNewCreate); if (isNewCreate) { view.DataContext = viewModel; view.ShowAhead(); } view.Activate(); //AssemblyLoaderHelpers loaderUtil = new(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)); //loaderUtil.HookAssemblyResolve(); //try //{ // var view = SingletonViewHelper.GetInstance(out var isNewCreate); // if (isNewCreate) // { // view.DataContext = viewModel; // view.ShowAhead(); // } // view.Activate(); //} //catch (Exception ex) //{ // LogHelper.ToLog($"{ex.Source}:{ex.StackTrace}"); //} //finally //{ // loaderUtil.UnhookAssemblyResolve(); //} } private static Dictionary _windows = []; public static void ShowOrActivate(params object[] viewModelParams) where TWindow : Window, new() where TViewModel : class { var windowType = typeof(TWindow); if (!_windows.ContainsKey(windowType) || _windows[windowType] == null) { //CloseAllWindowsExcept(windowType); _windows[windowType] = new TWindow(); _windows[windowType].Closed += (sender, args) => _windows[windowType] = null; if (_windows[windowType].DataContext == null || !(_windows[windowType].DataContext is TViewModel)) { _windows[windowType].DataContext = viewModelParams.Length == 0 ? Activator.CreateInstance(typeof(TViewModel)) : Activator.CreateInstance(typeof(TViewModel), viewModelParams); } _ = new WindowInteropHelper(_windows[windowType]) { Owner = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle }; _windows[windowType].Show(); } else { _windows[windowType].Activate(); } } }