Exemple #1
0
        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);
        }
Exemple #2
0
        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;
            }
        }