首页产品库评测行情新闻|手机数码笔记本台式机DIY硬件数字家庭数码相机办公外设|软件下载游戏开发|社区

更多

数码相机
MP4
LCD
机箱
音箱

软件资讯设计 工具 系统 开发 安全 办公 陶吧 IT教育 Vista频道 | 下载中心酷我音乐盒 腾讯QQ
天极网 > 开发频道>WPF SDK研究 之 Flow流

WPF SDK研究 之 Flow流

2008-04-25 00:00作者:包建强 出处:天极网责任编辑:dizzarz

10TableAddContent
这个例子演示了如何在C#中为已有Table添加一个TableRow

WPF中,是先把TableRow添加到已知的TableRowGroup中:然后在这个TableRow中添加带有内容的TableCell

 

            TableRow row = new TableRow();
            trg1.Rows.Add(row);
            Paragraph para = 
new Paragraph();
            para.Inlines.Add(
"A new Row and Cell have been Added to the Table");
            TableCell cell = 
new TableCell(para);
            row.Cells.Add(cell);

 

注意到:Paragraph、TableCell、TableRow都是位于System.Windows.Documents命名空间的

11TableVsGridSample
这个例子用一个3x4的表格模拟一个Grid

注意,这是一个Layout,而不是控件。

12FlowDocumentNews
这个示例的关键是document这个XAML底部的三个图片缩略图,对应鼠标左键单击事件,从而为Frame1重新设定数据源。

再有就是两个布局控件
FigureFloater的区别。
Figure Floater 元素通常用于突出显示或强调内容的某些部分,承载主内容流中的支持图像或其他内容,或者用于插入松散相关的内容(如广告)。

Figure Floater 在多个方面存在差异,它们用于不同的方案。
Figure
  l         可定位:可以设置其水平和垂直定位点,以便相对于页、内容、栏或段落进行停靠。也可使用其 HorizontalOffset VerticalOffset 属性指定任意偏移。
    
l         可将其大小调整为多个栏大小:可以设置 Figure 的高度和宽度,使其是页、内容或栏的高度或宽度的倍数。注意,对于页和内容,倍数不能大于 1。例如,可以将 Figure 的宽度设置为“0.5 page”、“0.25 content”或“2 Column”。还可以将高度和宽度设置为绝对像素值。
    
l         不分页:如果 Figure 中的内容无法容纳在 Figure 内部,它会呈现能够容纳的内容部分,其余内容将丢失。

Floater
    
l         无法定位;可利用能够使用的所有空间进行呈现。不能设置偏移或将 Floater 锚定。
    
l         不能将其大小设置为多个栏大小:默认情况下,Floater 的大小设置为一个栏宽。它有一个可设置为绝对像素值的 Width 属性,但是如果此值大于一个栏宽,会将其忽略并将浮标的大小设置为一个栏宽。您可以通过设置正确的像素宽度将其大小设置为小于一个栏宽,但其大小与栏无关,因此“0.5 倍栏宽”并不是 Floater 宽度的有效表达。Floater 没有高度属性,无法设置其高度;其高度取决于内容。
    
l         Floater在以下情况下分页:具有指定宽度的内容超出了一个栏的高度,浮标会断开并分页到下一栏、下一页,等等。

Figure 适合放置希望控制其大小和定位的独立内容,并且可以确信内容将适合指定的大小。Floater 适合放置流动更加自由的内容,其流动方式与主页内容类似,但与主页内容相分离。

13textblockPropsSamp
这个例子有很多地方值得研究,都是基于TextBlock的各种属性。

首先是Visibility枚举的三个值:VisibleHiddenCollapsed。其中Hidden表示不显示元素,但为元素保留布局空间;而Collapsed则表示不显示元素,且不为其保留布局空间。
窗体中所有以make开头的按钮都使用了同样的逻辑:先将所有的元素都设置为Collapsed,然后将具体一个控件设为Visible

其次是TextBlockBaselineOffset属性,获取或设置每个文本行相对于基线的偏移量。
基线是一条假想的水平线,文本行中每个字符的底部都与基线进行对齐。改变TextBlock中的这个值,则TextBlock后面的文本都会重新设定基线偏移量。
BaselineOffset可以设置为负值,从而向相反的方向偏移。

然后是BreakBefore属性,指示内容应当如何在当前元素之前进行分行。而BreakAfter属性,指示内容应当如何在当前元素之后进行分行。
注:尾部换行符不起作用的控件将忽略这两个属性。
这两个属性总是返回LineBreakConditionBreakDesired
这就牵扯到了LineBreakCondition枚举——围绕内联对象描述换行条件。其中BreakDesired表示如果另一个对象不禁止则换行。更多细节参见LineBreakCondition枚举的详细介绍。

然后是设置文本上的画线效果。

 

            TextDecorationCollection myCollection = new TextDecorationCollection();
            TextDecoration myStrikethrough 
= new TextDecoration();
            myStrikethrough.Location 
= TextDecorationLocation.Strikethrough;
            myStrikethrough.Pen 
= new Pen(Brushes.Red, 1);
            myStrikethrough.PenThicknessUnit 
= TextDecorationUnit.FontRecommended;
            myCollection.Add(myStrikethrough);
            tb1.TextDecorations 
= myCollection;

 

上述代码为TextBlock设置了myCollection文本修饰器集合,其中包括Strikethrough线条。

最后一个有趣的效果是“Set TextEffects”按钮,从而可以激发teTranslateteScaleteRotate这三个方法,产生不同的效果:移动、缩放、旋转。
因为这三个效果是独立的,所以都具有相同的逻辑流程:先执行DisableTextEffects方法,将先前的效果都销毁;然后建立TextEffect实例myEffect,携带着不同的效果;最后是执行EnableTextEffects方法:
            EnableTextEffects(tb1, myEffect);
myEffect效果应用到TextBlock上。

注意这个EnableTextEffects方法:

 

        private void EnableTextEffects(TextBlock tb, TextEffect effect)
        
{
            _textEffectTargets 
= TextEffectResolver.Resolve(tb.ContentStart, tb.ContentEnd, effect);
            
foreach (TextEffectTarget target in _textEffectTargets)
                target.Enable();
        }

 

获取TextBlock中从起始到结束所有的内容,将其解析为一个TextEffectTarget数组,对其进行遍历,使每个效果都生效。

14FlowDocumentPropsSamp
这个例子是示例-13的延伸,是对全章的技术总结。

其中有两个值得探讨的技术:

首先是DynamicDocumentPaginator这是一个抽象基类,该类除了支持其自己基类的方法和属性之外,还支持自动后台分页和在重新分页期间跟踪内容位置。

 

        DynamicDocumentPaginator dynPaginator;
        dynPaginator 
= ((IDocumentPaginatorSource)fd1).DocumentPaginator as DynamicDocumentPaginator;
        dynPaginator.IsBackgroundPaginationEnabled 
= false;

 

先说自动后台分页。当IsBackgroundPaginationEnabled = true时,调整文本大小等动作会导致页数变化并显示出来。反之设为false,会禁用自动分页,从而不会有变化。
再说分页期间的跟踪。完成分页后会触发PaginationProgress事件,我们可以实现这个事件的方法。

其次是Typography:提供对一组丰富的 OpenType 版式属性的访问。
Typography对象公开OpenType字体支持的一组功能。通过使用标记或代码设置 Typography 属性,您可以轻松地编写利用 OpenType 功能的文档。这是一个非常复杂的类,有太多的属性和方法,我们仅就示例中的3条语句进行分析:这里fd1为一个FlowDocument实例。
            Typography.SetHistoricalForms(fd1, false);
确定是否启用历史记录格式,这里false是不启用。
历史记录格式在过去是常用的版式约定。
            Typography.SetCapitals(fd1, FontCapitals.Normal);
指定fd1中的文本的大小写形式。默认为Normal(正常)。SmallCaps表示将小写字母都替换为大写字母。其它值详见FontCapitals枚举。
            Typography.SetVariants(fd1, FontVariants.Subscript);
指定fd1中的文本的版式变体。默认为Normal(正常)。Subscript表示将默认标志符号替换为下标标志符号。其它值详见FontVariants枚举。

  TableCell 元素可承载从 Block 派生的一个或多个流内容元素。 TableCell 有效的内容元素包括:

  BlockUIContainer

  List

  Paragraph

  Section

  Table

  注:没有 TableCell 内容的内置数据绑定。

  另外,只可以在TableCell中设置ColumnSpan和RowSpan:

  

  10.TableAddContent

  这个例子演示了如何在C#中为已有Table添加一个TableRow。

  在WPF中,是先把TableRow添加到已知的TableRowGroup中:然后在这个TableRow中添加带有内容的TableCell:

   TableRow row = new TableRow();

   trg1.Rows.Add(row);

   Paragraph para = new Paragraph();

   para.Inlines.Add("A new Row and Cell have been Added to the Table");

   TableCell cell = new TableCell(para);

   row.Cells.Add(cell);

  注意到:Paragraph、TableCell、TableRow都是位于System.Windows.Documents命名空间的

  11.TableVsGridSample

  这个例子用一个3x4的表格模拟一个Grid。

  注意,这是一个Layout,而不是控件。

  12.FlowDocumentNews

  这个示例的关键是document这个XAML底部的三个图片缩略图,对应鼠标左键单击事件,从而为Frame1重新设定数据源。

  再有就是两个布局控件Figure和Floater的区别。

  Figure 或 Floater 元素通常用于突出显示或强调内容的某些部分,承载主内容流中的支持图像或其他内容,或者用于插入松散相关的内容(如广告)。

  Figure 和 Floater 在多个方面存在差异,它们用于不同的方案。

  Figure:

  l 可定位:可以设置其水平和垂直定位点,以便相对于页、内容、栏或段落进行停靠。也可使用其 HorizontalOffset 和 VerticalOffset 属性指定任意偏移。

  l 可将其大小调整为多个栏大小:可以设置 Figure 的高度和宽度,使其是页、内容或栏的高度或宽度的倍数。注意,对于页和内容,倍数不能大于 1。例如,可以将 Figure 的宽度设置为“0.5 page”、“0.25 content”或“2 Column”。还可以将高度和宽度设置为绝对像素值。

  l 不分页:如果 Figure 中的内容无法容纳在 Figure 内部,它会呈现能够容纳的内容部分,其余内容将丢失。

  Floater:

  l 无法定位;可利用能够使用的所有空间进行呈现。不能设置偏移或将 Floater 锚定。

  l 不能将其大小设置为多个栏大小:默认情况下,Floater 的大小设置为一个栏宽。它有一个可设置为绝对像素值的 Width 属性,但是如果此值大于一个栏宽,会将其忽略并将浮标的大小设置为一个栏宽。您可以通过设置正确的像素宽度将其大小设置为小于一个栏宽,但其大小与栏无关,因此“0.5 倍栏宽”并不是 Floater 宽度的有效表达。Floater 没有高度属性,无法设置其高度;其高度取决于内容。

  l Floater在以下情况下分页:具有指定宽度的内容超出了一个栏的高度,浮标会断开并分页到下一栏、下一页,等等。

  Figure 适合放置希望控制其大小和定位的独立内容,并且可以确信内容将适合指定的大小。Floater 适合放置流动更加自由的内容,其流动方式与主页内容类似,但与主页内容相分离。

  13.textblockPropsSamp

  这个例子有很多地方值得研究,都是基于TextBlock的各种属性。

  首先是Visibility枚举的三个值:Visible、Hidden、Collapsed。其中Hidden表示不显示元素,但为元素保留布局空间;而Collapsed则表示不显示元素,且不为其保留布局空间。

  窗体中所有以make开头的按钮都使用了同样的逻辑:先将所有的元素都设置为Collapsed,然后将具体一个控件设为Visible。

  其次是TextBlock的BaselineOffset属性,获取或设置每个文本行相对于基线的偏移量。

  基线是一条假想的水平线,文本行中每个字符的底部都与基线进行对齐。改变TextBlock中的这个值,则TextBlock后面的文本都会重新设定基线偏移量。

  BaselineOffset可以设置为负值,从而向相反的方向偏移。

  然后是BreakBefore属性,指示内容应当如何在当前元素之前进行分行。而BreakAfter属性,指示内容应当如何在当前元素之后进行分行。

  注:尾部换行符不起作用的控件将忽略这两个属性。

  这两个属性总是返回LineBreakCondition的BreakDesired。

  这就牵扯到了LineBreakCondition枚举——围绕内联对象描述换行条件。其中BreakDesired表示如果另一个对象不禁止则换行。更多细节参见LineBreakCondition枚举的详细介绍。

  然后是设置文本上的画线效果。

   TextDecorationCollection myCollection = new TextDecorationCollection();

   TextDecoration myStrikethrough = new TextDecoration();

   myStrikethrough.Location = TextDecorationLocation.Strikethrough;

   myStrikethrough.Pen = new Pen(Brushes.Red, 1);

   myStrikethrough.PenThicknessUnit = TextDecorationUnit.FontRecommended;

   myCollection.Add(myStrikethrough);

   tb1.TextDecorations = myCollection;

  上述代码为TextBlock设置了myCollection文本修饰器集合,其中包括Strikethrough线条。

  最后一个有趣的效果是“Set TextEffects”按钮,从而可以激发teTranslate、teScale、teRotate这三个方法,产生不同的效果:移动、缩放、旋转。

  因为这三个效果是独立的,所以都具有相同的逻辑流程:先执行DisableTextEffects方法,将先前的效果都销毁;然后建立TextEffect实例myEffect,携带着不同的效果;最后是执行EnableTextEffects方法:

  EnableTextEffects(tb1, myEffect);

  将myEffect效果应用到TextBlock上。

  注意这个EnableTextEffects方法:

   private void EnableTextEffects(TextBlock tb, TextEffect effect)

   {

   _textEffectTargets = TextEffectResolver.Resolve(tb.ContentStart, tb.ContentEnd, effect);

   foreach (TextEffectTarget target in _textEffectTargets)

   target.Enable();

   }

  获取TextBlock中从起始到结束所有的内容,将其解析为一个TextEffectTarget数组,对其进行遍历,使每个效果都生效。

  14.FlowDocumentPropsSamp

  这个例子是示例-13的延伸,是对全章的技术总结。

  其中有两个值得探讨的技术:

  首先是DynamicDocumentPaginator:这是一个抽象基类,该类除了支持其自己基类的方法和属性之外,还支持自动后台分页和在重新分页期间跟踪内容位置。

   DynamicDocumentPaginator dynPaginator;

   dynPaginator = ((IDocumentPaginatorSource)fd1).DocumentPaginator as DynamicDocumentPaginator;

   dynPaginator.IsBackgroundPaginationEnabled = false;

  

  先说自动后台分页。当IsBackgroundPaginationEnabled = true时,调整文本大小等动作会导致页数变化并显示出来。反之设为false,会禁用自动分页,从而不会有变化。

  再说分页期间的跟踪。完成分页后会触发PaginationProgress事件,我们可以实现这个事件的方法。

  其次是Typography:提供对一组丰富的 OpenType 版式属性的访问。

  Typography对象公开OpenType字体支持的一组功能。通过使用标记或代码设置 Typography 属性,您可以轻松地编写利用 OpenType 功能的文档。这是一个非常复杂的类,有太多的属性和方法,我们仅就示例中的3条语句进行分析:这里fd1为一个FlowDocument实例。

  Typography.SetHistoricalForms(fd1, false);

  确定是否启用历史记录格式,这里false是不启用。

  历史记录格式在过去是常用的版式约定。

  Typography.SetCapitals(fd1, FontCapitals.Normal);

  指定fd1中的文本的大小写形式。默认为Normal(正常)。SmallCaps表示将小写字母都替换为大写字母。其它值详见FontCapitals枚举。

  Typography.SetVariants(fd1, FontVariants.Subscript);

  指定fd1中的文本的版式变体。默认为Normal(正常)。Subscript表示将默认标志符号替换为下标标志符号。其它值详见FontVariants枚举。

共2页。 上一页12
进入 最权威的Windows 7论坛 查看网友讨论

软件频道最新更新

热点推荐

IT嘉年华

编辑推荐

软件下载

热门
推荐

网友关注

软件
资料
游戏

装机推荐

文章排行

本周
本月
最新更新
天极服务|关于我们|About us|网站律师|RSS订阅|友情合作|加入我们|天极动态|网站地图|意见反馈|MSN/QQ上看天极
Copyright (C) 1999-2012 Yesky.com, All Rights Reserved 版权所有 天极网络