protected override void RowRender(int index, double top, DrawingContext dc) { foreach (var item in Element.GetItems(index, GetViewRange())) { var block = item as ITerm; if (block == null) continue; if (OutOfVisualRange(block)) continue; var rect = block.Start.Date.ToRect(Element.AxisXConverter, top, Element.BlockConverter.GetHeight(block)); if (Element.BlockConverter.IsDirty(block)) dc.DrawRectangle(Background, null, rect.SetMargin(new Thickness(0, 0, 0, 1))); dc.DrawCenterText(Element.BlockConverter.GetContentText(block), rect, Element.BlockConverter.GetForeground(block)); } //var itemsSource = Element.ItemsSource; //var axisXConverter = Element.AxisXConverter; //var blockConverter = Element.BlockConverter; //var screenStart = axisXConverter.ScreenToData(0); //var screenEnd = axisXConverter.ScreenToData(Element.RenderSize.Width); //var terms = itemsSource[index]; //if (terms == null) return; //foreach (var item in terms) //{ // var block = item as ITerm; // if (block == null) // continue; // var blockStart = block.Start; // var blockEnd = block.End; // if (blockStart > screenEnd || blockEnd < screenStart) // continue; // var blockLeft = axisXConverter.DataToScreen(blockStart); // var blockRight = axisXConverter.DataToScreen(blockEnd); // var blockHeight = Element.Interval; // var blockTop = 0; // //new Pen(Brushes.Black,1) // var rect = new Rect(blockLeft, blockTop, blockRight - blockLeft, blockHeight); // context.DrawRectangle(blockConverter.GetBackground(block), null, rect); // //班名 // var text = blockConverter.GetContentText(block); //DrawCenterText(text, "/", blockConverter.FontSize, rect, Brushes.Black, context); //} }
protected override void RowRender(int index, double top, DrawingContext dc) { var viewRange = GetViewRange(); var height = Element.Interval; Element.GetItems(index, viewRange).SaftyInvoke<IDateIndexer<ITerm>>(o => { var day = viewRange.Start.Date; var end = viewRange.End.Date; while (day < end) { var block = o[day]; if (block != null) { var foreground = Element.BlockConverter.GetForeground(block); var rect = day.ToRect(Element.AxisXConverter, top, height); var dateTerm = Element.ItemsSource[index].SaftyGetProperty<DateTerm, IDateIndexer<DateTerm>>(t => t[day]); if (dateTerm != null && Background != Brushes.Transparent && Background != null) { // dc.DrawGuidelineRect(null, _pen, rect.SetMargin(new Thickness(0, -1, 0, 1))); dc.DrawRectangle( Element.BlockConverter.GetBackground(block) ?? Background, null, rect.SetMargin(new Thickness(1, 0, 0, 0.5))); //like dirty cell } if (dateTerm != null && !string.IsNullOrEmpty(dateTerm.Text)) { dc.DrawCenterText(dateTerm.Text, rect, foreground); } else { var text = Element.BlockConverter.GetContentText(block); if (!string.IsNullOrEmpty(text)) { FormattedText formattedText; if (!_formatedTextCaches.ContainsKey(text)) { formattedText = text.ToFormattedText(foreground); var charWidth = formattedText.Width / text.Length; if (formattedText.Width > rect.Width) { var maxChar = (int)(rect.Width / charWidth); formattedText = text.Substring(0, maxChar).ToFormattedText(foreground); } _formatedTextCaches[text] = new Tuple<FormattedText, double>(formattedText, ((rect.Height - formattedText.Baseline) / 2)); } else formattedText = _formatedTextCaches[text].Item1; var horizontailMargin = (rect.Width - formattedText.Width) / 2; //margin left & right //Item1 = formatedText , Item2 = top margin if(dateTerm==null) Element.BlockConverter.GetBackground(block).SaftyInvoke( b => dc.DrawRectangle(b, null, rect.SetMargin(new Thickness(1, 0, 0, 0.5)))); dc.DrawText(formattedText, new Point(rect.Left + horizontailMargin, rect.Top + _formatedTextCaches[text].Item2)); } } } day = day.AddDays(1); } }); //Element.ItemsSource[index].SaftyInvoke<IDateIndexer<DateTerm>>(o => //{ // var viewRange = GetViewRange(); // var day = viewRange.Start.Date; // var end = viewRange.End.Date.AddDays(1); // while (day < end) // { // var dateTerm = o[day]; // if (dateTerm != null) // { // var rect = dateTerm.Date.ToRect(Element.AxisXConverter, 0, Element.Interval); // dc.DrawRectangle(Background, null, rect.SetMargin(new Thickness(0, 0, 0, 1))); // dc.DrawCenterText(dateTerm.Text, rect, Brushes.White); // } // day = day.AddDays(1); // } //}); //Element.ItemsSource[index].SaftyInvoke<IDateIndexer<DateTerm>>(o => //{ // var viewRange = GetViewRange(); // var day = viewRange.Start.Date; // var end = viewRange.End.Date.AddDays(1); // while (day < end) // { // var dateTerm = o[day]; // if (dateTerm != null) // { // var rect = dateTerm.Date.ToRect(Element.AxisXConverter, 0, Element.Interval); // dc.DrawRectangle(Background, null, rect.SetMargin(new Thickness(0, 0, 0, 1))); // } // day = day.AddDays(1); // } //}); //foreach (var item in Element.GetItems(index, GetViewRange())) //{ // var block = item as ITerm; // if (block == null) // continue; // if (OutOfVisualRange(block)) continue; // //注意 HrDate // var foreground = Element.BlockConverter.GetForeground(block); // var date = Element.BlockConverter.GetStart(block); // var rect = date.ToRect(Element.AxisXConverter, 0, Element.BlockConverter.GetHeight(block)); // var dateTerm = Element.ItemsSource[index].SaftyGetProperty<DateTerm, IDateIndexer<DateTerm>>(o => o[date]); // if (dateTerm != null && Background != Brushes.Transparent && Background != null) // dc.DrawRectangle(Background, null, rect.SetMargin(new Thickness(0, 0, 0, 1))); // if (dateTerm != null && !string.IsNullOrEmpty(dateTerm.Text)) // { // dc.DrawCenterText(dateTerm.Text, rect, foreground); // } // else // dc.DrawCenterText(Element.BlockConverter.GetContentText(block), rect, foreground); //} }