Beispiel #1
0
        public void CreateFromBlocks(IEnumerable <Block> blocks, PageProviderBindings bindings, bool canGoBack, bool canGoForward)
        {
            _bindings = bindings;

            if (canGoBack)
            {
                Add(new FlipViewItem());
            }

            var baseBlock = new RichTextBlock
            {
                IsTextSelectionEnabled = false
            };

            baseBlock.SetBinding(RichTextBlock.LineHeightProperty, _bindings.LineHeightBinding);
            baseBlock.SetBinding(RichTextBlock.PaddingProperty, _bindings.PaddingBinding);
            baseBlock.SetBinding(RichTextBlock.TextIndentProperty, _bindings.ParagraphIndentationBinding);
            baseBlock.MaxWidth = 800;

            foreach (var block in blocks)
            {
                baseBlock.Blocks.Add(block);
            }

            Add(baseBlock);
            baseBlock.UpdateLayout();
            Overflow(baseBlock);

            if (canGoForward)
            {
                Add(new FlipViewItem());
            }
        }
        public RichTextBlock CalculateHeight(RichTextBlock currentTextBlock, double width)
        {
            var tb = new RichTextBlock {
                FontSize = currentTextBlock.FontSize
            };

            if (_text == null)
            {
                return(tb);
            }
            // Create run and set text
            Run run = new Run();

            run.Text = _text;

            // Create paragraph
            Paragraph paragraph = new Paragraph();

            // Add run to the paragraph
            paragraph.Inlines.Add(run);
            tb.Blocks.Add(paragraph);

            tb.MinWidth     = width;
            tb.MaxWidth     = width;
            tb.Width        = width;
            tb.MaxHeight    = Double.PositiveInfinity;
            tb.TextWrapping = TextWrapping.WrapWholeWords;

            tb.Measure(new Size(width, Double.PositiveInfinity));
            tb.Arrange(new Rect(0, 0, width, tb.DesiredSize.Height));
            tb.UpdateLayout();

            return(tb);
        }
        //动态添加控件,动态布局,RichBlock承载Paragraph的内容,当字体大小太大溢出时,将溢出内容放在挨着排列的RichTextBlockOverflow
        private void FontSlider_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
        {
            stPanel.Children.Clear();//清除前一次字体大小下的文本内容
            String msg = "1、本播放器是一个本地播放器,用户只能从本地添加歌曲进行播放,但是时间允许的话我们可以链接服务器实现在线音乐加载。"
                         + "2、虽然不能实现在线播放,但是我们通过WebView控件可以实现在线浏览音乐功能,乐库、电台、MV、直播、节目按钮均可点击使用。"
                         + "3、该音乐播放器支持歌曲在线搜索功能,在搜索框输入歌曲名称即可搜索,其实质也就是对歌曲名称进行UTF8编码,通过字符串的拼接得到歌曲网址即得到该音乐在QQ音乐官网上的网址链接,将歌曲网页放在WebView中实现歌曲在线搜索显示。"
                         + "4、书上的音乐播放器的功能均已经实现5、帮助界面耗时很久,对于我们新手实现有难度,此界面核心控件是RichTextBlock富文本控件,因为为了实现内容字体放大后的容纳,需要用到RichTexTBlock中的RichTextBlockOverflow,配合ScrollViewer的控件实现溢出内容的滚动显示。"
                         + "其中UWP下获得系统库的所有字体有难度,但在DirectX渲染的帮助下很好的解决了。其中系统库中所有颜色的获取显示是通过数据模板解决的。"
                         + "6、由于时间有限,能力有限,好多功能都没有实现,但是如果加入了网络编程,实现连接服务器之后,我们可以在主界面放置服务器中的音乐,这样播放器就能实现真正的在线播放功能了.";

            RichTextBlock tbContent = new RichTextBlock(); //定义RichTextBlock的实例,动态插入控件

            tbContent.Width        = WIDTH;
            tbContent.Height       = HEIGHT;
            tbContent.TextWrapping = TextWrapping.Wrap;
            tbContent.Margin       = new Thickness(MARGIN);
            Paragraph ph = new Paragraph(); //声明Paragraph的实例

            ph.TextIndent = 33;             //第一行文本的缩进量

            Run txtRun = new Run();         //格式化文本或非格式化文本的离散区域

            txtRun.Text = msg;
            ph.Inlines.Add(txtRun);
            tbContent.Blocks.Add(ph);
            tbContent.FontSize = (int)FontSlider.Value; //获取字体大小,将滑块的值设置为字体大小,滑块有问题,有时value报错(以为是浮点数的原因),强转int类型也还是不行,没有解决问题
            stPanel.Children.Add(tbContent);            //向面板子元素添加
            // 更新一下状态,方便获取是否有溢出的文本
            tbContent.UpdateLayout();
            bool isflow = tbContent.HasOverflowContent;
            // 因为除了第一个文本块是RichTextBlock,
            // 后面的都是RichTextBlockOverflow一个一个接起来的
            // 所以我们需要两个变量
            RichTextBlockOverflow oldFlow = null, newFlow = null;

            if (isflow)
            {
                oldFlow        = new RichTextBlockOverflow(); //初始化RichTextBlockOverflow的新实例
                oldFlow.Width  = WIDTH;
                oldFlow.Height = HEIGHT;
                oldFlow.Margin = new Thickness(MARGIN);
                tbContent.OverflowContentTarget = oldFlow;
                stPanel.Children.Add(oldFlow);
                oldFlow.UpdateLayout();
                // 继续判断是否还有溢出
                isflow = oldFlow.HasOverflowContent;
            }
            while (isflow)
            {
                newFlow        = new RichTextBlockOverflow();
                newFlow.Height = HEIGHT;
                newFlow.Width  = WIDTH;
                newFlow.Margin = new Thickness(MARGIN);
                oldFlow.OverflowContentTarget = newFlow;
                stPanel.Children.Add(newFlow);
                newFlow.UpdateLayout();
                // 继续判断是否还有溢出的文本
                isflow = newFlow.HasOverflowContent;
                // 当枪一个变量填充了文本后,
                // 把第一个变量的引用指向当前RichTextBlockOverflow
                // 确保OverflowContentTarget属性可以前后相接
                oldFlow = newFlow;
            }
        }