提交记录修改UI/App.xaml.cs+1 −0看文件
修改UI/Controls/Window/DefaultWindow.cs+123 −2看文件
新增UI/Servicers/IUIServicer.cs+15 −0看文件
修改UI/Servicers/StatusBarIconServicer.cs+7 −2看文件
新增UI/Servicers/UIServicer.cs+28 −0看文件
修改UI/Themes/Window/DefaultWindow.xaml+29 −1看文件
修改UI/UI.csproj+2 −0看文件
修改UI/ViewModels/SettingPageVM.cs+12 −6看文件
| @@ -108,6 +108,7 @@ namespace UI | ||
| 108 | 108 | services.AddSingleton<IWebFilter, WebFilter>(); |
| 109 | 109 | |
| 110 | 110 | // UI服务 |
| 111 | 新增: services.AddSingleton<IUIServicer, UIServicer>(); | |
| 111 | 112 | services.AddSingleton<IAppContextMenuServicer, AppContextMenuServicer>(); |
| 112 | 113 | services.AddSingleton<IThemeServicer, ThemeServicer>(); |
| 113 | 114 | services.AddSingleton<IMainServicer, MainServicer>(); |
| @@ -5,6 +5,7 @@ using System.Drawing; | ||
| 5 | 5 | using System.Linq; |
| 6 | 6 | using System.Runtime.InteropServices; |
| 7 | 7 | using System.Text; |
| 8 | 新增:using System.Threading; | |
| 8 | 9 | using System.Threading.Tasks; |
| 9 | 10 | using System.Windows; |
| 10 | 11 | using System.Windows.Controls; |
| @@ -14,12 +15,34 @@ using System.Windows.Media; | ||
| 14 | 15 | using System.Windows.Media.Animation; |
| 15 | 16 | using System.Windows.Media.Imaging; |
| 16 | 17 | using System.Windows.Threading; |
| 18 | 新增:using UI.Controls.Button; | |
| 17 | 19 | |
| 18 | 20 | namespace UI.Controls.Window |
| 19 | 21 | { |
| 20 | 22 | public class DefaultWindow : System.Windows.Window |
| 21 | 23 | { |
| 22 | 24 | #region 1.依赖属性 |
| 25 | 新增: #region Dialog | |
| 26 | 新增: public static readonly DependencyProperty DialogTitleProperty = DependencyProperty.Register("DialogTitle", typeof(string), typeof(DefaultWindow)); | |
| 27 | 新增: /// <summary> | |
| 28 | 新增: /// Dialog title | |
| 29 | 新增: /// </summary> | |
| 30 | 新增: public string DialogTitle | |
| 31 | 新增: { | |
| 32 | 新增: get { return (string)GetValue(DialogTitleProperty); } | |
| 33 | 新增: set { SetValue(DialogTitleProperty, value); } | |
| 34 | 新增: } | |
| 35 | 新增: | |
| 36 | 新增: public static readonly DependencyProperty DialogMessageProperty = DependencyProperty.Register("DialogMessage", typeof(string), typeof(DefaultWindow)); | |
| 37 | 新增: /// <summary> | |
| 38 | 新增: /// Dialog message | |
| 39 | 新增: /// </summary> | |
| 40 | 新增: public string DialogMessage | |
| 41 | 新增: { | |
| 42 | 新增: get { return (string)GetValue(DialogMessageProperty); } | |
| 43 | 新增: set { SetValue(DialogMessageProperty, value); } | |
| 44 | 新增: } | |
| 45 | 新增: #endregion | |
| 23 | 46 | public static readonly DependencyProperty IsShowToastDeproperty = DependencyProperty.Register("IsShowToast", typeof(bool), typeof(DefaultWindow), new PropertyMetadata(false, new PropertyChangedCallback(OnIsShowToastChanged))); |
| 24 | 47 | public bool IsShowToast { get { return (bool)GetValue(IsShowToastDeproperty); } set { SetValue(IsShowToastDeproperty, value); } } |
| 25 | 48 | private static void OnIsShowToastChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) |
| @@ -186,9 +209,12 @@ namespace UI.Controls.Window | ||
| 186 | 209 | /// </summary> |
| 187 | 210 | public bool IsWindowClosed { get { return IsWindowClosed_; } } |
| 188 | 211 | |
| 189 | 删除: private Border ToastBorder, Masklayer; | |
| 212 | 新增: private Border ToastBorder, Masklayer, DialogBorder; | |
| 190 | 213 | private Grid ToastGrid; |
| 191 | 214 | private DispatcherTimer toastTimer; |
| 215 | 新增: private bool IsDialogConfirm; | |
| 216 | 新增: private bool IsShowConfirmDialog; | |
| 217 | 新增: private Button.Button CancelBtn, ConfirmBtn; | |
| 192 | 218 | #region 3.初始化 |
| 193 | 219 | public DefaultWindow() |
| 194 | 220 | { |
| @@ -277,6 +303,9 @@ namespace UI.Controls.Window | ||
| 277 | 303 | ToastBorder = GetTemplateChild("ToastBorder") as Border; |
| 278 | 304 | Masklayer = GetTemplateChild("Masklayer") as Border; |
| 279 | 305 | ToastGrid = GetTemplateChild("ToastGrid") as Grid; |
| 306 | 新增: DialogBorder = GetTemplateChild("DialogBorder") as Border; | |
| 307 | 新增: CancelBtn = GetTemplateChild("CancelBtn") as Button.Button; | |
| 308 | 新增: ConfirmBtn = GetTemplateChild("ConfirmBtn") as Button.Button; | |
| 280 | 309 | |
| 281 | 310 | if (PageContainer != null) |
| 282 | 311 | { |
| @@ -290,6 +319,24 @@ namespace UI.Controls.Window | ||
| 290 | 319 | VisualStateManager.GoToState(this, "Normal", true); |
| 291 | 320 | } |
| 292 | 321 | } |
| 322 | 新增: | |
| 323 | 新增: if (CancelBtn != null) | |
| 324 | 新增: { | |
| 325 | 新增: CancelBtn.Click += (e, c) => | |
| 326 | 新增: { | |
| 327 | 新增: IsDialogConfirm = false; | |
| 328 | 新增: HideDialog(); | |
| 329 | 新增: }; | |
| 330 | 新增: } | |
| 331 | 新增: | |
| 332 | 新增: if (ConfirmBtn != null) | |
| 333 | 新增: { | |
| 334 | 新增: ConfirmBtn.Click += (e, c) => | |
| 335 | 新增: { | |
| 336 | 新增: IsDialogConfirm = true; | |
| 337 | 新增: HideDialog(); | |
| 338 | 新增: }; | |
| 339 | 新增: } | |
| 293 | 340 | } |
| 294 | 341 | |
| 295 | 342 | |
| @@ -352,7 +399,8 @@ namespace UI.Controls.Window | ||
| 352 | 399 | private void ShowToast() |
| 353 | 400 | { |
| 354 | 401 | ToastGrid.Visibility = Visibility.Visible; |
| 355 | 删除: | |
| 402 | 新增: DialogBorder.Visibility = Visibility.Collapsed; | |
| 403 | 新增: ToastBorder.Visibility = Visibility.Visible; | |
| 356 | 404 | Storyboard storyboard = new Storyboard(); |
| 357 | 405 | |
| 358 | 406 | DoubleAnimation scrollAnimation = new DoubleAnimation(); |
| @@ -415,6 +463,79 @@ namespace UI.Controls.Window | ||
| 415 | 463 | storyboard.Begin(); |
| 416 | 464 | } |
| 417 | 465 | |
| 466 | 新增: #region Dialog | |
| 467 | 新增: public Task<bool> ShowConfirmDialogAsync(string title_, string message_) | |
| 468 | 新增: { | |
| 469 | 新增: IsShowConfirmDialog = true; | |
| 470 | 新增: ToastGrid.Visibility = Visibility.Visible; | |
| 471 | 新增: ToastBorder.Visibility = Visibility.Collapsed; | |
| 472 | 新增: DialogBorder.Visibility = Visibility.Visible; | |
| 473 | 新增: | |
| 474 | 新增: DialogMessage = message_; | |
| 475 | 新增: DialogTitle = title_; | |
| 476 | 新增: | |
| 477 | 新增: Storyboard storyboard = new Storyboard(); | |
| 478 | 新增: | |
| 479 | 新增: DoubleAnimation scrollAnimation = new DoubleAnimation(); | |
| 480 | 新增: scrollAnimation.From = -150; | |
| 481 | 新增: scrollAnimation.To = 10; | |
| 482 | 新增: | |
| 483 | 新增: scrollAnimation.EasingFunction = new SineEase() { EasingMode = EasingMode.EaseIn }; | |
| 484 | 新增: Storyboard.SetTarget(scrollAnimation, DialogBorder); | |
| 485 | 新增: Storyboard.SetTargetProperty(scrollAnimation, new PropertyPath("RenderTransform.Children[0].Y")); | |
| 486 | 新增: scrollAnimation.Duration = new Duration(TimeSpan.FromSeconds(0.15)); | |
| 487 | 新增: | |
| 488 | 新增: DoubleAnimation opacityAnimation = new DoubleAnimation(); | |
| 489 | 新增: opacityAnimation.To = 0.6; | |
| 490 | 新增: opacityAnimation.EasingFunction = new SineEase() { EasingMode = EasingMode.EaseIn }; | |
| 491 | 新增: Storyboard.SetTarget(opacityAnimation, Masklayer); | |
| 492 | 新增: Storyboard.SetTargetProperty(opacityAnimation, new PropertyPath("Opacity")); | |
| 493 | 新增: opacityAnimation.Duration = new Duration(TimeSpan.FromSeconds(0.15)); | |
| 494 | 新增: storyboard.Children.Add(scrollAnimation); | |
| 495 | 新增: storyboard.Children.Add(opacityAnimation); | |
| 496 | 新增: storyboard.Begin(); | |
| 497 | 新增: | |
| 498 | 新增: return Task.Run(() => | |
| 499 | 新增: { | |
| 500 | 新增: | |
| 501 | 新增: while (IsShowConfirmDialog) | |
| 502 | 新增: { | |
| 503 | 新增: Thread.Sleep(10); | |
| 504 | 新增: } | |
| 505 | 新增: | |
| 506 | 新增: return IsDialogConfirm; | |
| 507 | 新增: }); | |
| 508 | 新增: } | |
| 509 | 新增: private void HideDialog() | |
| 510 | 新增: { | |
| 511 | 新增: Storyboard storyboard = new Storyboard(); | |
| 512 | 新增: | |
| 513 | 新增: DoubleAnimation scrollAnimation = new DoubleAnimation(); | |
| 514 | 新增: scrollAnimation.To = -150; | |
| 515 | 新增: | |
| 516 | 新增: scrollAnimation.EasingFunction = new SineEase() { EasingMode = EasingMode.EaseIn }; | |
| 517 | 新增: Storyboard.SetTarget(scrollAnimation, DialogBorder); | |
| 518 | 新增: Storyboard.SetTargetProperty(scrollAnimation, new PropertyPath("RenderTransform.Children[0].Y")); | |
| 519 | 新增: scrollAnimation.Duration = new Duration(TimeSpan.FromSeconds(0.12)); | |
| 520 | 新增: | |
| 521 | 新增: DoubleAnimation opacityAnimation = new DoubleAnimation(); | |
| 522 | 新增: opacityAnimation.To = 0; | |
| 523 | 新增: opacityAnimation.EasingFunction = new SineEase() { EasingMode = EasingMode.EaseIn }; | |
| 524 | 新增: Storyboard.SetTarget(opacityAnimation, Masklayer); | |
| 525 | 新增: Storyboard.SetTargetProperty(opacityAnimation, new PropertyPath("Opacity")); | |
| 526 | 新增: opacityAnimation.Duration = new Duration(TimeSpan.FromSeconds(0.15)); | |
| 527 | 新增: | |
| 528 | 新增: storyboard.Children.Add(scrollAnimation); | |
| 529 | 新增: storyboard.Children.Add(opacityAnimation); | |
| 530 | 新增: storyboard.Completed += (e, c) => | |
| 531 | 新增: { | |
| 532 | 新增: ToastGrid.Visibility = Visibility.Collapsed; | |
| 533 | 新增: IsShowConfirmDialog = false; | |
| 534 | 新增: }; | |
| 535 | 新增: storyboard.Begin(); | |
| 536 | 新增: } | |
| 537 | 新增: #endregion | |
| 538 | 新增: | |
| 418 | 539 | #region 6.事件 |
| 419 | 540 | |
| 420 | 541 | protected override void OnSourceInitialized(EventArgs e) |
| @@ -0,0 +1,15 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Linq; | |
| 4 | 新增:using System.Text; | |
| 5 | 新增:using System.Threading.Tasks; | |
| 6 | 新增:using UI.Controls.Window; | |
| 7 | 新增: | |
| 8 | 新增:namespace UI.Servicers | |
| 9 | 新增:{ | |
| 10 | 新增: public interface IUIServicer | |
| 11 | 新增: { | |
| 12 | 新增: Task<bool> ShowConfirmDialogAsync(string title_, string message_); | |
| 13 | 新增: void InitWindow(DefaultWindow window_); | |
| 14 | 新增: } | |
| 15 | 新增:} | |
| @@ -41,18 +41,21 @@ namespace UI.Servicers | ||
| 41 | 41 | private readonly IThemeServicer _themeServicer; |
| 42 | 42 | private readonly MainViewModel _mainVM; |
| 43 | 43 | private readonly IAppConfig _appConfig; |
| 44 | 新增: private readonly IUIServicer _uIServicer; | |
| 44 | 45 | private MainWindow _mainWindow; |
| 45 | 46 | public StatusBarIconServicer( |
| 46 | 47 | IAppObserver appObserver_, |
| 47 | 48 | IThemeServicer themeServicer_, |
| 48 | 49 | IAppConfig appConfig_, |
| 49 | 删除: MainViewModel mainVM_ | |
| 50 | 新增: MainViewModel mainVM_, | |
| 51 | 新增: IUIServicer uIServicer_ | |
| 50 | 52 | ) |
| 51 | 53 | { |
| 52 | 54 | _appObserver = appObserver_; |
| 53 | 55 | _themeServicer = themeServicer_; |
| 54 | 56 | _appConfig = appConfig_; |
| 55 | 57 | _mainVM = mainVM_; |
| 58 | 新增: _uIServicer = uIServicer_; | |
| 56 | 59 | } |
| 57 | 60 | public void Init() |
| 58 | 61 | { |
| @@ -72,7 +75,7 @@ namespace UI.Servicers | ||
| 72 | 75 | Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException; |
| 73 | 76 | } |
| 74 | 77 | |
| 75 | 删除: | |
| 78 | 新增: | |
| 76 | 79 | private void Current_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) |
| 77 | 80 | { |
| 78 | 81 | _statusBarIcon.Visible = false; |
| @@ -182,6 +185,8 @@ namespace UI.Servicers | ||
| 182 | 185 | _mainWindow.WindowState = WindowState.Normal; |
| 183 | 186 | _mainWindow.Show(); |
| 184 | 187 | _mainWindow.Activate(); |
| 188 | 新增: | |
| 189 | 新增: _uIServicer.InitWindow(_mainWindow); | |
| 185 | 190 | } |
| 186 | 191 | |
| 187 | 192 | private void _mainWindow_Loaded(object sender, RoutedEventArgs e) |
| @@ -0,0 +1,28 @@ | ||
| 1 | 新增:using System; | |
| 2 | 新增:using System.Collections.Generic; | |
| 3 | 新增:using System.Linq; | |
| 4 | 新增:using System.Text; | |
| 5 | 新增:using System.Threading.Tasks; | |
| 6 | 新增:using UI.Controls.Window; | |
| 7 | 新增: | |
| 8 | 新增:namespace UI.Servicers | |
| 9 | 新增:{ | |
| 10 | 新增: public class UIServicer : IUIServicer | |
| 11 | 新增: { | |
| 12 | 新增: private DefaultWindow _window; | |
| 13 | 新增: public UIServicer() | |
| 14 | 新增: { | |
| 15 | 新增: | |
| 16 | 新增: } | |
| 17 | 新增: | |
| 18 | 新增: public void InitWindow(DefaultWindow window_) | |
| 19 | 新增: { | |
| 20 | 新增: _window = window_; | |
| 21 | 新增: } | |
| 22 | 新增: | |
| 23 | 新增: public Task<bool> ShowConfirmDialogAsync(string title_, string message_) | |
| 24 | 新增: { | |
| 25 | 新增: return _window.ShowConfirmDialogAsync(title_, message_); | |
| 26 | 新增: } | |
| 27 | 新增: } | |
| 28 | 新增:} | |
| @@ -112,7 +112,7 @@ | ||
| 112 | 112 | <Image Source="{TemplateBinding Icon}" VerticalAlignment="Center" Stretch="Uniform" Width="18"/> |
| 113 | 113 | <TextBlock VerticalAlignment="Center" Text="{TemplateBinding Title}" IsEnabled="{TemplateBinding IsActive}" Foreground="{DynamicResource DefaultTextBrush}" Margin="15,0,0,0"/> |
| 114 | 114 | </StackPanel> |
| 115 | 删除: | |
| 115 | 新增: | |
| 116 | 116 | |
| 117 | 117 | </Grid> |
| 118 | 118 | <Grid Grid.Column="1" HorizontalAlignment="Right" VerticalAlignment="Top" |
| @@ -197,6 +197,34 @@ | ||
| 197 | 197 | <TextBlock x:Name="ToastText" Grid.Column="1" Text="{TemplateBinding ToastContent}" VerticalAlignment="Top" TextWrapping="WrapWithOverflow"/> |
| 198 | 198 | </Grid> |
| 199 | 199 | </Border> |
| 200 | 新增: <!--Dialog--> | |
| 201 | 新增: <Border | |
| 202 | 新增: Padding="15,15" | |
| 203 | 新增: CornerRadius="10" | |
| 204 | 新增: Width="300" | |
| 205 | 新增: x:Name="DialogBorder" Background="White" HorizontalAlignment="Center" VerticalAlignment="Top" Panel.ZIndex="1000"> | |
| 206 | 新增: <Border.RenderTransform> | |
| 207 | 新增: <TransformGroup> | |
| 208 | 新增: <TranslateTransform Y="-150"/> | |
| 209 | 新增: </TransformGroup> | |
| 210 | 新增: </Border.RenderTransform> | |
| 211 | 新增: <Border.Effect> | |
| 212 | 新增: <DropShadowEffect BlurRadius="10" Color="Black" Opacity=".1"/> | |
| 213 | 新增: </Border.Effect> | |
| 214 | 新增: <Grid > | |
| 215 | 新增: <Grid.RowDefinitions> | |
| 216 | 新增: <RowDefinition Height="40"/> | |
| 217 | 新增: <RowDefinition Height="auto"/> | |
| 218 | 新增: <RowDefinition Height="auto"/> | |
| 219 | 新增: </Grid.RowDefinitions> | |
| 220 | 新增: <TextBlock Text="{TemplateBinding DialogTitle}" FontSize="16" FontWeight="Bold"/> | |
| 221 | 新增: <TextBlock Grid.Row="1" Text="{TemplateBinding DialogMessage}" VerticalAlignment="Top" TextWrapping="WrapWithOverflow"/> | |
| 222 | 新增: <StackPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,20,0,0"> | |
| 223 | 新增: <button:Button x:Name="CancelBtn" Width="100">取消</button:Button> | |
| 224 | 新增: <button:Button x:Name="ConfirmBtn" Background="{DynamicResource ThemeBrush}" Foreground="White" Width="100" Margin="10,0,0,0">确定</button:Button> | |
| 225 | 新增: </StackPanel> | |
| 226 | 新增: </Grid> | |
| 227 | 新增: </Border> | |
| 200 | 228 | <!--遮罩层--> |
| 201 | 229 | <Border x:Name="Masklayer" Background="Black" Opacity="0"></Border> |
| 202 | 230 | </Grid> |
| @@ -204,7 +204,9 @@ | ||
| 204 | 204 | <Compile Include="Models\UINotifyPropertyChanged.cs" /> |
| 205 | 205 | <Compile Include="Models\WebSiteDetailPageModel.cs" /> |
| 206 | 206 | <Compile Include="Servicers\IStatusBarIconServicer.cs" /> |
| 207 | 新增: <Compile Include="Servicers\IUIServicer.cs" /> | |
| 207 | 208 | <Compile Include="Servicers\StatusBarIconServicer.cs" /> |
| 209 | 新增: <Compile Include="Servicers\UIServicer.cs" /> | |
| 208 | 210 | <Compile Include="Servicers\WebSiteContextMenuServicer.cs" /> |
| 209 | 211 | <Compile Include="Servicers\AppContextMenuServicer.cs" /> |
| 210 | 212 | <Compile Include="Servicers\IWebSiteContextMenuServicer.cs" /> |
| @@ -13,6 +13,7 @@ using System.Threading.Tasks; | ||
| 13 | 13 | using System.Windows.Forms; |
| 14 | 14 | using UI.Controls; |
| 15 | 15 | using UI.Models; |
| 16 | 新增:using UI.Servicers; | |
| 16 | 17 | |
| 17 | 18 | namespace UI.ViewModels |
| 18 | 19 | { |
| @@ -23,17 +24,19 @@ namespace UI.ViewModels | ||
| 23 | 24 | private readonly MainViewModel mainVM; |
| 24 | 25 | private readonly IData data; |
| 25 | 26 | private readonly IWebData _webData; |
| 27 | 新增: private readonly IUIServicer _uiServicer; | |
| 26 | 28 | public Command OpenURL { get; set; } |
| 27 | 29 | public Command CheckUpdate { get; set; } |
| 28 | 30 | public Command DelDataCommand { get; set; } |
| 29 | 31 | public Command ExportDataCommand { get; set; } |
| 30 | 32 | |
| 31 | 删除: public SettingPageVM(IAppConfig appConfig, MainViewModel mainVM, IData data, IWebData webData) | |
| 33 | 新增: public SettingPageVM(IAppConfig appConfig, MainViewModel mainVM, IData data, IWebData webData, IUIServicer uiServicer_) | |
| 32 | 34 | { |
| 33 | 35 | this.appConfig = appConfig; |
| 34 | 36 | this.mainVM = mainVM; |
| 35 | 37 | this.data = data; |
| 36 | 38 | _webData = webData; |
| 39 | 新增: _uiServicer = uiServicer_; | |
| 37 | 40 | |
| 38 | 41 | OpenURL = new Command(new Action<object>(OnOpenURL)); |
| 39 | 42 | CheckUpdate = new Command(new Action<object>(OnCheckUpdate)); |
| @@ -164,7 +167,7 @@ namespace UI.ViewModels | ||
| 164 | 167 | } |
| 165 | 168 | } |
| 166 | 169 | |
| 167 | 删除: private void OnDelData(object obj) | |
| 170 | 新增: private async void OnDelData(object obj) | |
| 168 | 171 | { |
| 169 | 172 | if (DelDataStartMonthDate > DelDataEndMonthDate) |
| 170 | 173 | { |
| @@ -172,10 +175,13 @@ namespace UI.ViewModels | ||
| 172 | 175 | return; |
| 173 | 176 | } |
| 174 | 177 | |
| 175 | 删除: data.ClearRange(DelDataStartMonthDate, DelDataEndMonthDate); | |
| 176 | 删除: _webData.Clear(DelDataStartMonthDate, DelDataEndMonthDate); | |
| 177 | 删除: | |
| 178 | 删除: mainVM.Toast("操作已完成", Controls.Window.ToastType.Success); | |
| 178 | 新增: bool isConfirm = await _uiServicer.ShowConfirmDialogAsync("删除确认", "是否执行此操作?"); | |
| 179 | 新增: if (isConfirm) | |
| 180 | 新增: { | |
| 181 | 新增: data.ClearRange(DelDataStartMonthDate, DelDataEndMonthDate); | |
| 182 | 新增: _webData.Clear(DelDataStartMonthDate, DelDataEndMonthDate); | |
| 183 | 新增: mainVM.Toast("操作已完成", Controls.Window.ToastType.Success); | |
| 184 | 新增: } | |
| 179 | 185 | } |
| 180 | 186 | |
| 181 | 187 | private void OnExportData(object obj) |

