using System.ComponentModel; using System.Runtime.CompilerServices; using System.Windows.Media.Animation; namespace VariaStudio.Controls; /// /// SplashWindow 类表示一个启动窗口,用于在应用程序初始化时显示。它继承自 Window 并实现了 INotifyPropertyChanged 接口以支持属性更改通知。 /// 该类主要用于显示带有图片和提示信息的启动界面,并且可以设置自动结束或手动触发结束动画来关闭窗口。 /// public sealed partial class SplashWindow : Window, INotifyPropertyChanged { /// /// 属性更改事件,当属性值发生变化时触发此事件。 /// 实现了INotifyPropertyChanged接口的类可以通过引发此事件来通知绑定客户端其属性值已经更改。 /// public event PropertyChangedEventHandler? PropertyChanged; /// /// 获取启动窗口显示的图像资源URI。此属性用于指定在SplashWindow中展示的图片的位置。 /// public Uri ImageUri { get; } /// /// 用于存储提示信息的字符串。此字段与Hint属性关联,当其值发生变化时会触发属性更改通知。 /// private string hint = null!; /// /// 获取或设置提示信息的字符串。此属性允许用户自定义显示在SplashWindow上的提示文本。当该属性值被修改时,会自动通知所有已注册的属性更改监听者。 /// public string Hint { get => hint; set => SetProperty(ref hint, value); } /// /// /// public bool AutoEnd { get; set; } = false; /// /// /// public DateTime TimeOfCtor = DateTime.Now; /// /// /// /// public SplashWindow(Uri imageUri) { DataContext = this; ImageUri = imageUri; InitializeComponent(); MouseLeftButtonDown += (sender, _) => { if (sender is DependencyObject depObject) { GetWindow(depObject)?.DragMove(); } }; } /// /// 触发属性更改事件,通知监听者指定属性的值已更改。 /// /// 包含属性更改信息的事件参数。 private void OnPropertyChanged(PropertyChangedEventArgs e) { PropertyChanged?.Invoke(this, e); } /// /// 触发属性更改事件,通知监听者指定属性的值已更改。 /// /// 发生更改的属性名称,默认通过CallerMemberName特性自动获取。 private void OnPropertyChanged([CallerMemberName] string? propertyName = null) { OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); } /// /// 设置属性值,并在属性值发生变化时触发属性更改通知。 /// /// 属性的类型。 /// 要设置的字段。 /// 新值。 /// 属性名,默认通过CallerMemberName获取。 /// 如果属性值发生改变,则返回true;否则返回false。 private bool SetProperty(ref T field, T newValue, [CallerMemberName] string? propertyName = null) { if (EqualityComparer.Default.Equals(field, newValue)) { return false; } field = newValue; OnPropertyChanged(propertyName); return true; } private void Start_Completed(object? sender, EventArgs e) { if (AutoEnd) { StartEnd(); } } /// /// 在Storyboard动画完成时调用此方法,用于执行窗口关闭操作。 /// /// 触发事件的对象。 /// 事件参数。 private void End_Completed(object? sender, EventArgs e) { Shutdown(); } /// /// 开始执行结束动画。此方法通过调用Dispatcher来查找名为"End"的Storyboard资源并开始播放,从而实现窗口关闭或过渡效果。 /// public void StartEnd() { Dispatcher.Invoke(() => { var storyboard = (Storyboard)FindResource("End"); storyboard.Begin(); }); } /// /// 关闭当前窗口,并停止与之关联的Dispatcher,以确保所有相关的UI线程活动被正确终止。 /// public void Shutdown() { Dispatcher.Invoke(() => { Close(); Dispatcher?.InvokeShutdown(); }); } }