public IReadOnlyList <object> Paginate(Size size) { var pages = new OrderFormPage(Header, Items) .Paginate(size) .Select(items => new OrderFormPage(Header, items)) .ToArray(); // 各ページのページ番号・ページ数を設定する。 var pageIndex = 1; foreach (var page in pages) { page.PageIndex = pageIndex; page.PageCount = pages.Length; pageIndex++; } return(pages); }
public IEnumerable <OrderFormPage> PaginateCore(Size size) { // ページネーションを行うために、実際に DataGrid を生成する。 var preview = new OrderFormPage(Header, Items); var presenter = new ContentPresenter() { Content = preview, Width = size.Width, Height = size.Height, }; presenter.Measure(size); presenter.Arrange(new Rect(new Point(0, 0), size)); presenter.UpdateLayout(); var headeredGrid = presenter.VisualDescendantsBreadthFirstOrder().OfType <HeaderedGrid>().First(); var scrollViewer = headeredGrid.ScrollViewer; var grid = headeredGrid.Grid; var items = preview.Items; var index = 0; while (index < items.Count) { // 表示されている行数を計算する。 var totalRowHeight = grid.RowDefinitions[0].ActualHeight; var count = 0; while (index + count < items.Count) { totalRowHeight += grid.RowDefinitions[1 + index + count].ActualHeight; if (totalRowHeight > scrollViewer.ViewportHeight) { break; } count++; } if (count == 0) { // ヘッダー行が大きすぎてコンテンツを表示できていない。 throw new Exception(); } var pageItems = Enumerable.Range(index, count).Select(i => items[i]).ToArray(); // 1画面に表示できた行からなるページを追加する。 yield return(new OrderFormPage(Header, pageItems)); if (index + count < items.Count) { // いまのページに追加された分の行を非表示 (高さ 0) にする。 foreach (var i in Enumerable.Range(index, count)) { grid.RowDefinitions[1 + i].MaxHeight = 0.0; } // scrollViewer.ViewportHeight を更新する。 presenter.UpdateLayout(); } index += count; } }