`
mmdev
  • 浏览: 13218837 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

新时尚Windows8开发(16):如何处理溢出文本

 
阅读更多

老周的博客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;
                    }
                }
            }
        }
    }
}


其实,重点就是循环加入文本块的地方,代码中我也做了注释。

分享到:
评论

相关推荐

    Windows漏洞利用开发系列教程第二部分:栈溢出覆盖返回地址

    在这篇标题为“Windows漏洞利用开发系列教程第二部分:栈溢出覆盖返回地址”的文章中,作者详细介绍了如何利用栈溢出漏洞来覆盖程序的返回地址,从而达到控制程序执行流程的目的。栈溢出是一种常见的软件安全漏洞,...

    一行内文本溢出的处理

    在IT行业中,文本溢出是一个常见的问题,尤其是在网页设计、数据处理或日志记录等场景。当文本内容超过其容器的显示范围时,就会发生溢出。标题“一行内文本溢出的处理”直指这个问题的核心,即如何在有限的空间内...

    CSS--文本溢出完美样式

    8. **性能优化**:避免过度依赖JavaScript来处理文本溢出,因为CSS解决方案通常更轻量且性能更好。然而,若需要动态调整文本溢出,JavaScript可以提供更灵活的解决方案。 以上就是关于“CSS--文本溢出完美样式”的...

    CSS控制html文本溢出

    为了使页面布局更加整洁美观,合理地处理文本溢出显得尤为重要。CSS提供了多种方法来实现这一目标,其中一种常用的技术是通过`text-overflow`、`overflow`以及`white-space`等属性的组合来实现文本溢出时的截断与...

    bootstrap-ellipsis:为溢出文本添加省略号的快速方法

    引导省略号为溢出文本添加省略号的快速方法版本 1.0.0 这个插件基于 [dobiatowski] ( ) 的这个项目。 请参阅的性能演示。 ####Dependencies: [jQuery] ( ) 如果你想使用工具提示,那么也 [twitter-bootstrap] ( ) #...

    windows 缓冲区溢出

    1. **SEH(Structured Exception Handling)保护**:Windows使用SEH来处理异常,攻击者试图利用SEH来跳转到恶意代码。但后来的版本中,微软引入了No-Execute(NX)位,防止栈上的代码被执行。 2. **ASLR(Address ...

    Windows缓冲区溢出资料

    Windows操作系统中的缓冲区溢出是一种常见的安全漏洞,主要出现在C/C++等编程语言中,由于程序员在处理输入数据时没有正确地检查边界,导致程序试图写入超出分配内存区域的数据,从而可能破坏程序运行环境,甚至允许...

    理论:第十三章:堆溢出,栈溢出的出现场景以及解决方案.docx

    在实际开发中,我们可以通过以下方式来解决堆溢出和栈溢出: 1. 使用 JVM 参数调整堆和栈的大小。 2. 优化代码,减少对象的创建和销毁,避免频繁的 GC 操作。 3. 使用堆外内存,例如使用 DirectByteBuffer 等。 4. ...

    处理pdfmarker中文乱码及内存溢出的处理

    这里的`encoding: 'utf-8'`参数是至关重要的,它告诉PDFMaker使用UTF-8编码来处理文本。同时,确保你的项目包含必要的字体文件,以便PDFMaker能够正确渲染中文字符。 接下来,我们讨论如何处理内存溢出问题。内存...

    Windows_7设备驱动程序开发_window设备程序开发_windows驱动开发_

    1. **驱动程序模型**:Windows 7支持多种驱动程序模型,如Kernel-Mode Driver Framework (KMDF) 和User-Mode Driver Framework (UMDF),它们为驱动开发提供了抽象层,简化了驱动的编写过程。 2. **驱动程序生命周期...

    8.windows 溢出 (pdf电子书)

    3. SEH(Structured Exception Handling)链篡改:Windows中的异常处理机制,攻击者可以改变SEH链来控制异常处理流程。 四、防御策略 为了防止缓冲区溢出,开发者和系统管理员可以采取以下措施: 1. 使用安全的编程...

    有色金属:继续看高一线:资金溢出效应+坚实基本面.pdf

    有色金属:继续看高一线:资金溢出效应+坚实基本面.pdf

    使用text-overflow:ellipsis实现溢出文本省略号显示无需js

    `text-overflow: ellipsis` 是CSS中的一个属性,用于处理溢出元素内容的显示。当文本内容超出元素的边界时,它会在文本末尾添加省略号(...)来表示内容被截断。但仅仅设置 `text-overflow: ellipsis` 并不足以实现...

    文本溢出时显示省略标记

    在IT领域,文本溢出是常见的问题,尤其是在网页设计、移动应用开发以及用户界面(UI)设计中。当文本内容超出其容器的显示范围时,就需要处理文本溢出,以保持界面的整洁和易读性。"文本溢出时显示省略标记"这一主题...

    多行文本溢出显示点点点

    在网页设计和开发中,有时候我们需要处理长文本的展示问题,特别是当文本内容过多时,不能完全在有限的空间内显示。这时,“多行文本溢出显示点点点”这一技术就显得尤为重要。它能帮助我们优雅地处理长文本,使得...

    大家经常用的css3属性text-overflow是针对单行文本溢出的操作,那块级元素的文本溢出要怎样处理呢? 需要用到-webkit-line-clamp:

    大家经常用的css3属性text-overflow是针对单行文本溢出的操作,那块级元素的文本溢出要怎样处理呢? 需要用到-webkit-line-clamp:

    windows 驱动开发资料

    4. **设备驱动接口**:Windows提供了一系列的Device Interface Classes (DICs)和Kernel-Mode Driver API,使得开发者可以访问系统服务,控制设备,处理I/O请求,并与其他驱动或系统组件通信。 5. **驱动安全**:...

    CDR插件开发之文本处理.pdf

    在CorelDRAW插件开发过程中,避免不了处理文本,本文档涵盖了常见的文本处理代码,例如:创建美术字文本、段落文本、解决文本溢出、查找字符、替换文本、调整字符间距等20种处理方式,适合CDR插件开发者在编写CDR插件时...

    Windows异常处理流程

    - 0x8 - 双重异常:处理异常过程中又发生新的异常。 - 0xA - 无效任务段:任务段描述符无效。 - 0xB - 段不存在:引用的段不在内存中。 - 0xC - 堆栈错误:堆栈溢出或加载SS寄存器的描述符非存在。 - 0xD - 一般保护...

    从零开始学习软件漏洞挖掘系列教程第二篇:栈溢出覆盖返回地址实践.pdf

    本篇教程介绍了如何通过栈溢出漏洞覆盖返回...通过本次实验的实践操作,学习者可以更深入地理解栈溢出漏洞的工作原理和利用方法,从而在未来的软件开发中能够更好地避免这类安全漏洞,编写出更加安全可靠的软件产品。

Global site tag (gtag.js) - Google Analytics