Exemple #1
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;
            }
        }
        Paginate <X>(this ISingleHeaderedGridPage <X> @this, Size pageSize)
        {
            var presenter =
                new ContentPresenter()
            {
                Content = @this,
                Width   = pageSize.Width,
                Height  = pageSize.Height,
            };

            presenter.Measure(pageSize);
            presenter.Arrange(new Rect(new Point(0, 0), pageSize));
            presenter.UpdateLayout();

            var headeredGrid =
                presenter.VisualDescendantsBreadthFirstOrder().OfType <HeaderedGrid>().First();

            var scrollViewer = headeredGrid.ScrollViewer;
            var grid         = headeredGrid.Grid;

            var items = @this.Items;
            var index = 0;

            while (index < items.Count)
            {
                // Count the visible rows.
                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("Because of too large header row or too small height, the page can't show any rows.");
                }

                yield return
                    (Enumerable.Range(index, count).Select(i => items[i]).ToArray());

                if (index + count < items.Count)
                {
                    // Hide visible rows.
                    foreach (var i in Enumerable.Range(index, count))
                    {
                        grid.RowDefinitions[1 + i].MaxHeight = 0.0;
                    }

                    // Update UI properties, including scrollViewer.ViewportHeight.
                    presenter.UpdateLayout();
                }

                index += count;
            }
        }