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 枚举。
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枚举。
1 47717269次/周
2 46650460次/周
3 37509255次/周
4 36211021次/周
5 21025259次/周
6 19758049次/周
7 17088093次/周
8 16950636次/周
9 15137639次/周
10 14916584次/周
1 2次/周
2 612次/周
3 2238428次/周
4 2630657次/周
5 709722次/周
6 2482次/周
7 37509255次/周
8 11次/周
9 13149次/周
10 14916584次/周
1 42793次/周
2 12741次/周
3 15466次/周
4 2次/周
5 0次/周
6 10次/周
7 1次/周
8 4次/周
9 0次/周
10 0次/周
1 13次/周
2 16次/周
3 4次/周
4 4次/周
5 6次/周
6 0次/周
7 0次/周
8 1次/周
9 3次/周
10 1次/周
1 96次/周
2 841次/周
3 2次/周
4 771次/周
5 3704次/周
6 694次/周
7 184次/周
8 113次/周
9 978次/周
10 461次/周
天极服务 |
关于我们 |
About us |
网站律师 |
RSS订阅 |
友情合作 |
加入我们 |
天极动态 |
网站地图 |
意见反馈 |
MSN/QQ上看天极
Copyright (C) 1999-2012 Yesky.com, All Rights Reserved 版权所有 天极网络
");
}