跳到主要内容

github/tai

公开

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

提交记录
修改UI/Controls/PageContainer.cs+124 −20看文件
@@ -13,6 +13,14 @@ namespace UI.Controls
1313 public class PageContainer : Control
1414 {
1515 #region 依赖属性
16新增: public List<string> IndexUriList
17新增: {
18新增: get { return (List<string>)GetValue(IndexUriListProperty); }
19新增: set { SetValue(IndexUriListProperty, value); }
20新增: }
21新增: public static readonly DependencyProperty IndexUriListProperty =
22新增: DependencyProperty.Register("IndexUriList", typeof(List<string>), typeof(PageContainer));
23新增:
1624 public string Title
1725 {
1826 get { return (string)GetValue(TitleProperty); }
@@ -93,12 +101,22 @@ namespace UI.Controls
93101 DependencyProperty.Register("BackCommand",
94102 typeof(Command),
95103 typeof(PageContainer));
104新增:
105新增:
106新增: public PageContainer Instance { get { return (PageContainer)GetValue(InstanceProperty); } set { SetValue(InstanceProperty, value); } }
107新增:
108新增: public static readonly DependencyProperty InstanceProperty = DependencyProperty.Register("Instance", typeof(PageContainer), typeof(PageContainer));
96109 #endregion
97110
111新增: /// <summary>
112新增: /// 加载页面完成后发生
113新增: /// </summary>
114新增: public event EventHandler OnLoadPaged;
115新增:
98116 private readonly string ProjectName;
99117 private List<string> Historys;
100删除: private int Index = -1, OldIndex = -1;
101删除: private Frame Frame;
118新增: public int Index = 0, OldIndex = 0;
119新增: private Dictionary<string, object> PageCache;
102120 public PageContainer()
103121 {
104122 DefaultStyleKey = typeof(PageContainer);
@@ -107,40 +125,97 @@ namespace UI.Controls
107125 BackCommand = new Command(new Action<object>(OnBackCommand));
108126 NavigationCommands.BrowseBack.InputGestures.Clear();
109127 NavigationCommands.BrowseForward.InputGestures.Clear();
128新增: PageCache = new Dictionary<string, object>();
129新增: }
130新增: public override void OnApplyTemplate()
131新增: {
132新增: base.OnApplyTemplate();
133新增:
134新增: Loaded += PageContainer_Loaded;
135新增: }
136新增:
137新增: private void PageContainer_Loaded(object sender, RoutedEventArgs e)
138新增: {
139新增: Instance = this;
110140 }
111141
112142 private void OnBackCommand(object obj)
143新增: {
144新增: Back();
145新增: }
146新增:
147新增: public void Back()
113148 {
114149 if (Index - 1 >= 0)
115150 {
116151 OldIndex = Index;
117152 Index--;
118删除: Uri = Historys[Index];
119删除: Historys.RemoveRange(Index + 1, Historys.Count - (Index + 1));
153新增: string uri = Historys[Index];
154新增:
155新增: int preIndex = Index + 1;
156新增: int count = Historys.Count - (Index + 1);
157新增: // 从缓存中移除之前的页面
158新增: for (int i = preIndex; i < count; i++)
159新增: {
160新增: var pageUri = Historys[i];
161新增: if (PageCache.ContainsKey(pageUri))
162新增: {
163新增: var page = PageCache[pageUri];
164新增: page = null;
165新增: PageCache.Remove(pageUri);
166新增: }
167新增: }
168新增:
169新增: // 历史记录中移除
170新增: Historys.RemoveRange(preIndex, count);
171新增:
172新增: Uri = uri;
173新增:
174新增:
175新增:
120176 }
121177 }
122178
179新增: public void ClearHistorys()
180新增: {
181新增: Historys.Clear();
182新增: }
123183 private void LoadPage()
124184 {
125185 if (Uri != string.Empty)
126186 {
127删除:
187新增: Page page = null;
188新增: var pageVM = GetPageVM(Uri);
128189 Type pageType = Type.GetType(ProjectName + ".Views." + Uri);
129删除: Type pageVMType = Type.GetType(ProjectName + ".ViewModels." + Uri + "VM");
130190 if (pageType != null && ServiceProvider != null)
131191 {
132删除: var page = ServiceProvider.GetService(pageType) as Page;
192新增: page = ServiceProvider.GetService(pageType) as Page;
133193 if (page != null)
134194 {
135删除: if (pageVMType != null)
136删除: {
137删除: var pageVM = ServiceProvider.GetService(pageVMType);
138删除: if (pageVM != null)
139删除: {
140删除: page.DataContext = pageVM;
141删除: }
142删除: }
143删除: Content = page;
195新增:
196新增: page.DataContext = pageVM;
197新增:
198新增: }
199新增:
200新增: }
201新增:
202新增: if (page != null)
203新增: {
204新增:
205新增: Content = page;
206新增:
207新增:
208新增:
209新增: if (IndexUriList != null && IndexUriList.Contains(Uri))
210新增: {
211新增: Historys.Clear();
212新增: Index = 0;
213新增: OldIndex = 0;
214新增: Historys.Add(Uri);
215新增: PageCache.Clear();
216新增: }
217新增: else
218新增: {
144219 //处理历史记录
145220 if (OldIndex == Index)
146221 {
@@ -150,13 +225,42 @@ namespace UI.Controls
150225 }
151226 OldIndex = Index;
152227 }
153删除: else
154删除: {
155删除: Debug.WriteLine("找不到Page:" + Uri + ",请确认已被注入");
156删除: }
157228
229新增: // 加入缓存
230新增: PageCache.Add(Uri, pageVM);
231新增:
232新增: OnLoadPaged?.Invoke(this, EventArgs.Empty);
233新增: }
234新增: else
235新增: {
236新增: Debug.WriteLine("找不到Page:" + Uri + ",请确认已被注入");
158237 }
159238
239新增:
240新增: }
241新增: }
242新增:
243新增:
244新增: private object GetPageVM(string uri)
245新增: {
246新增: if (PageCache.ContainsKey(uri))
247新增: {
248新增: return PageCache[uri];
249新增: }
250新增: else
251新增: {
252新增: Type pageVMType = Type.GetType(ProjectName + ".ViewModels." + Uri + "VM");
253新增: if (ServiceProvider != null && pageVMType != null)
254新增: {
255新增:
256新增: var pageVM = ServiceProvider.GetService(pageVMType);
257新增:
258新增: return pageVM;
259新增: }
260新增: else
261新增: {
262新增: return null;
263新增: }
160264 }
161265 }
162266 }
修改UI/Controls/Window/DefaultWindow.cs+55 −2看文件
@@ -18,11 +18,29 @@ namespace UI.Controls.Window
1818 {
1919 #region 1.依赖属性
2020
21删除:
21新增: public static readonly DependencyProperty PageContainerProperty = DependencyProperty.Register("PageContainer", typeof(PageContainer), typeof(DefaultWindow), new PropertyMetadata(null, new PropertyChangedCallback(OnPageContainerChanged)));
22新增: public PageContainer PageContainer { get { return (PageContainer)GetValue(PageContainerProperty); } set { SetValue(PageContainerProperty, value); } }
2223 #region 最小化按钮显示状态
2324
2425 public static readonly DependencyProperty MinimizeVisibilityProperty = DependencyProperty.Register("MinimizeVisibility", typeof(Visibility), typeof(DefaultWindow));
2526
27新增: private static void OnPageContainerChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
28新增: {
29新增: var that = (DefaultWindow)d;
30新增: if (that != null)
31新增: {
32新增: if (e.NewValue != null)
33新增: {
34新增: that.IsCanBack = that.PageContainer.Index >= 1;
35新增:
36新增: that.PageContainer.OnLoadPaged += (s, v) =>
37新增: {
38新增: that.IsCanBack = that.PageContainer.Index >= 1;
39新增: };
40新增: }
41新增: }
42新增: }
43新增:
2644 /// <summary>
2745 /// 最小化按钮显示状态
2846 /// </summary>
@@ -88,6 +106,30 @@ namespace UI.Controls.Window
88106 set { SetValue(IsThruWindowProperty, value); }
89107 }
90108 #endregion
109新增:
110新增:
111新增: public static readonly DependencyProperty IsCanBackProperty = DependencyProperty.Register("IsCanBack", typeof(bool), typeof(DefaultWindow), new PropertyMetadata(false,new PropertyChangedCallback(OnIsCanBackChanged)));
112新增:
113新增: private static void OnIsCanBackChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
114新增: {
115新增: var that=d as DefaultWindow;
116新增: if (that != null)
117新增: {
118新增: if (that.IsCanBack)
119新增: {
120新增: VisualStateManager.GoToState(that, "CanBackState", true);
121新增: }
122新增: else
123新增: {
124新增: VisualStateManager.GoToState(that, "Normal", true);
125新增: }
126新增: }
127新增: }
128新增:
129新增: /// <summary>
130新增: /// 是否可以返回
131新增: /// </summary>
132新增: public bool IsCanBack { get { return (bool)GetValue(IsCanBackProperty); } set { SetValue(IsCanBackProperty, value); } }
91133 #endregion
92134
93135 private bool IsWindowClosed_ = false;
@@ -107,6 +149,7 @@ namespace UI.Controls.Window
107149 this.CommandBindings.Add(new CommandBinding(DefaultWindowCommands.MaximizeWindowCommand, OnMaximizeWindowCommand));
108150 this.CommandBindings.Add(new CommandBinding(DefaultWindowCommands.RestoreWindowCommand, OnRestoreWindowCommand));
109151 this.CommandBindings.Add(new CommandBinding(DefaultWindowCommands.CloseWindowCommand, OnCloseWindowCommand));
152新增: this.CommandBindings.Add(new CommandBinding(DefaultWindowCommands.BackCommand, OnBackCommand));
110153
111154 // 获取程序图标
112155 if (Icon == null)
@@ -116,8 +159,18 @@ namespace UI.Controls.Window
116159 }
117160
118161 Loaded += new RoutedEventHandler(window_Loaded);
162新增: }
119163
120删除:
164新增: private void OnBackCommand(object sender, ExecutedRoutedEventArgs e)
165新增: {
166新增: if (PageContainer != null)
167新增: {
168新增: PageContainer.Back();
169新增: if (PageContainer.Index == 0)
170新增: {
171新增: IsCanBack = false;
172新增: }
173新增: }
121174 }
122175
123176 [DllImport("gdi32.dll", SetLastError = true)]
修改UI/Controls/Window/DefaultWindowCommands.cs+2 −0看文件
@@ -15,5 +15,7 @@ namespace UI.Controls.Window
1515 public static RoutedUICommand CloseWindowCommand { get; } = new RoutedUICommand("", "CloseWindowCommand", typeof(DefaultWindowCommands));
1616
1717 public static RoutedUICommand LogoButtonClickCommand { get; } = new RoutedUICommand("", "LogoButtonClickCommand", typeof(DefaultWindowCommands));
18新增: public static RoutedUICommand BackCommand { get; } = new RoutedUICommand("", "BackCommand", typeof(DefaultWindowCommands));
19新增:
1820 }
1921}
修改UI/MainWindow.xaml+5 −3看文件
@@ -10,7 +10,9 @@
1010 xmlns:control="clr-namespace:UI.Controls"
1111 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
1212 xmlns:Navigation="clr-namespace:UI.Controls.Navigation"
13删除: x:Name="Window">
13新增: x:Name="Window"
14新增: PageContainer="{Binding PageContainer}"
15新增: Icon="/Resources/Icons/tai32.ico">
1416 <Grid>
1517 <!--主要功能-->
1618 <Grid>
@@ -33,12 +35,12 @@
3335 <Navigation:Navigation.BottomExtContent>
3436 <Navigation:NavigationItem Icon="Settings" Title="设置" Uri="SettingsPage" Command="{Binding GotoPageCommand}" CommandParameter="SettingPage"/>
3537 </Navigation:Navigation.BottomExtContent>
36删除:
38新增:
3739 </Navigation:Navigation>
3840
3941 <Border Grid.Column="1" Background="#f9f9f9" Margin="0,40,10,10" CornerRadius="5" BorderThickness="1,1,1,1" BorderBrush="#ccc">
4042 <ScrollViewer VerticalScrollBarVisibility="Auto">
41删除: <control:PageContainer ServiceProvider="{Binding ServiceProvider}" Uri="{Binding Uri,Mode=TwoWay}" Title="{Binding Title}" IsShowTilteBar="{Binding IsShowTitleBar,Mode=TwoWay}"/>
43新增: <control:PageContainer IndexUriList="{Binding IndexUriList}" Instance="{Binding PageContainer,Mode=TwoWay}" ServiceProvider="{Binding ServiceProvider}" Uri="{Binding Uri,Mode=TwoWay}" Title="{Binding Title}" IsShowTilteBar="{Binding IsShowTitleBar,Mode=TwoWay}"/>
4244 </ScrollViewer>
4345 </Border>
4446
修改UI/Models/MainWindowModel.cs+7 −0看文件
@@ -4,6 +4,7 @@ using System.Collections.ObjectModel;
44using System.Linq;
55using System.Text;
66using System.Threading.Tasks;
7新增:using UI.Controls;
78using UI.Controls.Navigation.Models;
89
910namespace UI.Models
@@ -70,5 +71,11 @@ namespace UI.Models
7071 get { return NavSelectedItem_; }
7172 set { NavSelectedItem_ = value; OnPropertyChanged(); }
7273 }
74新增:
75新增: private PageContainer PageContainer_;
76新增: public PageContainer PageContainer { get { return PageContainer_; } set { PageContainer_ = value; OnPropertyChanged(); } }
77新增:
78新增: private List<string> IndexUriList_;
79新增: public List<string> IndexUriList { get { return IndexUriList_; } set { IndexUriList_ = value; OnPropertyChanged(); } }
7380 }
7481}
修改UI/Themes/Window/DefaultWindow.xaml+27 −4看文件
@@ -1,6 +1,6 @@
11<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
22 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
3删除: xmlns:w="clr-namespace:UI.Controls.Window">
3新增: xmlns:w="clr-namespace:UI.Controls.Window" xmlns:button="clr-namespace:UI.Controls.Button">
44 <Style x:Key="WindowSystemButton" TargetType="{x:Type Button}">
55 <Setter Property="Background" Value="Transparent"/>
66 <Setter Property="OverridesDefaultStyle" Value="True"/>
@@ -106,8 +106,11 @@
106106 Panel.ZIndex="3">
107107 <!--标题区域-->
108108 <StackPanel Orientation="Horizontal" Margin="15,0,0,0" VerticalAlignment="Center" HorizontalAlignment="Center">
109删除: <Image Source="{TemplateBinding Icon}" Stretch="Uniform" Width="18"/>
110删除: <TextBlock Text="{TemplateBinding Title}" IsEnabled="{TemplateBinding IsActive}" Foreground="#5c5c5c" Margin="15,0,0,0"/>
109新增:
110新增: <button:IconButton Width="0" VerticalAlignment="Center" ToolTip="返回" FontSize="10" x:Name="BackBtn" Icon="Back" WindowChrome.IsHitTestVisibleInChrome="True" Command="{x:Static w:DefaultWindowCommands.BackCommand}"/>
111新增:
112新增: <Image Source="{TemplateBinding Icon}" VerticalAlignment="Center" Stretch="Uniform" Width="18"/>
113新增: <TextBlock VerticalAlignment="Center" Text="{TemplateBinding Title}" IsEnabled="{TemplateBinding IsActive}" Foreground="#5c5c5c" Margin="15,0,0,0"/>
111114 </StackPanel>
112115 <!--<TextBlock Text="{TemplateBinding Title}" IsEnabled="{TemplateBinding IsActive}" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="15,0,0,0"/>-->
113116
@@ -172,6 +175,24 @@
172175 </Grid>
173176 </AdornerDecorator>
174177 </Border>
178新增: <VisualStateManager.VisualStateGroups>
179新增: <VisualStateGroup x:Name="CommonStates">
180新增: <VisualStateGroup.Transitions>
181新增: <VisualTransition GeneratedDuration="0:0:.15" />
182新增: <VisualTransition GeneratedDuration="0"
183新增: To="Pressed" />
184新增: </VisualStateGroup.Transitions>
185新增: <VisualState x:Name="Normal" />
186新增: <VisualState x:Name="CanBackState">
187新增: <Storyboard >
188新增: <DoubleAnimation Storyboard.TargetProperty="(Button.Width)"
189新增: Storyboard.TargetName="BackBtn" To="35" Duration="0:0:.1">
190新增: </DoubleAnimation>
191新增: </Storyboard>
192新增: </VisualState>
193新增:
194新增: </VisualStateGroup>
195新增: </VisualStateManager.VisualStateGroups>
175196 </Border>
176197 <ControlTemplate.Triggers>
177198 <MultiTrigger>
@@ -188,7 +209,9 @@
188209 <Setter TargetName="MaximizeButton" Property="Visibility" Value="Collapsed" />
189210 <Setter TargetName="RestoreButton" Property="Visibility" Value="Visible" />
190211 </Trigger>
191删除:
212新增: <!--<Trigger Property="IsCanBack" Value="True">
213新增: <Setter TargetName="BackBtn" Property="Visibility" Value="Visible" />
214新增: </Trigger>-->
192215 <!--<Trigger Property="WindowState" Value="Normal">
193216 <Setter TargetName="MaximizeButton" Property="Visibility" Value="Visible" />
194217 <Setter TargetName="RestoreButton" Property="Visibility" Value="Collapsed" />
修改UI/ViewModels/MainViewModel.cs+5 −0看文件
@@ -68,6 +68,11 @@ namespace UI.ViewModels
6868
6969 private void InitNavigation()
7070 {
71新增: IndexUriList = new List<string>();
72新增: IndexUriList.Add(nameof(IndexPage));
73新增: IndexUriList.Add(nameof(DataPage));
74新增:
75新增:
7176 Items.Add(new Controls.Navigation.Models.NavigationItemModel()
7277 {
7378 Icon = Controls.Base.IconTypes.AppIconDefaultList,