/// <summary> /// 返回所有的事件记录中含有比 rect 的日期还要早的记录。 /// </summary> /// <param name="entries">存储事件链的模型类</param> /// <param name="rect">用于日期比较的目标方块</param> /// <returns></returns> private static List<StatistTotalByDateTime> EarlierThanEarliestRectangle(List<StatistTotalByDateTime> entries, Rectangle rect) { List<StatistTotalByDateTime> earlierThanEarliestRectangleLik = new List<StatistTotalByDateTime>(); foreach (var item in entries) { if (item.DateTime < DatetimeParser.ParseExpressToDateTime(rect.Name, DateMode.DateWithSlash)) { earlierThanEarliestRectangleLik.Add(item); } } return earlierThanEarliestRectangleLik; }
/// <summary> /// 筛选出没有在当前 RectanglesCanvas 面板中显示的、日期更久远的记录, /// 然后根据这些记录在 StackCanvas 面板中生成新的方块面板,接着在这些 /// 新生成的面板中着色日期更久远的记录。 /// </summary> private void ExtendStackCanvasByFilterOldRecorders(List<StatistTotalByDateTime> oldRecorders, Rectangle earliestRectangle, int canvasOrdinal = 1) { Canvas oldRectanglesCanvas = new Canvas() { Name = $"OldRectanglesCanvas_{canvasOrdinal}" }; Rectangle oldRect = this.RectanglesLayout(oldRectanglesCanvas, DatetimeParser.ParseExpressToDateTime(earliestRectangle.Name, DateMode.DateWithSlash).AddDays(-1)); DateTag(oldRectanglesCanvas); this.StackCanvas.Children.Insert(0, oldRectanglesCanvas); List<StatistTotalByDateTime> newOldRecorders = EarlierThanEarliestRectangle(oldRecorders, oldRect); if (newOldRecorders.Count > 0) { ExtendStackCanvasByFilterOldRecorders(newOldRecorders, oldRect, canvasOrdinal + 1); } }
/// <summary> /// 给相应的 Rectangle 标记上日期和星期数 /// </summary> /// <param name="canvas"></param> private static void DateTag(Canvas canvas) { /* * 下面的查询语句用来提取画布中最左侧的一列方块(res1)和最上侧的一行方块(res2), * 然后将这些方块标记上星期数和月份 */ IEnumerable<IGrouping<double, UIElement>> leftGroup = from rect in canvas.Children group rect by Canvas.GetLeft(rect); IEnumerable<IGrouping<double, UIElement>> topGroup = from rect in canvas.Children group rect by Canvas.GetTop(rect); double minLeftGroupKey = leftGroup.Min(group => group.Key); double minTopGroupKey = topGroup.Min(group => group.Key); IGrouping<double, UIElement> res1 = (from g in leftGroup where g.Key == minLeftGroupKey select g).First(); IGrouping<double, UIElement> res2 = (from g in topGroup where g.Key == minTopGroupKey select g).First(); /* * 给周一、周三、周五的方块打上标记 Mon、Wed、Fri */ foreach (Rectangle rect in res1) { if (DatetimeParser.ParseExpressToDateTime((rect as Rectangle).Name, DateMode.DateWithSlash).DayOfWeek == DayOfWeek.Monday || DatetimeParser.ParseExpressToDateTime((rect as Rectangle).Name, DateMode.DateWithSlash).DayOfWeek == DayOfWeek.Wednesday || DatetimeParser.ParseExpressToDateTime((rect as Rectangle).Name, DateMode.DateWithSlash).DayOfWeek == DayOfWeek.Friday) { var tbx = new TextBlock() { Text = DatetimeParser.ParseExpressToDateTime((rect as Rectangle).Name, DateMode.DateWithSlash).DayOfWeek.ToString().Substring(0, 3), FontSize = 10, Foreground = new SolidColorBrush(Windows.UI.Colors.Gray) }; Canvas.SetLeft(tbx, Canvas.GetLeft(rect) - 30); Canvas.SetTop(tbx, Canvas.GetTop(rect)); canvas.Children.Add(tbx); } } /* * 给每个月份开头的方块打上标记,从 Jan 到 Dec */ Rectangle previous = null; foreach (Rectangle rect in res2.Reverse()) { void setTopTag(string text) { var tbx = new TextBlock() { Text = text, FontSize = 10, Foreground = new SolidColorBrush(Windows.UI.Colors.Gray) }; Canvas.SetLeft(tbx, Canvas.GetLeft(rect)); Canvas.SetTop(tbx, Canvas.GetTop(rect) - 15); canvas.Children.Add(tbx); } if (previous == null) { setTopTag(DatetimeParser.NumberToMonth(DatetimeParser.ParseExpressToDateTime(rect.Name, DateMode.DateWithSlash).Month)); } else { int monthOfPreviousRectangle = DatetimeParser.ParseExpressToDateTime(previous.Name, DateMode.DateWithSlash).Month; int monthOfCurrentRectangle = DatetimeParser.ParseExpressToDateTime(rect.Name, DateMode.DateWithSlash).Month; if (monthOfCurrentRectangle != monthOfPreviousRectangle) { setTopTag(DatetimeParser.NumberToMonth(DatetimeParser.ParseExpressToDateTime(rect.Name, DateMode.DateWithSlash).Month)); } } previous = rect; } }