2

我在 Windows 8 中使用新的 Metro 设计时遇到了一些问题。我正在构建简单的电子阅读器应用程序,并且想要使用两列页面。所以,我的选择是有溢出的 FlipView 和 RichTextBlock。但是加了两页后,overflow 就没有溢出内容了!所以我只有三页。但是文字很大。我有这样的代码:

     private async void CreatePages()
    {
        _pages = new List<UIElement>();

        _pageCount = 1;

        _lastOverflow = AddOnePage(null, _pageCount);

        while (_lastOverflow.HasOverflowContent) //It's here!!
        {
            _pageCount++;

            _lastOverflow = AddOnePage(_lastOverflow, _pageCount);

            View.UpdateLayout();
        }

        for (var i = 1; i <= _pageCount; i++)
        {
            var scrollViewer = new ScrollViewer
            {
                Margin = new Thickness(10, 30, 10, 30),
                HorizontalContentAlignment = HorizontalAlignment.Stretch,
                ZoomMode = ZoomMode.Enabled,
                VerticalScrollMode = ScrollMode.Enabled,
                HorizontalScrollMode = ScrollMode.Disabled,
                Name = "Scroll" + i
            };

            var snappedBlock = new RichTextBlock
            {
                VerticalAlignment = VerticalAlignment.Center,
                HorizontalAlignment = HorizontalAlignment.Center,
                TextWrapping = TextWrapping.Wrap,
                IsTextSelectionEnabled = true
            };

            foreach (var text in new string[0])
            {
                var paragraph = new Paragraph();
                paragraph.Inlines.Add(new Run { Text = text });
                snappedBlock.Blocks.Add(paragraph);
            }

            scrollViewer.Content = snappedBlock;

            SnappedView.Items.Add(scrollViewer);
        }
    }

    private RichTextBlockOverflow AddOnePage(RichTextBlockOverflow lastOverflow, int pageNumber)
    {
        // Create a grid which represents the page 
        var grid = new Grid
                       {
                           Name = "Grid" + pageNumber
                       };

        grid.ColumnDefinitions.Add(new ColumnDefinition
                                       {
                                           Width = new GridLength(1, GridUnitType.Star)
                                       });
        grid.ColumnDefinitions.Add(new ColumnDefinition
                                       {
                                           Width = new GridLength(1, GridUnitType.Star)
                                       });

        var grid1 = new Grid
                        {
                            Name = "Grid1_" + pageNumber
                        };
        var grid2 = new Grid
        {
            Name = "Grid2_" + pageNumber
        };
        grid1.SetValue(Grid.ColumnProperty, 0);
        grid2.SetValue(Grid.ColumnProperty, 1);

        grid.Children.Add(grid1);
        grid.Children.Add(grid2);

        View.Items.Add(grid);

        // If lastRTBOAdded is null then we know we are creating the first page. 
        var isFirstPage = lastOverflow == null;

        RichTextBlockOverflow richTextBlockOverflow = null;

        if (isFirstPage)
        {
            var overflow = new RichTextBlockOverflow
                               {
                                   Margin = new Thickness(20, 30, 70, 30),
                                   Name = "SecondBlock" + pageNumber,
                                   OverflowContentTarget = new RichTextBlockOverflow(),
                                   VerticalAlignment = VerticalAlignment.Center,
                                   HorizontalAlignment = HorizontalAlignment.Center
                               };
            overflow.SetValue(Grid.ColumnProperty, 1);

            _textBlock = new RichTextBlock
                             {
                                 VerticalAlignment = VerticalAlignment.Center,
                                 HorizontalAlignment = HorizontalAlignment.Center,
                                 Margin = new Thickness(70, 30, 20, 30),
                                 TextWrapping = TextWrapping.Wrap,
                                 IsTextSelectionEnabled = true,
                                 Name = "FirstBlock" + pageNumber,
                                 OverflowContentTarget = overflow
                             };
            _textBlock.SetValue(Grid.ColumnProperty, 0);

            foreach (var text in _content.Trim('\n', ' ', '\t').Split('\n'))
            {
                var paragraph = new Paragraph();
                paragraph.Inlines.Add(new Run { Text = text });
                _textBlock.Blocks.Add(paragraph);
            }

            grid1.Children.Add(_textBlock);
            grid2.Children.Add(overflow);

            _textBlock.Measure(grid1.RenderSize);
            overflow.Measure(grid2.RenderSize);

            _pages.Add(grid);

            richTextBlockOverflow = overflow;
        }
        else
        {
            // This is not the first page so the first element on this page has to be a
            // RichTextBoxOverflow that links to the last RichTextBlockOverflow added to
            // the previous page.
            if (lastOverflow.HasOverflowContent)
            {
                var overflowSecond = new RichTextBlockOverflow
                                         {
                                             VerticalAlignment = VerticalAlignment.Center,
                                             HorizontalAlignment = HorizontalAlignment.Center,
                                             Margin = new Thickness(20, 30, 70, 30),
                                             Name = "SecondBlock" + pageNumber
                                         };
                overflowSecond.SetValue(Grid.ColumnProperty, 1);

                var overflowFirst = new RichTextBlockOverflow
                                        {
                                            VerticalAlignment = VerticalAlignment.Center,
                                            HorizontalAlignment = HorizontalAlignment.Center,
                                            Margin = new Thickness(70, 30, 20, 30),
                                            Name = "FirstBlock" + pageNumber,
                                            OverflowContentTarget = overflowSecond
                                        };
                overflowFirst.SetValue(Grid.ColumnProperty, 0);

                lastOverflow.OverflowContentTarget = overflowFirst;

                grid1.Children.Add(overflowFirst);
                grid2.Children.Add(overflowSecond);

                overflowFirst.Measure(grid1.RenderSize);
                overflowSecond.Measure(grid2.RenderSize);

                _pages.Add(overflowFirst);
                _pages.Add(overflowSecond);

                richTextBlockOverflow = overflowSecond;
            }
        }

        _pages.Clear();
        LayoutRoot.UpdateLayout();

        return richTextBlockOverflow;
    }

在 LoadState() 中,我调用 CreatePages() 方法。

我的 XAML:

 <Grid x:Name="LayoutRoot" Style="{StaticResource LayoutRootStyle}" Background="#FFDEDEDE">
    <FlipView x:Name="View" HorizontalAlignment="Stretch" VerticalAlignment="Center" Foreground="Black" SelectionChanged="ViewOnSelectionChanged" FontSize="18" >
    </FlipView>
    <FlipView x:Name="SnappedView" HorizontalAlignment="Stretch" VerticalAlignment="Top" Foreground="Black" SelectionChanged="SnappedViewOnSelectionChanged" FontSize="12" Visibility="Collapsed">
    </FlipView>
    <ProgressBar x:Name="LoadProgressBar" HorizontalAlignment="Stretch" VerticalAlignment="Top" IsIndeterminate="True" Foreground="#007ACC"/>
</Grid>

谢谢大家!我希望有人知道如何解决这个问题..

4

0 回答 0