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; } }