downkyi/DownKyi/ViewModels/MainWindowViewModel.cs
2022-01-11 13:16:17 +08:00

364 lines
11 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using DownKyi.Core.Logging;
using DownKyi.Core.Settings;
using DownKyi.Events;
using DownKyi.Images;
using DownKyi.Services;
using DownKyi.Utils;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Threading;
using System.Windows;
using System.Windows.Threading;
namespace DownKyi.ViewModels
{
public class MainWindowViewModel : BindableBase
{
private readonly IEventAggregator eventAggregator;
private ClipboardHooker clipboardHooker;
#region
private string title;
public string Title
{
get { return title; }
set { SetProperty(ref title, value); }
}
private WindowState winState;
public WindowState WinState
{
get { return winState; }
set
{
if (value == WindowState.Maximized)
{
ResizeIcon = SystemIcon.Instance().Restore;
}
else
{
ResizeIcon = SystemIcon.Instance().Maximize;
}
SetLeaveStyle(ResizeIcon);
SetProperty(ref winState, value);
}
}
private VectorImage minimizeIcon;
public VectorImage MinimizeIcon
{
get { return minimizeIcon; }
set { SetProperty(ref minimizeIcon, value); }
}
private VectorImage resizeIcon;
public VectorImage ResizeIcon
{
get { return resizeIcon; }
set { SetProperty(ref resizeIcon, value); }
}
private VectorImage closeIcon;
public VectorImage CloseIcon
{
get { return closeIcon; }
set { SetProperty(ref closeIcon, value); }
}
private VectorImage skinIcon;
public VectorImage SkinIcon
{
get { return skinIcon; }
set { SetProperty(ref skinIcon, value); }
}
private Visibility messageVisibility = Visibility.Hidden;
public Visibility MessageVisibility
{
get { return messageVisibility; }
set { SetProperty(ref messageVisibility, value); }
}
private string message;
public string Message
{
get { return message; }
set { SetProperty(ref message, value); }
}
#endregion
public MainWindowViewModel(IRegionManager regionManager, IEventAggregator eventAggregator)
{
this.eventAggregator = eventAggregator;
#region
Window mainWindow = Application.Current.MainWindow;
WinState = WindowState.Normal;
MinimizeIcon = SystemIcon.Instance().Minimize;
ResizeIcon = SystemIcon.Instance().Maximize;
CloseIcon = SystemIcon.Instance().Close;
SkinIcon = SystemIcon.Instance().Skin;
#endregion
#region
// 订阅导航事件
eventAggregator.GetEvent<NavigationEvent>().Subscribe((view) =>
{
var param = new NavigationParameters
{
{ "Parent", view.ParentViewName },
{ "Parameter", view.Parameter }
};
regionManager.RequestNavigate("ContentRegion", view.ViewName, param);
});
// 订阅消息发送事件
string oldMessage;
eventAggregator.GetEvent<MessageEvent>().Subscribe((message) =>
{
MessageVisibility = Visibility.Visible;
oldMessage = Message;
Message = message;
int sleep = 2000;
if (oldMessage == Message) { sleep = 1500; }
Thread.Sleep(sleep);
MessageVisibility = Visibility.Hidden;
}, ThreadOption.BackgroundThread);
#endregion
#region
// window加载后执行的事件
LoadedCommand = new DelegateCommand(() =>
{
clipboardHooker = new ClipboardHooker(Application.Current.MainWindow);
clipboardHooker.ClipboardUpdated += OnClipboardUpdated;
// 进入首页
var param = new NavigationParameters
{
{ "Parent", "" },
{ "Parameter", "start" }
};
regionManager.RequestNavigate("ContentRegion", ViewIndexViewModel.Tag, param);
// 关闭欢迎页
if (App.Dictionary.ContainsKey("SplashWindow"))
{
Views.SplashWindow sw = App.Dictionary["SplashWindow"] as Views.SplashWindow;
// 在sw的线程上关闭SplashWindow
sw.Dispatcher.Invoke(() => sw.Close());
}
// 设置焦点
Application.Current.MainWindow.Activate();
});
// 顶部caption栏的点击事件包括双击和拖动
int times = 0;
DragMoveCommand = new DelegateCommand(() =>
{
// caption 双击事件
times += 1;
DispatcherTimer timer = new DispatcherTimer
{
Interval = new TimeSpan(0, 0, 0, 0, 300)
};
timer.Tick += (s, e) => { timer.IsEnabled = false; times = 0; };
timer.IsEnabled = true;
if (times % 2 == 0)
{
timer.IsEnabled = false;
times = 0;
WinState = WinState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized;
}
// caption 拖动事件
try
{
mainWindow.DragMove();
}
catch { }
});
// 最小化窗口事件
MinimizeCommand = new DelegateCommand(() =>
{
mainWindow.WindowState = WindowState.Minimized;
});
MinimizeEnterCommand = new DelegateCommand(() =>
{
SetEnterStyle(MinimizeIcon);
});
MinimizeLeaveCommand = new DelegateCommand(() =>
{
SetLeaveStyle(MinimizeIcon);
});
// 最大化/还原窗口事件
ResizeCommand = new DelegateCommand(() =>
{
WinState = WinState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized;
});
ResizeEnterCommand = new DelegateCommand(() =>
{
SetEnterStyle(ResizeIcon);
});
ResizeLeaveCommand = new DelegateCommand(() =>
{
SetLeaveStyle(ResizeIcon);
});
// 关闭窗口事件
CloseCommand = new DelegateCommand(() =>
{
if (clipboardHooker != null)
{
clipboardHooker.ClipboardUpdated -= OnClipboardUpdated;
clipboardHooker.Dispose();
}
mainWindow.Close();
});
CloseEnterCommand = new DelegateCommand(() =>
{
SetEnterStyle(CloseIcon);
});
CloseLeaveCommand = new DelegateCommand(() =>
{
SetLeaveStyle(CloseIcon);
});
// 皮肤按钮点击事件
SkinCommand = new DelegateCommand(() =>
{
// 设置主题
DictionaryResource.LoadTheme("ThemeDiy");
// 切换语言
DictionaryResource.LoadLanguage("en_US");
});
SkinEnterCommand = new DelegateCommand(() =>
{
SetEnterStyle(SkinIcon);
});
SkinLeaveCommand = new DelegateCommand(() =>
{
SetLeaveStyle(SkinIcon);
});
#endregion
}
#region
public DelegateCommand LoadedCommand { get; private set; }
public DelegateCommand DragMoveCommand { get; private set; }
public DelegateCommand MinimizeCommand { get; private set; }
public DelegateCommand MinimizeEnterCommand { get; private set; }
public DelegateCommand MinimizeLeaveCommand { get; private set; }
public DelegateCommand ResizeCommand { get; private set; }
public DelegateCommand ResizeEnterCommand { get; private set; }
public DelegateCommand ResizeLeaveCommand { get; private set; }
public DelegateCommand CloseCommand { get; private set; }
public DelegateCommand CloseEnterCommand { get; private set; }
public DelegateCommand CloseLeaveCommand { get; private set; }
public DelegateCommand SkinCommand { get; private set; }
public DelegateCommand SkinEnterCommand { get; private set; }
public DelegateCommand SkinLeaveCommand { get; private set; }
#endregion
/// <summary>
/// 鼠标进入系统按钮时的图标样式
/// </summary>
/// <param name="icon">图标</param>
private void SetEnterStyle(VectorImage icon)
{
icon.Fill = DictionaryResource.GetColor("ColorSystemBtnTint");
}
/// <summary>
/// 鼠标离开系统按钮时的图标样式
/// </summary>
/// <param name="icon">图标</param>
private void SetLeaveStyle(VectorImage icon)
{
icon.Fill = DictionaryResource.GetColor("ColorSystemBtnTintDark");
}
#region
private int times = 0;
/// <summary>
/// 监听剪贴板更新事件,会执行两遍以上
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnClipboardUpdated(object sender, EventArgs e)
{
#region
times += 1;
DispatcherTimer timer = new DispatcherTimer
{
Interval = new TimeSpan(0, 0, 0, 0, 300)
};
timer.Tick += (s, ex) => { timer.IsEnabled = false; times = 0; };
timer.IsEnabled = true;
if (times % 2 == 0)
{
timer.IsEnabled = false;
times = 0;
return;
}
#endregion
AllowStatus isListenClipboard = SettingsManager.GetInstance().IsListenClipboard();
if (isListenClipboard != AllowStatus.YES)
{
return;
}
string input;
try
{
IDataObject data = Clipboard.GetDataObject();
string[] fs = data.GetFormats();
input = data.GetData(fs[0]).ToString();
}
catch (Exception exc)
{
Console.WriteLine("OnClipboardUpdated()发生异常: {0}", exc);
LogManager.Error("OnClipboardUpdated", exc);
return;
}
SearchService searchService = new SearchService();
searchService.BiliInput(input, ViewIndexViewModel.Tag, eventAggregator);
}
#endregion
}
}