老周的博客http://blog.csdn.net/tcjiaan,转载请注明原作者和出处。
准确地说,本文是与各位分享一下小技巧。也不知道各位喜不喜欢。
嗯,废话就不说了,先看看我要实现什么样的运行结果。
是的,很像报纸的排版效果,那么,怎么做到的呢?
这就要提到一个类——RichTextBlockOverflow。他的用途就是,当RichTextBlock中的文本溢出后(就是当前RichTextBlock显示不完比较长的文本),可以在RichTextBlockOverflow上接着显示。
RichTextBlock的OverflowContentTarget属性设置为要接着显示文本的RichTextBlockOverflow,如果第一个RichTextBlockOverflow仍然不够用,则可以添加更多的RichTextBlockOverflow,只要把前一个的RichTextBlockOverflow的OverflowContentTarget属性设置为新的RichTextBlockOverflow,以此类推。
要判断文本是否溢出,可以通过HasOverflowContent属性获得。
好了,大概原理说了,下面就是动手实现了。
1、启动Visual Studio for Win 8 ,新建一个项目。
2、MainPage.xaml比较简单,按钮是为了选取一个较长的文本文件,文本框用于输入字体大小。用于排列文本的是一个StackPanel。
<Page
x:Class="App1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App1"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Orientation="Horizontal" Margin="25">
<Button Content="打开文件" Click="onClick"/>
<TextBlock Text="字体大小" Margin="37,0,0,0" FontSize="24" VerticalAlignment="Center"/>
<TextBox Name="txtSize" VerticalAlignment="Center" Margin="8,0,0,0" Width="130" Text="16">
<TextBox.InputScope>
<InputScope>
<InputScope.Names>
<InputScopeName NameValue="Number"/>
</InputScope.Names>
</InputScope>
</TextBox.InputScope>
</TextBox>
</StackPanel>
<ScrollViewer Margin="15" Grid.Row="1" HorizontalScrollBarVisibility="Auto" HorizontalScrollMode="Auto">
<StackPanel Name="stPanel" Orientation="Horizontal" />
</ScrollViewer>
</Grid>
</Page>
3、对于后台的代码,先贴出完整的吧。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Windows.Storage;
using Windows.Storage.Streams;
using Windows.Storage.Pickers;
using Windows.UI.Xaml.Documents;
namespace App1
{
public sealed partial class MainPage : Page
{
const double CT_WIDTH = 400d; //文本块的宽度
const double CT_HEIGHT = 500d; //文本块的高度
const double CT_MARGIN = 25d; //文本块的边距
public MainPage()
{
this.InitializeComponent();
}
private async void onClick(object sender, RoutedEventArgs e)
{
// 从文本文件中读取内容
FileOpenPicker opPicker = new FileOpenPicker();
opPicker.FileTypeFilter.Add(".txt");
opPicker.CommitButtonText = "打开";
opPicker.SuggestedStartLocation = PickerLocationId.Desktop;
StorageFile file = await opPicker.PickSingleFileAsync();
if (file != null)
{
using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read))
{
// 从流中读取文本,考虑utf-8读出来的是乱码,
// 改用Stream类来读取
// 使用gb2312编码格式
string msg = string.Empty;
using (Stream strm = stream.AsStream())
{
StreamReader render = new StreamReader(strm, System.Text.Encoding.GetEncoding("gb2312"));
msg = render.ReadToEnd();
}
// 去掉特殊的换行符
msg = msg.Replace(" ", "").Replace("\n", "").Replace("\r","\n").Replace("\t","");
stPanel.Children.Clear();
// 为了支持文本分块,使用RichTextBlock
RichTextBlock tbContent = new RichTextBlock();
tbContent.Width = CT_WIDTH;
tbContent.Height = CT_HEIGHT;
tbContent.TextWrapping = TextWrapping.Wrap;
tbContent.Margin = new Thickness(CT_MARGIN);
Paragraph ph = new Paragraph();
ph.TextIndent = 33;
Run txtRun = new Run();
txtRun.Text = msg;
ph.Inlines.Add(txtRun);
tbContent.Blocks.Add(ph);
tbContent.FontSize = Convert.ToDouble(txtSize.Text);
stPanel.Children.Add(tbContent);
// 更新一下状态,方便获取是否有溢出的文本
tbContent.UpdateLayout();
bool isflow = tbContent.HasOverflowContent;
// 因为除了第一个文本块是RichTextBlock,
// 后面的都是RichTextBlockOverflow一个一个接起来的
// 所以我们需要两个变量
RichTextBlockOverflow oldFlow = null, newFlow = null;
if (isflow)
{
oldFlow = new RichTextBlockOverflow();
oldFlow.Width = CT_WIDTH;
oldFlow.Height = CT_HEIGHT;
oldFlow.Margin = new Thickness(CT_MARGIN);
tbContent.OverflowContentTarget = oldFlow;
stPanel.Children.Add(oldFlow);
oldFlow.UpdateLayout();
// 继续判断是否还有溢出
isflow = oldFlow.HasOverflowContent;
}
while (isflow)
{
newFlow = new RichTextBlockOverflow();
newFlow.Height = CT_HEIGHT;
newFlow.Width = CT_WIDTH;
newFlow.Margin = new Thickness(CT_MARGIN);
oldFlow.OverflowContentTarget = newFlow;
stPanel.Children.Add(newFlow);
newFlow.UpdateLayout();
// 继续判断是否还有溢出的文本
isflow = newFlow.HasOverflowContent;
// 当枪一个变量填充了文本后,
// 把第一个变量的引用指向当前RichTextBlockOverflow
// 确保OverflowContentTarget属性可以前后相接
oldFlow = newFlow;
}
}
}
}
}
}
其实,重点就是循环加入文本块的地方,代码中我也做了注释。
分享到:
相关推荐
<title>CSS控制文本溢出_网页特效_javascript特效_css特效-ViewCss网页特效网 控制文本溢出_网页特效,javascript特效,css特效,网页特效代码,网站制作" /> ; charset=gb2312" /> div { text-overflow:ellipsis...
引导省略号为溢出文本添加省略号的快速方法版本 1.0.0 这个插件基于 [dobiatowski] ( ) 的这个项目。 请参阅的性能演示。 ####Dependencies: [jQuery] ( ) 如果你想使用工具提示,那么也 [twitter-bootstrap] ( ) #...
翻过国外的一个二进制漏洞学习教程, 非常适合刚学习漏洞的新人。
理论:第十三章:堆溢出,栈溢出的出现场景以及解决方案.docx
有色金属:继续看高一线:资金溢出效应+坚实基本面.pdf
碰到一个实现溢出文本显示省略号的需求,使用js截取字符串然后判断字符串长度实现,不过相对比较繁琐,本文为大家介绍下使用 text-overflow: ellipsis 实现溢出文本省略号显示
大家经常用的css3属性text-overflow是针对单行文本溢出的操作,那块级元素的文本溢出要怎样处理呢? 需要用到-webkit-line-clamp:
PHP安全问题:远程溢出、DoS、safe_mode绕过漏洞.pdf
在CorelDRAW插件开发过程中,避免不了处理文本,本文档涵盖了常见的文本处理代码,例如:创建美术字文本、段落文本、解决文本溢出、查找字符、替换文本、调整字符间距等20种处理方式,适合CDR插件开发者在编写CDR插件时...
在MCU系统负载较重、串口收发数据频率很高、多个中断存在(如同时有定时器更新中断、外部中断、DMA中断、串口接收中断)的情况下,容易出现串口溢出错误(ORE)。该错误的主要显现形式是:程序莫名卡死在串口中断之...
具体内容下载方式在文末
QTableWidget item文本显示不全的通过气泡提示出来,如果item内容是完全显示的则气泡不会出现。只有显示不全时气泡才会出现。效果图:https://blog.csdn.net/qq_41622002/article/details/111224339
windows 溢出 代码 讲解 pdf电子书
整形数据的溢出文本文件
此工具可远程利用DCOM RPC缓冲区溢出,可以溢出多版本的windows: - 0 Windows 2000 SP0 (english) - 1 Windows 2000 SP0 (english2) - 2 Windows 2000 SP1 (english) - 3 Windows 2000 SP2 (english) - 4 Windows ...
10转16进制不溢出
NULL 博文链接:https://qiaohhgz.iteye.com/blog/1664352
Shellcode地点和Windows内的缓冲区溢出
处理bitmap内存溢出问题
CSS--文本溢出完美样式,CSS--文本溢出完美样式,CSS--文本溢出完美样式