跳到主要内容

github/tai

公开

Tai · Windows 软件与网站使用时长统计。上游 Planshit/Tai 的源码镜像,非灵栈原创;MIT 许可。来源:https://github.com/Planshit/Tai 。本次为手动同步,暂不提供安装包。

提交记录
修改Core/Models/AppModel.cs+4 −0看文件
@@ -22,6 +22,10 @@ namespace Core.Models
2222 /// </summary>
2323 public string Name { get; set; }
2424 /// <summary>
25新增: /// 别名
26新增: /// </summary>
27新增: public string Alias { get; set; }
28新增: /// <summary>
2529 /// 描述
2630 /// </summary>
2731 public string Description { get; set; }
修改Core/Models/Db/WebSiteModel.cs+4 −0看文件
@@ -25,6 +25,10 @@ namespace Core.Models.Db
2525 /// </summary>
2626 public string Domain { get; set; }
2727 /// <summary>
28新增: /// 别名
29新增: /// </summary>
30新增: public string Alias { get; set; }
31新增: /// <summary>
2832 /// 分类ID
2933 /// </summary>
3034 public int CategoryID { get; set; }
修改Core/Properties/AssemblyInfo.cs+2 −2看文件
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
3232//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
3333//通过使用 "*",如下所示:
3434// [assembly: AssemblyVersion("1.0.*")]
35删除:[assembly: AssemblyVersion("1.1.0.5")]
36删除:[assembly: AssemblyFileVersion("1.1.0.5")]
35新增:[assembly: AssemblyVersion("1.1.0.7")]
36新增:[assembly: AssemblyFileVersion("1.1.0.7")]
修改Core/Servicers/Instances/AppData.cs+5 −2看文件
@@ -48,6 +48,7 @@ namespace Core.Servicers.Instances
4848 File = m.File,
4949 IconFile = m.IconFile,
5050 Name = m.Name,
51新增: Alias = m.Alias,
5152 TotalTime = m.TotalTime
5253 })
5354 .ToList();
@@ -73,12 +74,13 @@ namespace Core.Servicers.Instances
7374 app.Description = app_.Description;
7475 app.File = app_.File;
7576 app.CategoryID = app_.CategoryID;
77新增: app.Alias = app_.Alias;
7678 db.SaveChanges();
7779 }
7880 _databse.CloseWriter();
7981 }
8082 }
81删除: catch(Exception e)
83新增: catch (Exception e)
8284 {
8385 Logger.Error(e.ToString());
8486 }
@@ -119,7 +121,8 @@ namespace Core.Servicers.Instances
119121 }
120122 _databse.CloseWriter();
121123 }
122删除: }catch(Exception e)
124新增: }
125新增: catch (Exception e)
123126 {
124127 Logger.Error(e.ToString());
125128 }
修改Core/Servicers/Instances/WebData.cs+39 −6看文件
@@ -278,11 +278,12 @@ namespace Core.Servicers.Instances
278278 .GroupBy(m => m.SiteId)
279279 .Select(s => new
280280 {
281删除: Title = s.FirstOrDefault().Site.Title,
282删除: Domain = s.FirstOrDefault().Site.Domain,
283删除: CategoryID = s.FirstOrDefault().Site.CategoryID,
284删除: IconFile = s.FirstOrDefault().Site.IconFile,
285删除: ID = s.FirstOrDefault().Site.ID,
281新增: //Title = s.FirstOrDefault().Site.Title,
282新增: //Domain = s.FirstOrDefault().Site.Domain,
283新增: //CategoryID = s.FirstOrDefault().Site.CategoryID,
284新增: //IconFile = s.FirstOrDefault().Site.IconFile,
285新增: //ID = s.FirstOrDefault().Site.ID,
286新增: Site = s.FirstOrDefault().Site,
286287 Duration = s.Sum(m => m.Duration),
287288 });
288289
@@ -302,7 +303,18 @@ namespace Core.Servicers.Instances
302303 {
303304 data = data.OrderByDescending(m => m.Duration);
304305 }
305删除: var result = JsonConvert.DeserializeObject<List<WebSiteModel>>(JsonConvert.SerializeObject(data.ToList()));
306新增: var list = data.Select(s => new
307新增: {
308新增: Alias = s.Site.Alias,
309新增: Title = s.Site.Title,
310新增: Domain = s.Site.Domain,
311新增: CategoryID = s.Site.CategoryID,
312新增: IconFile = s.Site.IconFile,
313新增: ID = s.Site.ID,
314新增: Duration = s.Duration,
315新增: }).ToList();
316新增:
317新增: var result = JsonConvert.DeserializeObject<List<WebSiteModel>>(JsonConvert.SerializeObject(list));
306318 return result;
307319 }
308320 }
@@ -777,6 +789,7 @@ namespace Core.Servicers.Instances
777789 IconFile = s.FirstOrDefault().Site.IconFile,
778790 CategoryID = s.FirstOrDefault().Site.CategoryID,
779791 Category = s.FirstOrDefault().Category,
792新增: Alias = s.FirstOrDefault().Site.Alias,
780793 }).ToList();
781794
782795 //var result = query.Select(s => new WebSiteModel
@@ -840,5 +853,25 @@ namespace Core.Servicers.Instances
840853 }
841854 }
842855 }
856新增:
857新增: public WebSiteModel Update(WebSiteModel website_)
858新增: {
859新增: using (var db = _database.GetWriterContext())
860新增: {
861新增: var website = db.WebSites.FirstOrDefault(m => m.ID == website_.ID);
862新增: if (website != null)
863新增: {
864新增: website.Alias = website_.Alias;
865新增: website.Domain = website_.Domain;
866新增: website.Title = website_.Title;
867新增: db.SaveChanges();
868新增: _database.CloseWriter();
869新增: }
870新增: return website;
871新增: //string sql = $"update WebSiteModels set CategoryID={categoryId_} where ID in ({string.Join(",", siteIds_)})";
872新增: //db.Database.ExecuteSqlCommand(sql);
873新增: //db.SaveChanges();
874新增: }
875新增: }
843876 }
844877}
文件末尾没有换行
修改Core/Servicers/Interfaces/IWebData.cs+5 −0看文件
@@ -168,5 +168,10 @@ namespace Core.Servicers.Interfaces
168168 /// <param name="start_">开始时间</param>
169169 /// <param name="end_">结束时间</param>
170170 void Export(string dir_, DateTime start_, DateTime end_);
171新增: /// <summary>
172新增: /// 更新站点数据
173新增: /// </summary>
174新增: /// <param name="website_"></param>
175新增: WebSiteModel Update(WebSiteModel website_);
171176 }
172177}
修改UI/Controls/Charts/ChartsItemTypeCard.cs+1 −1看文件
@@ -120,7 +120,7 @@ namespace UI.Controls.Charts
120120 isRendering = true;
121121
122122 //对部分程序未获取程序名的程序使用路径中名字作为程序名
123删除: NameTextObj.Text = Data.Name;
123新增: //NameTextObj.Text = Data.Name;
124124 //if (Data.Name.Trim() == "" && Data.PopupText.Trim() != "")
125125 //{
126126 // FileInfo fi = new FileInfo(Data.PopupText);
修改UI/Controls/Charts/ChartsItemTypeList.cs+1 −1看文件
@@ -162,7 +162,7 @@ namespace UI.Controls.Charts
162162 return;
163163 }
164164 isRendering = true;
165删除: NameTextObj.Text = Data.Name;
165新增: //NameTextObj.Text = Data.Name;
166166 //对部分程序未获取程序名的程序使用路径中名字作为程序名
167167 //if (Data.Name.Trim() == "" && Data.PopupText.Trim() != "")
168168 //{
修改UI/Controls/Charts/Model/ChartsDataModel.cs+2 −1看文件
@@ -9,10 +9,11 @@ namespace UI.Controls.Charts.Model
99{
1010 public class ChartsDataModel : UINotifyPropertyChanged
1111 {
12新增: private string Name_;
1213 /// <summary>
1314 /// 名称
1415 /// </summary>
15删除: public string Name { get; set; }
16新增: public string Name { get { return Name_; } set { Name_ = value; OnPropertyChanged(); } }
1617
1718 /// <summary>
1819 /// 值
修改UI/Controls/Window/DefaultWindow.cs+156 −8看文件
@@ -9,6 +9,7 @@ using System.Threading;
99using System.Threading.Tasks;
1010using System.Windows;
1111using System.Windows.Controls;
12新增:using System.Windows.Data;
1213using System.Windows.Input;
1314using System.Windows.Interop;
1415using System.Windows.Media;
@@ -16,6 +17,7 @@ using System.Windows.Media.Animation;
1617using System.Windows.Media.Imaging;
1718using System.Windows.Threading;
1819using UI.Controls.Button;
20新增:using UI.Controls.Input;
1921
2022namespace UI.Controls.Window
2123{
@@ -43,6 +45,17 @@ namespace UI.Controls.Window
4345 set { SetValue(DialogMessageProperty, value); }
4446 }
4547 #endregion
48新增: #region InputModal
49新增: public static readonly DependencyProperty InputModalValueProperty = DependencyProperty.Register("InputModalValue", typeof(string), typeof(DefaultWindow));
50新增: /// <summary>
51新增: /// Dialog title
52新增: /// </summary>
53新增: public string InputModalValue
54新增: {
55新增: get { return (string)GetValue(InputModalValueProperty); }
56新增: set { SetValue(InputModalValueProperty, value); }
57新增: }
58新增: #endregion
4659 public static readonly DependencyProperty IsShowToastDeproperty = DependencyProperty.Register("IsShowToast", typeof(bool), typeof(DefaultWindow), new PropertyMetadata(false, new PropertyChangedCallback(OnIsShowToastChanged)));
4760 public bool IsShowToast { get { return (bool)GetValue(IsShowToastDeproperty); } set { SetValue(IsShowToastDeproperty, value); } }
4861 private static void OnIsShowToastChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
@@ -209,12 +222,15 @@ namespace UI.Controls.Window
209222 /// </summary>
210223 public bool IsWindowClosed { get { return IsWindowClosed_; } }
211224
212删除: private Border ToastBorder, Masklayer, DialogBorder;
225新增: private Border ToastBorder, Masklayer, DialogBorder, InputModalBorder;
213226 private Grid ToastGrid;
214227 private DispatcherTimer toastTimer;
215228 private bool IsDialogConfirm;
216删除: private bool IsShowConfirmDialog;
217删除: private Button.Button CancelBtn, ConfirmBtn;
229新增: private bool IsShowConfirmDialog, IsShowInputModal;
230新增: private Button.Button CancelBtn, ConfirmBtn, InputModalCancelBtn, InputModalConfirmBtn;
231新增: private InputBox InputModalInputBox;
232新增: private string InputValue;
233新增: private Func<string, bool> InputModalValidFnc;
218234 #region 3.初始化
219235 public DefaultWindow()
220236 {
@@ -306,6 +322,10 @@ namespace UI.Controls.Window
306322 DialogBorder = GetTemplateChild("DialogBorder") as Border;
307323 CancelBtn = GetTemplateChild("CancelBtn") as Button.Button;
308324 ConfirmBtn = GetTemplateChild("ConfirmBtn") as Button.Button;
325新增: InputModalBorder = GetTemplateChild("InputModalBorder") as Border;
326新增: InputModalCancelBtn = GetTemplateChild("InputModalCancelBtn") as Button.Button;
327新增: InputModalConfirmBtn = GetTemplateChild("InputModalConfirmBtn") as Button.Button;
328新增: InputModalInputBox = GetTemplateChild("InputModalInputBox") as InputBox;
309329
310330 if (PageContainer != null)
311331 {
@@ -337,6 +357,36 @@ namespace UI.Controls.Window
337357 HideDialog();
338358 };
339359 }
360新增:
361新增: if (InputModalCancelBtn != null)
362新增: {
363新增: InputModalCancelBtn.Click += (e, c) =>
364新增: {
365新增: IsDialogConfirm = false;
366新增: HideInputModal();
367新增: };
368新增: }
369新增:
370新增: if (InputModalConfirmBtn != null)
371新增: {
372新增: InputModalConfirmBtn.Click += (e, c) =>
373新增: {
374新增: if (InputModalValidFnc != null && !InputModalValidFnc(InputValue))
375新增: {
376新增: return;
377新增: }
378新增: IsDialogConfirm = true;
379新增: HideInputModal();
380新增: };
381新增: }
382新增:
383新增: if (InputModalInputBox != null)
384新增: {
385新增: InputModalInputBox.TextChanged += (e, c) =>
386新增: {
387新增: InputValue = InputModalInputBox.Text;
388新增: };
389新增: }
340390 }
341391
342392
@@ -400,6 +450,10 @@ namespace UI.Controls.Window
400450 {
401451 ToastGrid.Visibility = Visibility.Visible;
402452 DialogBorder.Visibility = Visibility.Collapsed;
453新增: if (!IsShowInputModal)
454新增: {
455新增: InputModalBorder.Visibility = Visibility.Collapsed;
456新增: }
403457 ToastBorder.Visibility = Visibility.Visible;
404458 Storyboard storyboard = new Storyboard();
405459
@@ -424,7 +478,10 @@ namespace UI.Controls.Window
424478 ToastGrid.MouseLeftButtonDown += ToastGrid_MouseLeftButtonDown;
425479 };
426480 storyboard.Children.Add(scrollAnimation);
427删除: storyboard.Children.Add(opacityAnimation);
481新增: if (!IsShowInputModal)
482新增: {
483新增: storyboard.Children.Add(opacityAnimation);
484新增: }
428485 storyboard.Begin();
429486 }
430487
@@ -455,14 +512,19 @@ namespace UI.Controls.Window
455512 opacityAnimation.Duration = new Duration(TimeSpan.FromSeconds(0.25));
456513
457514 storyboard.Children.Add(scrollAnimation);
458删除: storyboard.Children.Add(opacityAnimation);
459删除: storyboard.Completed += (e, c) =>
515新增: if (!IsShowInputModal)
460516 {
461删除: ToastGrid.Visibility = Visibility.Collapsed;
462删除: };
517新增: storyboard.Children.Add(opacityAnimation);
518新增: storyboard.Completed += (e, c) =>
519新增: {
520新增: ToastGrid.Visibility = Visibility.Collapsed;
521新增: };
522新增: }
523新增:
463524 storyboard.Begin();
464525 }
465526
527新增:
466528 #region Dialog
467529 public Task<bool> ShowConfirmDialogAsync(string title_, string message_)
468530 {
@@ -470,6 +532,7 @@ namespace UI.Controls.Window
470532 ToastGrid.Visibility = Visibility.Visible;
471533 ToastBorder.Visibility = Visibility.Collapsed;
472534 DialogBorder.Visibility = Visibility.Visible;
535新增: InputModalBorder.Visibility = Visibility.Collapsed;
473536
474537 DialogMessage = message_;
475538 DialogTitle = title_;
@@ -536,6 +599,91 @@ namespace UI.Controls.Window
536599 }
537600 #endregion
538601
602新增: #region InputModal
603新增: public Task<string> ShowInputModalAsync(string title_, string message_, string value_, Func<string, bool> validFnc_)
604新增: {
605新增: IsShowInputModal = true;
606新增: ToastGrid.Visibility = Visibility.Visible;
607新增: ToastBorder.Visibility = Visibility.Collapsed;
608新增: DialogBorder.Visibility = Visibility.Collapsed;
609新增: InputModalBorder.Visibility = Visibility.Visible;
610新增:
611新增: DialogMessage = message_;
612新增: DialogTitle = title_;
613新增: InputModalValue = value_;
614新增: InputModalValidFnc = validFnc_;
615新增:
616新增: InputModalInputBox.Text = InputModalValue;
617新增:
618新增: Storyboard storyboard = new Storyboard();
619新增:
620新增: DoubleAnimation scrollAnimation = new DoubleAnimation();
621新增: scrollAnimation.From = -150;
622新增: scrollAnimation.To = 10;
623新增:
624新增: scrollAnimation.EasingFunction = new SineEase() { EasingMode = EasingMode.EaseIn };
625新增: Storyboard.SetTarget(scrollAnimation, InputModalBorder);
626新增: Storyboard.SetTargetProperty(scrollAnimation, new PropertyPath("RenderTransform.Children[0].Y"));
627新增: scrollAnimation.Duration = new Duration(TimeSpan.FromSeconds(0.15));
628新增:
629新增: DoubleAnimation opacityAnimation = new DoubleAnimation();
630新增: opacityAnimation.To = 0.6;
631新增: opacityAnimation.EasingFunction = new SineEase() { EasingMode = EasingMode.EaseIn };
632新增: Storyboard.SetTarget(opacityAnimation, Masklayer);
633新增: Storyboard.SetTargetProperty(opacityAnimation, new PropertyPath("Opacity"));
634新增: opacityAnimation.Duration = new Duration(TimeSpan.FromSeconds(0.15));
635新增: storyboard.Children.Add(scrollAnimation);
636新增: storyboard.Children.Add(opacityAnimation);
637新增: storyboard.Begin();
638新增:
639新增: return Task.Run(() =>
640新增: {
641新增:
642新增: while (IsShowInputModal)
643新增: {
644新增: Thread.Sleep(10);
645新增: }
646新增:
647新增: if (IsDialogConfirm)
648新增: {
649新增: return InputValue;
650新增: }
651新增: else
652新增: {
653新增: throw new Exception("Input cancel");
654新增: }
655新增: });
656新增: }
657新增: private void HideInputModal()
658新增: {
659新增: Storyboard storyboard = new Storyboard();
660新增:
661新增: DoubleAnimation scrollAnimation = new DoubleAnimation();
662新增: scrollAnimation.To = -150;
663新增:
664新增: scrollAnimation.EasingFunction = new SineEase() { EasingMode = EasingMode.EaseIn };
665新增: Storyboard.SetTarget(scrollAnimation, InputModalBorder);
666新增: Storyboard.SetTargetProperty(scrollAnimation, new PropertyPath("RenderTransform.Children[0].Y"));
667新增: scrollAnimation.Duration = new Duration(TimeSpan.FromSeconds(0.12));
668新增:
669新增: DoubleAnimation opacityAnimation = new DoubleAnimation();
670新增: opacityAnimation.To = 0;
671新增: opacityAnimation.EasingFunction = new SineEase() { EasingMode = EasingMode.EaseIn };
672新增: Storyboard.SetTarget(opacityAnimation, Masklayer);
673新增: Storyboard.SetTargetProperty(opacityAnimation, new PropertyPath("Opacity"));
674新增: opacityAnimation.Duration = new Duration(TimeSpan.FromSeconds(0.15));
675新增:
676新增: storyboard.Children.Add(scrollAnimation);
677新增: storyboard.Children.Add(opacityAnimation);
678新增: storyboard.Completed += (e, c) =>
679新增: {
680新增: ToastGrid.Visibility = Visibility.Collapsed;
681新增: IsShowInputModal = false;
682新增: };
683新增: storyboard.Begin();
684新增: }
685新增: #endregion
686新增:
539687 #region 6.事件
540688
541689 protected override void OnSourceInitialized(EventArgs e)
修改UI/Properties/AssemblyInfo.cs+2 −2看文件
@@ -51,5 +51,5 @@ using System.Windows;
5151//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
5252//通过使用 "*",如下所示:
5353// [assembly: AssemblyVersion("1.0.*")]
54删除:[assembly: AssemblyVersion("1.5.0.5")]
55删除:[assembly: AssemblyFileVersion("1.5.0.5")]
54新增:[assembly: AssemblyVersion("1.5.0.6")]
55新增:[assembly: AssemblyFileVersion("1.5.0.6")]
修改UI/Servicers/AppContextMenuServicer.cs+60 −1看文件
@@ -7,6 +7,7 @@ using System.IO;
77using System.Linq;
88using System.Text;
99using System.Threading.Tasks;
10新增:using System.Windows;
1011using System.Windows.Controls;
1112using System.Windows.Media;
1213using UI.Controls.Charts.Model;
@@ -22,6 +23,7 @@ namespace UI.Servicers
2223 private readonly IAppData appData;
2324 private readonly IAppConfig appConfig;
2425 private readonly IThemeServicer theme;
26新增: private readonly IUIServicer _uIServicer;
2527 private ContextMenu menu;
2628 private MenuItem setCategory;
2729 private MenuItem setLink;
@@ -29,13 +31,20 @@ namespace UI.Servicers
2931 MenuItem _whiteList = new MenuItem();
3032
3133
32删除: public AppContextMenuServicer(MainViewModel main, ICategorys categorys, IAppData appData, IAppConfig appConfig, IThemeServicer theme)
34新增: public AppContextMenuServicer(
35新增: MainViewModel main,
36新增: ICategorys categorys,
37新增: IAppData appData,
38新增: IAppConfig appConfig,
39新增: IThemeServicer theme,
40新增: IUIServicer uIServicer_)
3341 {
3442 this.main = main;
3543 this.categorys = categorys;
3644 this.appData = appData;
3745 this.appConfig = appConfig;
3846 this.theme = theme;
47新增: this._uIServicer = uIServicer_;
3948
4049 }
4150
@@ -65,6 +74,10 @@ namespace UI.Servicers
6574 setCategory = new MenuItem();
6675 setCategory.Header = "设置分类";
6776
77新增: MenuItem editAlias = new MenuItem();
78新增: editAlias.Header = "编辑别名";
79新增: editAlias.Click += EditAlias_ClickAsync;
80新增:
6881 setLink = new MenuItem();
6982 setLink.Header = "添加关联";
7083
@@ -78,6 +91,7 @@ namespace UI.Servicers
7891 menu.Items.Add(new Separator());
7992 menu.Items.Add(setCategory);
8093 menu.Items.Add(setLink);
94新增: menu.Items.Add(editAlias);
8195 menu.Items.Add(new Separator());
8296
8397 menu.Items.Add(openDir);
@@ -87,6 +101,49 @@ namespace UI.Servicers
87101 menu.ContextMenuOpening += SetCategory_ContextMenuOpening;
88102 }
89103
104新增: private async void EditAlias_ClickAsync(object sender, RoutedEventArgs e)
105新增: {
106新增: var data = menu.Tag as ChartsDataModel;
107新增: var log = data.Data as DailyLogModel;
108新增: var app = log != null ? log.AppModel : null;
109新增:
110新增: if (log == null)
111新增: {
112新增: app = (data.Data as HoursLogModel).AppModel;
113新增: }
114新增:
115新增: try
116新增: {
117新增: string input = await _uIServicer.ShowInputModalAsync("修改别名", "请输入别名", app.Alias, (val) =>
118新增: {
119新增: if (string.IsNullOrEmpty(val))
120新增: {
121新增: main.Error("请输入别名");
122新增: return false;
123新增: }
124新增: else if (val.Length > 10)
125新增: {
126新增: main.Error("别名最大长度为10位字符");
127新增: return false;
128新增: }
129新增: return true;
130新增: });
131新增:
132新增: // 开始更新别名
133新增: var editApp = appData.GetApp(app.ID);
134新增: editApp.Alias = input;
135新增: appData.UpdateApp(editApp);
136新增: data.Name = input;
137新增:
138新增: main.Success("别名已更新");
139新增: Debug.WriteLine("输入内容:" + input);
140新增: }
141新增: catch
142新增: {
143新增: // 输入取消,无需处理异常
144新增: }
145新增: }
146新增:
90147 private void _whiteList_Click(object sender, System.Windows.RoutedEventArgs e)
91148 {
92149 var data = menu.Tag as ChartsDataModel;
@@ -215,6 +272,8 @@ namespace UI.Servicers
215272 setCategory.Items.Add(categoryMenu);
216273 }
217274
275新增: setCategory.IsEnabled = setCategory.Items.Count > 0;
276新增:
218277 }
219278
220279 private void UpdateLinks()
修改UI/Servicers/IUIServicer.cs+2 −0看文件
@@ -11,5 +11,7 @@ namespace UI.Servicers
1111 {
1212 Task<bool> ShowConfirmDialogAsync(string title_, string message_);
1313 void InitWindow(DefaultWindow window_);
14新增: Task<string> ShowInputModalAsync(string title_, string placeholder_, string value_ = null, Func<string, bool> validFnc_ = null);
15新增:
1416 }
1517}
修改UI/Servicers/UIServicer.cs+6 −0看文件
@@ -24,5 +24,11 @@ namespace UI.Servicers
2424 {
2525 return _window.ShowConfirmDialogAsync(title_, message_);
2626 }
27新增:
28新增: public Task<string> ShowInputModalAsync(string title_, string placeholder_, string value_ = null, Func<string, bool> validFnc_ = null)
29新增: {
30新增: return _window.ShowInputModalAsync(title_, placeholder_, value_, validFnc_);
31新增:
32新增: }
2733 }
2834}
修改UI/Servicers/WebSiteContextMenuServicer.cs+49 −1看文件
@@ -9,6 +9,7 @@ using System.IO;
99using System.Linq;
1010using System.Text;
1111using System.Threading.Tasks;
12新增:using System.Windows;
1213using System.Windows.Controls;
1314using System.Windows.Documents;
1415using System.Windows.Media;
@@ -24,6 +25,8 @@ namespace UI.Servicers
2425 private readonly IAppConfig _appConfig;
2526 private readonly IThemeServicer _theme;
2627 private readonly IWebData _webData;
28新增: private readonly IUIServicer _uIServicer;
29新增:
2730 private ContextMenu _menu;
2831 private MenuItem _setCategory;
2932 private MenuItem _block;
@@ -34,12 +37,14 @@ namespace UI.Servicers
3437 MainViewModel main_,
3538 IAppConfig appConfig_,
3639 IThemeServicer theme_,
37删除: IWebData webData_)
40新增: IWebData webData_,
41新增: IUIServicer uIServicer_)
3842 {
3943 _main = main_;
4044 _appConfig = appConfig_;
4145 _theme = theme_;
4246 _webData = webData_;
47新增: _uIServicer = uIServicer_;
4348 }
4449
4550 public void Init()
@@ -65,6 +70,10 @@ namespace UI.Servicers
6570 _setCategory = new MenuItem();
6671 _setCategory.Header = "设置分类";
6772
73新增: MenuItem editAlias = new MenuItem();
74新增: editAlias.Header = "编辑别名";
75新增: editAlias.Click += EditAlias_ClickAsync;
76新增:
6877 _block = new MenuItem();
6978 _block.Header = "忽略此网站";
7079 _block.Click += Block_Click;
@@ -76,11 +85,50 @@ namespace UI.Servicers
7685 _menu.Items.Add(open);
7786 _menu.Items.Add(new Separator());
7887 _menu.Items.Add(_setCategory);
88新增: _menu.Items.Add(editAlias);
7989 _menu.Items.Add(new Separator());
8090 _menu.Items.Add(_block);
8191 _menu.ContextMenuOpening += _menu_ContextMenuOpening;
8292 }
8393
94新增: private async void EditAlias_ClickAsync(object sender, RoutedEventArgs e)
95新增: {
96新增: var data = _menu.Tag as ChartsDataModel;
97新增: var site = data.Data as WebSiteModel;
98新增:
99新增: try
100新增: {
101新增: string input = await _uIServicer.ShowInputModalAsync("修改别名", "请输入别名", site.Alias, (val) =>
102新增: {
103新增: if (string.IsNullOrEmpty(val))
104新增: {
105新增: _main.Error("请输入别名");
106新增: return false;
107新增: }
108新增: else if (val.Length > 10)
109新增: {
110新增: _main.Error("别名最大长度为10位字符");
111新增: return false;
112新增: }
113新增: return true;
114新增: });
115新增:
116新增: // 开始更新别名
117新增:
118新增: data.Name = input;
119新增: site.Alias = input;
120新增:
121新增: _webData.Update(site);
122新增:
123新增: _main.Success("别名已更新");
124新增: Debug.WriteLine("输入内容:" + input);
125新增: }
126新增: catch
127新增: {
128新增: // 输入取消,无需处理异常
129新增: }
130新增: }
131新增:
84132 private void _menu_ContextMenuOpening(object sender, ContextMenuEventArgs e)
85133 {
86134 if (_menu.Tag == null)
修改UI/Themes/Charts/ChartsItemTypeCard.xaml+1 −1看文件
@@ -54,7 +54,7 @@
5454 <Image x:Name="IconObj" Width="25" HorizontalAlignment="Center" VerticalAlignment="Center" RenderOptions.BitmapScalingMode="LowQuality"/>
5555 <!--</Border>-->
5656
57删除: <TextBlock x:Name="NameTextObj" Foreground="{DynamicResource WhiteBgTextBrush}" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="10"/>
57新增: <TextBlock x:Name="NameTextObj" Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:ChartsItemTypeCard}}, Path=Data.Name}" Foreground="{DynamicResource WhiteBgTextBrush}" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="10"/>
5858
5959 <Border VerticalAlignment="Top" CornerRadius="5" Padding="5" HorizontalAlignment="Left" Margin="10" >
6060 <Border.Background>
修改UI/Themes/Charts/ChartsItemTypeList.xaml+1 −1看文件
@@ -31,7 +31,7 @@
3131 <ColumnDefinition Width="auto"/>
3232 <ColumnDefinition Width="auto"/>
3333 </Grid.ColumnDefinitions>
34删除: <TextBlock x:Name="NameTextObj" Foreground="{DynamicResource DefaultTextBrush}" HorizontalAlignment="Left" VerticalAlignment="Center" />
34新增: <TextBlock x:Name="NameTextObj" Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:ChartsItemTypeList}}, Path=Data.Name}" Foreground="{DynamicResource DefaultTextBrush}" HorizontalAlignment="Left" VerticalAlignment="Center" />
3535
3636 <ListView x:Name="BadgeListView" Visibility="Collapsed" Grid.Column="1" ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:ChartsItemTypeList}}, Path=Data.BadgeList}" Margin="0,0,0,0" ScrollViewer.HorizontalScrollBarVisibility="Disabled" >
3737
修改UI/Themes/Window/DefaultWindow.xaml+33 −2看文件
@@ -1,7 +1,8 @@
11<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
22 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
33 xmlns:w="clr-namespace:UI.Controls.Window" xmlns:button="clr-namespace:UI.Controls.Button"
4删除: xmlns:base="clr-namespace:UI.Controls.Base">
4新增: xmlns:base="clr-namespace:UI.Controls.Base"
5新增: xmlns:input="clr-namespace:UI.Controls.Input">
56 <Style x:Key="WindowSystemButton" TargetType="{x:Type Button}">
67 <Setter Property="Background" Value="Transparent"/>
78 <Setter Property="OverridesDefaultStyle" Value="True"/>
@@ -178,7 +179,7 @@
178179 Padding="15,15"
179180 CornerRadius="12"
180181 MaxWidth="320"
181删除: x:Name="ToastBorder" Background="White" HorizontalAlignment="Center" VerticalAlignment="Top" Panel.ZIndex="1000">
182新增: x:Name="ToastBorder" Background="White" HorizontalAlignment="Center" VerticalAlignment="Top" Panel.ZIndex="99999">
182183 <Border.RenderTransform>
183184 <TransformGroup>
184185 <TranslateTransform Y="-150"/>
@@ -225,6 +226,36 @@
225226 </StackPanel>
226227 </Grid>
227228 </Border>
229新增: <!--Dialog-->
230新增: <Border
231新增: Padding="15,15"
232新增: CornerRadius="10"
233新增: Width="350"
234新增: x:Name="InputModalBorder" Background="White" HorizontalAlignment="Center" VerticalAlignment="Top" Panel.ZIndex="1000">
235新增: <Border.RenderTransform>
236新增: <TransformGroup>
237新增: <TranslateTransform Y="-150"/>
238新增: </TransformGroup>
239新增: </Border.RenderTransform>
240新增: <Border.Effect>
241新增: <DropShadowEffect BlurRadius="10" Color="Black" Opacity=".1"/>
242新增: </Border.Effect>
243新增: <Grid >
244新增: <Grid.RowDefinitions>
245新增: <RowDefinition Height="40"/>
246新增: <RowDefinition Height="auto"/>
247新增: <RowDefinition Height="auto"/>
248新增: </Grid.RowDefinitions>
249新增: <TextBlock Text="{TemplateBinding DialogTitle}" FontSize="16" FontWeight="Bold"/>
250新增: <Border Grid.Row="1">
251新增: <input:InputBox x:Name="InputModalInputBox" Placeholder="{TemplateBinding DialogMessage}"></input:InputBox>
252新增: </Border>
253新增: <StackPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,10,0,0">
254新增: <button:Button x:Name="InputModalCancelBtn" Width="100">取消</button:Button>
255新增: <button:Button x:Name="InputModalConfirmBtn" Background="{DynamicResource ThemeBrush}" Foreground="White" Width="100" Margin="10,0,0,0">确定</button:Button>
256新增: </StackPanel>
257新增: </Grid>
258新增: </Border>
228259 <!--遮罩层-->
229260 <Border x:Name="Masklayer" Background="Black" Opacity="0"></Border>
230261 </Grid>
修改UI/ViewModels/ChartPageVM.cs+5 −5看文件
@@ -62,7 +62,7 @@ namespace UI.ViewModels
6262 {
6363 Name = "上周"
6464 });
65删除:
65新增:
6666 var chartDataModeOptions = new List<SelectItemModel>
6767 {
6868 new SelectItemModel()
@@ -682,7 +682,7 @@ namespace UI.ViewModels
682682
683683 var bindModel = new ChartsDataModel();
684684 bindModel.Data = item;
685删除: bindModel.Name = string.IsNullOrEmpty(item.AppModel?.Description) ? item.AppModel.Name : item.AppModel.Description;
685新增: bindModel.Name = !string.IsNullOrEmpty(item.AppModel?.Alias) ? item.AppModel.Alias : string.IsNullOrEmpty(item.AppModel?.Description) ? item.AppModel.Name : item.AppModel.Description;
686686 bindModel.Value = item.Time;
687687 bindModel.Tag = Time.ToString(item.Time);
688688 bindModel.PopupText = item.AppModel?.File;
@@ -746,7 +746,7 @@ namespace UI.ViewModels
746746 {
747747 var bindModel = new ChartsDataModel();
748748 bindModel.Data = item;
749删除: bindModel.Name = string.IsNullOrEmpty(item.AppModel?.Description) ? item.AppModel.Name : item.AppModel.Description;
749新增: bindModel.Name = !string.IsNullOrEmpty(item.AppModel?.Alias) ? item.AppModel.Alias : string.IsNullOrEmpty(item.AppModel?.Description) ? item.AppModel.Name : item.AppModel.Description;
750750 bindModel.Value = item.Time;
751751 bindModel.Tag = Time.ToString(item.Time);
752752 bindModel.PopupText = item.AppModel?.File;
@@ -760,7 +760,7 @@ namespace UI.ViewModels
760760 {
761761 var bindModel = new ChartsDataModel();
762762 bindModel.Data = item;
763删除: bindModel.Name = string.IsNullOrEmpty(item.AppModel?.Description) ? item.AppModel.Name : item.AppModel.Description;
763新增: bindModel.Name = !string.IsNullOrEmpty(item.AppModel?.Alias) ? item.AppModel.Alias : string.IsNullOrEmpty(item.AppModel?.Description) ? item.AppModel.Name : item.AppModel.Description;
764764 bindModel.Value = item.Time;
765765 bindModel.Tag = Time.ToString(item.Time);
766766 bindModel.PopupText = item.AppModel?.File;
@@ -951,7 +951,7 @@ namespace UI.ViewModels
951951 {
952952 var bindModel = new ChartsDataModel();
953953 bindModel.Data = item;
954删除: bindModel.Name = item.Title;
954新增: bindModel.Name = !string.IsNullOrEmpty(item.Alias) ? item.Alias : item.Title;
955955 bindModel.Value = item.Duration;
956956 bindModel.Tag = Time.ToString(item.Duration);
957957 bindModel.PopupText = item.Domain;
修改UI/ViewModels/DataPageVM.cs+2 −2看文件
@@ -212,7 +212,7 @@ namespace UI.ViewModels
212212 {
213213 var bindModel = new ChartsDataModel();
214214 bindModel.Data = item;
215删除: bindModel.Name = string.IsNullOrEmpty(item.AppModel?.Description) ? item.AppModel.Name : item.AppModel.Description;
215新增: bindModel.Name = !string.IsNullOrEmpty(item.AppModel?.Alias) ? item.AppModel.Alias : string.IsNullOrEmpty(item.AppModel?.Description) ? item.AppModel.Name : item.AppModel.Description;
216216 bindModel.Value = item.Time;
217217 bindModel.Tag = Time.ToString(item.Time);
218218 bindModel.PopupText = item.AppModel?.File;
@@ -253,7 +253,7 @@ namespace UI.ViewModels
253253 {
254254 var bindModel = new ChartsDataModel();
255255 bindModel.Data = item;
256删除: bindModel.Name = item.Title;
256新增: bindModel.Name = !string.IsNullOrEmpty(item.Alias) ? item.Alias : item.Title;
257257 bindModel.Value = item.Duration;
258258 bindModel.Tag = Time.ToString(item.Duration);
259259 bindModel.PopupText = item.Domain;
修改UI/ViewModels/DetailPageVM.cs+41 −1看文件
@@ -169,6 +169,9 @@ namespace UI.ViewModels
169169
170170 _setCategoryMenuItem = new MenuItem();
171171 _setCategoryMenuItem.Header = "设置分类";
172新增: MenuItem editAlias = new MenuItem();
173新增: editAlias.Header = "编辑别名";
174新增: editAlias.Click += EditAlias_ClickAsync;
172175
173176 _whiteListMenuItem = new MenuItem();
174177 _whiteListMenuItem.Click += (e, c) =>
@@ -190,6 +193,7 @@ namespace UI.ViewModels
190193 AppContextMenu.Items.Add(reLoadData);
191194 AppContextMenu.Items.Add(new Separator());
192195 AppContextMenu.Items.Add(_setCategoryMenuItem);
196新增: AppContextMenu.Items.Add(editAlias);
193197 AppContextMenu.Items.Add(new Separator());
194198 AppContextMenu.Items.Add(copyProcessName);
195199 AppContextMenu.Items.Add(copyProcessFile);
@@ -199,6 +203,40 @@ namespace UI.ViewModels
199203 AppContextMenu.Items.Add(_whiteListMenuItem);
200204 }
201205
206新增: private async void EditAlias_ClickAsync(object sender, RoutedEventArgs e)
207新增: {
208新增: var app = appData.GetApp(App.ID);
209新增: try
210新增: {
211新增: string input = await _uIServicer.ShowInputModalAsync("修改别名", "请输入别名", app.Alias, (val) =>
212新增: {
213新增: if (string.IsNullOrEmpty(val))
214新增: {
215新增: main.Error("请输入别名");
216新增: return false;
217新增: }
218新增: else if (val.Length > 10)
219新增: {
220新增: main.Error("别名最大长度为10位字符");
221新增: return false;
222新增: }
223新增: return true;
224新增: });
225新增:
226新增: // 开始更新别名
227新增: app.Alias = input;
228新增: appData.UpdateApp(app);
229新增: App = app;
230新增:
231新增: main.Success("别名已更新");
232新增: }
233新增: catch
234新增: {
235新增: // 输入取消,无需处理异常
236新增: }
237新增: }
238新增:
239新增:
202240 private async void ClearAppData_Click(object sender, RoutedEventArgs e)
203241 {
204242 bool isConfirm = await _uIServicer.ShowConfirmDialogAsync("清空确认", "是否确定清空此应用的所有统计数据?");
@@ -227,6 +265,8 @@ namespace UI.ViewModels
227265 _setCategoryMenuItem.Items.Add(categoryMenu);
228266 }
229267
268新增: _setCategoryMenuItem.IsEnabled = _setCategoryMenuItem.Items.Count > 0;
269新增:
230270 if (config.Behavior.ProcessWhiteList.Contains(App.Name))
231271 {
232272 _whiteListMenuItem.Header = "从白名单移除";
@@ -541,7 +581,7 @@ namespace UI.ViewModels
541581 {
542582 var bindModel = new ChartsDataModel();
543583 bindModel.Data = item;
544删除: bindModel.Name = string.IsNullOrEmpty(item.AppModel?.Description) ? item.AppModel.Name : item.AppModel.Description;
584新增: bindModel.Name = !string.IsNullOrEmpty(item.AppModel?.Alias) ? item.AppModel.Alias : string.IsNullOrEmpty(item.AppModel?.Description) ? item.AppModel.Name : item.AppModel.Description;
545585 bindModel.Value = item.Time;
546586 bindModel.Tag = Time.ToString(item.Time);
547587 bindModel.PopupText = item.AppModel.File;
修改UI/ViewModels/IndexPageVM.cs+2 −2看文件
@@ -272,7 +272,7 @@ namespace UI.ViewModels
272272 {
273273 var bindModel = new ChartsDataModel();
274274 bindModel.Data = item;
275删除: bindModel.Name = string.IsNullOrEmpty(item.AppModel?.Description) ? item.AppModel.Name : item.AppModel.Description;
275新增: bindModel.Name = !string.IsNullOrEmpty(item.AppModel?.Alias) ? item.AppModel.Alias : string.IsNullOrEmpty(item.AppModel?.Description) ? item.AppModel.Name : item.AppModel.Description;
276276 bindModel.Value = item.Time;
277277 bindModel.Tag = Time.ToString(item.Time);
278278 bindModel.PopupText = item.AppModel?.File;
@@ -291,7 +291,7 @@ namespace UI.ViewModels
291291 {
292292 var bindModel = new ChartsDataModel();
293293 bindModel.Data = item;
294删除: bindModel.Name = item.Title;
294新增: bindModel.Name = !string.IsNullOrEmpty(item.Alias) ? item.Alias : item.Title;
295295 bindModel.Value = item.Duration;
296296 bindModel.Tag = Time.ToString(item.Duration);
297297 bindModel.PopupText = item.Domain;
修改UI/ViewModels/WebSiteDetailPageVM.cs+42 −1看文件
@@ -150,6 +150,10 @@ namespace UI.ViewModels
150150 _setCategoryMenuItem = new MenuItem();
151151 _setCategoryMenuItem.Header = "设置分类";
152152
153新增: MenuItem editAlias = new MenuItem();
154新增: editAlias.Header = "编辑别名";
155新增: editAlias.Click += EditAlias_ClickAsync;
156新增:
153157 _blockMenuItem = new MenuItem();
154158 _blockMenuItem.Header = "忽略此网站";
155159 _blockMenuItem.Click += _blockMenuItem_Click;
@@ -157,11 +161,48 @@ namespace UI.ViewModels
157161 WebSiteContextMenu.Items.Add(reLoadData);
158162 WebSiteContextMenu.Items.Add(new Separator());
159163 WebSiteContextMenu.Items.Add(_setCategoryMenuItem);
164新增: WebSiteContextMenu.Items.Add(editAlias);
160165 WebSiteContextMenu.Items.Add(new Separator());
161166 WebSiteContextMenu.Items.Add(_blockMenuItem);
162167 WebSiteContextMenu.Items.Add(clear);
163168
164169 }
170新增:
171新增: private async void EditAlias_ClickAsync(object sender, RoutedEventArgs e)
172新增: {
173新增:
174新增:
175新增: try
176新增: {
177新增: string input = await _uIServicer.ShowInputModalAsync("修改别名", "请输入别名", WebSite.Alias, (val) =>
178新增: {
179新增: if (string.IsNullOrEmpty(val))
180新增: {
181新增: _mainVM.Error("请输入别名");
182新增: return false;
183新增: }
184新增: else if (val.Length > 10)
185新增: {
186新增: _mainVM.Error("别名最大长度为10位字符");
187新增: return false;
188新增: }
189新增: return true;
190新增: });
191新增:
192新增: // 开始更新别名
193新增:
194新增: WebSite.Alias = input;
195新增: WebSite = _webData.Update(WebSite);
196新增:
197新增: _mainVM.Success("别名已更新");
198新增: Debug.WriteLine("输入内容:" + input);
199新增: }
200新增: catch
201新增: {
202新增: // 输入取消,无需处理异常
203新增: }
204新增: }
205新增:
165206 private async void ClearData_Click(object sender, RoutedEventArgs e)
166207 {
167208 bool isConfirm = await _uIServicer.ShowConfirmDialogAsync("清空确认", "是否确定清空此站点的所有统计数据?");
@@ -293,7 +334,7 @@ namespace UI.ViewModels
293334 {
294335 new ChartsDataModel()
295336 {
296删除: Name =WebSite.Title,
337新增: Name =!string.IsNullOrEmpty(WebSite.Alias) ? WebSite.Alias :WebSite.Title,
297338 Values = list.Select(m=>m.Value).ToArray(),
298339 ColumnNames= colNames,
299340 Color=StateData.ThemeColor
修改UI/Views/DetailPage.xaml+19 −2看文件
@@ -61,9 +61,26 @@
6161 </StackPanel>
6262 </Border>
6363 </base:View>
64删除: <TextBlock ToolTip="应用描述" Grid.Column="1" Text="{Binding App.Description}" FontSize="18" VerticalAlignment="Center" TextWrapping="WrapWithOverflow"/>
64新增: <base:View Value="{Binding App.Alias}" Condition="not empty">
65新增: <StackPanel>
66新增: <TextBlock ToolTip="别名" Grid.Column="1" Text="{Binding App.Alias}" FontSize="18" VerticalAlignment="Center" TextWrapping="WrapWithOverflow"/>
67新增: <TextBlock FontSize="12" Foreground="Gray" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="0,5,0,0">
68新增: <Run ToolTip="应用进程名称" Text="{Binding App.Name}"></Run>
69新增: <Run>(</Run>
70新增: <Run ToolTip="应用描述" Text="{Binding App.Description}"></Run>
71新增: <Run>)</Run>
72新增:
73新增: </TextBlock>
74新增: </StackPanel>
75新增: </base:View>
76新增: <base:View Value="{Binding App.Alias}" Condition="empty">
77新增: <StackPanel>
78新增: <TextBlock ToolTip="应用描述" Grid.Column="1" Text="{Binding App.Description}" FontSize="18" VerticalAlignment="Center" TextWrapping="WrapWithOverflow"/>
79新增:
80新增: <TextBlock ToolTip="应用进程名称" Text="{Binding App.Name}" FontSize="12" Foreground="Gray" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="0,5,0,0"/>
81新增: </StackPanel>
82新增: </base:View>
6583
66删除: <TextBlock ToolTip="应用进程名称" Text="{Binding App.Name}" FontSize="12" Foreground="Gray" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="0,5,0,0"/>
6784 <TextBlock ToolTip="应用文件路径" Foreground="Gray" Text="{Binding App.File}" Margin="0,5,0,0" TextWrapping="WrapWithOverflow"/>
6885 <!--分类-->
6986
修改UI/Views/WebSiteDetailPage.xaml+19 −3看文件
@@ -37,9 +37,25 @@
3737 </StackPanel>
3838 </Border>
3939 </base:View>
40删除:
41删除: <TextBlock ToolTip="网站名称" Text="{Binding WebSite.Title}" FontSize="18" VerticalAlignment="Center" TextWrapping="WrapWithOverflow"/>
42删除: <TextBlock ToolTip="域名" Text="{Binding WebSite.Domain}" FontSize="12" Foreground="Gray" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="0,0,0,0"/>
40新增: <base:View Value="{Binding WebSite.Alias}" Condition="not empty">
41新增: <StackPanel>
42新增: <TextBlock ToolTip="别名" Grid.Column="1" Text="{Binding WebSite.Alias}" FontSize="18" VerticalAlignment="Center" TextWrapping="WrapWithOverflow"/>
43新增: <TextBlock FontSize="12" Foreground="Gray" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="0,5,0,0">
44新增: <Run ToolTip="域名" Text="{Binding WebSite.Domain}"></Run>
45新增: <Run>(</Run>
46新增: <Run ToolTip="网站名称" Text="{Binding WebSite.Title}"></Run>
47新增: <Run>)</Run>
48新增:
49新增: </TextBlock>
50新增: </StackPanel>
51新增: </base:View>
52新增: <base:View Value="{Binding WebSite.Alias}" Condition="empty">
53新增: <StackPanel>
54新增: <TextBlock ToolTip="网站名称" Text="{Binding WebSite.Title}" FontSize="18" VerticalAlignment="Center" TextWrapping="WrapWithOverflow"/>
55新增: <TextBlock ToolTip="域名" Text="{Binding WebSite.Domain}" FontSize="12" Foreground="Gray" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="0,0,0,0"/>
56新增: </StackPanel>
57新增: </base:View>
58新增:
4359 <base:View Condition="not null" Value="{Binding Category}" HorizontalAlignment="Left">
4460 <select:Select Margin="0,10,0,0" ToolTip="网站分类" SelectedItem="{Binding Category,Mode=TwoWay}" Options="{Binding Categories}" Padding="10,0" Height="30"/>
4561