原文:
WPF界面設計技巧(11)-認知流文檔 & 小議WPF的野心
![](http://static.javashuo.com/static/loading.gif)
流文檔是WPF中的一種獨特的文檔承載格式,它的書寫和呈現方式都很像HTML,它也幾乎具有了HTML的絕大多數優點,並提供了更強的編程支持及對WPF其餘元素的兼容。html
直接來看代碼吧,須要講解的地方比較多,我就直接註釋在代碼裏了,看起來更方便些:編程
Code
<Window x:Class="流文檔.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="376" Width="540">
<Grid>
<Grid.Resources>
<!--MailMail字符突出顯示樣式-->
<Style x:Key="MailMailStyle" TargetType="Run">
<Setter Property="FontFamily" Value="Nina"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Foreground" Value="#FFF88900"/>
</Style>
<!--超連接樣式-->
<Style TargetType="Hyperlink">
<Setter Property="Foreground" Value="#209AC2"/>
<!--清除文字修飾(去掉下劃線)-->
<Setter Property="TextBlock.TextDecorations" Value="{x:Null}"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="#F27D00" />
<!--在鼠標懸停時顯示下劃線-->
<Setter Property="TextBlock.TextDecorations">
<Setter.Value>
<TextDecorationCollection>
<TextDecoration Location="Underline"/>
</TextDecorationCollection>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
<!--段落樣式-->
<Style TargetType="Paragraph">
<Setter Property="Margin" Value="8"/>
</Style>
</Grid.Resources>
<!--流文檔閱讀器-->
<FlowDocumentReader>
<!--流文檔-->
<FlowDocument Foreground="#647474">
<!--標題,一個方形圖形填充MailMail標誌,後跟「簡介」二字-->
<!--Paragraph,段落,至關於HTML的<p>-->
<Paragraph FontWeight="Bold" FontSize="18">
<Rectangle Fill="{StaticResource title}" Height="44" Width="190" Margin="0,0,6,0"/>簡介
</Paragraph>
<!--內容-->
<Paragraph>
<!--內嵌環繞區域-->
<Figure Width="160" Height="150" Padding="4" Margin="2">
<!--流文檔內的控件容器-->
<BlockUIContainer>
<!--一個帶邊框的圖片-->
<Border SnapsToDevicePixels="True" BorderThickness="1" Padding="3" BorderBrush="#999">
<Image Source="http://images.cnblogs.com/cnblogs_com/skyd/8.jpg" Stretch="UniformToFill" />
</Border>
</BlockUIContainer>
</Figure>
<!--Run,內聯字符串,貌似和使用Span沒什麼區別,至關於HTML的<span>-->
<Run Style="{StaticResource MailMailStyle}">MailMail</Run>是一款獨特的郵件發送工具,或許它獨特到你從未感覺過的地步,它可以使你經過輕鬆、簡單、愉快的操做完成平常郵件發送操做,固然,它確定不是因「會發郵件」而獨特,而是在於「怎麼發」,相信我,你必定要本身來感覺一下。
</Paragraph>
<Paragraph>
經過<Run Style="{StaticResource MailMailStyle}">MailMail</Run>,你能夠達成不少你所不曾嘗試的郵箱應用,如備份文件、分享音樂、分發資料、提交工做文檔、羣發消息等,<Run Style="{StaticResource MailMailStyle}">MailMail</Run>提供了巧妙的選項設置及完善的配置系統讓你駕輕就熟地作這些事。
</Paragraph>
<Paragraph>
固然,好東西也有壞處:<Run Style="{StaticResource MailMailStyle}">MailMail</Run>會讓你的郵件服務商頭大,由於他們許諾的1G、2G、5G空間可能都要被你充分利用掉。是的,你有很高概率發上癮,就像一句老話:「一發不可收拾」。
</Paragraph>
<Paragraph>
<!--LineBreak,換行符,至關於HTML的<br/>-->
<LineBreak/>
相關網址:
</Paragraph>
<!--List,列表,至關於HTML的<ul>-->
<List>
<!--ListItem,列表項,至關於HTML的<li>-->
<ListItem>
<Paragraph>
<!--Hyperlink,超連接,至關於HTML的<a>-->
介紹及幫助:<Hyperlink Click="Hyperlink_Click" NavigateUri="http://www.cnblogs.com/SkyD/archive/2008/08/09/1264083.html">http://www.cnblogs.com/SkyD/archive/2008/08/09/1264083.html</Hyperlink>
</Paragraph>
</ListItem>
<ListItem>
<Paragraph>
問題反饋及建議提交:<Hyperlink Click="Hyperlink_Click" NavigateUri="http://www.cnblogs.com/SkyD/articles/1264078.html">http://www.cnblogs.com/SkyD/articles/1264078.html</Hyperlink>
</Paragraph>
</ListItem>
<ListItem>
<Paragraph>
更新信息及下載:<Hyperlink Click="Hyperlink_Click" NavigateUri="http://www.cnblogs.com/SkyD/articles/1264080.html">http://www.cnblogs.com/SkyD/articles/1264080.html</Hyperlink>
</Paragraph>
</ListItem>
</List>
</FlowDocument>
</FlowDocumentReader>
</Grid>
</Window>
<Grid.Resources>部分我定義了文檔的一些通用樣式,這就像內嵌的CSS。Style真是無處不在,嗯,他能比CSS作更多的事,但也更復雜一些。網絡
正文部分,咱們看到不少元素均可以找到其在HTML裏的對應,結合咱們在HTML中的經驗,這些均可以被輕鬆理解。工具
注意標題處引用的靜態資源title是我在別處定義的,在這裏看不到。佈局
後臺僅添加如下語句用於處理超連接點擊事件,由於獨立應用程序中不會自動處理它們:post
Code
private void Hyperlink_Click(object sender, RoutedEventArgs e)
{
System.Diagnostics.Process.Start((sender as Hyperlink).NavigateUri.ToString());
}
下面看看顯示效果:測試
![](http://static.javashuo.com/static/loading.gif)
這是呈現出的文檔瀏覽界面,流文檔也支持被選取和複製。this
咱們使用的這種流文檔容器擁有一些實用的內置功能,好比分頁瀏覽,下面就是第二頁的樣子:編碼
![](http://static.javashuo.com/static/loading.gif)
如今,把窗口拉大,測試一下流文檔的變化:url
![](http://static.javashuo.com/static/loading.gif)
它像極了HTML,這種自適應性可讓咱們輕鬆地在多種環境下閱讀。
![](http://static.javashuo.com/static/loading.gif)
如今對文檔進行放大,能夠看到,文字、圖像都被放大了。這種特性一樣爲多環境閱覽提供了有效的幫助,尤爲是咱們但願經過投影或屏幕展現文檔時。
![](http://static.javashuo.com/static/loading.gif)
這是分欄閱讀,可能比較適合有讀書習慣的人使用吧,我是以爲沒什麼意義。
![](http://static.javashuo.com/static/loading.gif)
帶滾動條的閱讀方式,比較適合用在網頁和桌面程序界面裏。
![](http://static.javashuo.com/static/loading.gif)
文本搜索功能,和IE裏差很少同樣簡陋~~
能夠想象一下,在之後,咱們使用一份文檔就能夠用於軟件幫助、手冊印刷、投影展現、網頁呈現(支持移動設備)以及更多應用(如盲人閱讀),而自始至終都不須要作任何修改或轉換。
嗯,爲了實現這一構想,咱們從如今作起,把硬編碼在程序中的流文檔分離出來:
分離出的流文檔文件:
Code
<!--流文檔-->
<FlowDocument xmlns="http://schemas.microsoft.com/netfx/2007/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<FlowDocument.Resources>
<!--標題圖形-->
<DrawingBrush x:Key="title" Stretch="Uniform">
<DrawingBrush.Drawing>
<DrawingGroup>
<DrawingGroup.Children>
<GeometryDrawing Brush="#FF959595" Geometry="F1 M 377.274,177.037L 366.042,177.037L 366.042,144.841L 359.373,165.254L 351.495,165.254L 344.826,144.841L 344.826,177.037L 334.218,177.037L 334.218,126.441L 347.605,126.441L 355.726,150.255L 363.877,126.441L 377.274,126.441L 377.274,177.037 Z ">
<GeometryDrawing.Pen>
<Pen Thickness="6.66667" LineJoin="Round" Brush="#FF959595"/>
</GeometryDrawing.Pen>
</GeometryDrawing>
<GeometryDrawing Brush="#FF959595" Geometry="F1 M 404.106,167.658L 404.106,159.016C 403.17,159.175 402.172,159.394 401.113,159.672C 400.053,159.95 399.25,160.255 398.704,160.587C 398.061,160.991 397.552,161.585 397.178,162.368C 396.805,163.151 396.618,164.168 396.618,165.417C 396.618,166.825 396.904,167.958 397.476,168.817C 398.048,169.676 398.968,170.106 400.235,170.106C 400.879,170.106 401.571,169.893 402.312,169.467C 403.053,169.041 403.651,168.438 404.106,167.658 Z M 404.106,173.452C 403.456,174.167 402.897,174.782 402.429,175.299C 401.961,175.815 401.311,176.34 400.479,176.874C 399.77,177.329 398.969,177.701 398.076,177.99C 397.182,178.279 396.124,178.423 394.902,178.423C 392.406,178.423 390.3,177.302 388.584,175.06C 386.868,172.819 386.01,169.915 386.01,166.348C 386.01,163.54 386.431,161.255 387.272,159.493C 388.114,157.731 389.357,156.313 391.002,155.237C 392.588,154.212 394.554,153.481 396.901,153.044C 399.247,152.607 401.668,152.288 404.164,152.086L 404.164,151.533C 404.164,149.382 403.586,147.896 402.429,147.077C 401.272,146.257 399.514,145.848 397.154,145.848C 396.439,145.848 395.718,145.952 394.99,146.162C 394.262,146.371 393.53,146.624 392.796,146.92C 392.159,147.172 391.538,147.467 390.934,147.802C 390.329,148.138 389.822,148.411 389.413,148.62L 388.506,148.62L 388.506,139.491C 389.468,139.137 391.01,138.722 393.132,138.245C 395.255,137.769 397.385,137.531 399.523,137.531C 402.019,137.531 404.181,137.758 406.007,138.213C 407.834,138.668 409.41,139.444 410.736,140.541C 412.023,141.588 413.008,142.956 413.69,144.646C 414.373,146.335 414.714,148.422 414.714,150.905L 414.714,177.037L 404.106,177.037L 404.106,173.452 Z ">
<GeometryDrawing.Pen>
<Pen Thickness="6.66667" LineJoin="Round" Brush="#FF959595"/>
</GeometryDrawing.Pen>
</GeometryDrawing>
<GeometryDrawing Brush="#FF959595" Geometry="F1 M 434.682,177.037L 424.074,177.037L 424.074,138.917L 434.682,138.917L 434.682,177.037 Z M 434.682,133.372L 424.074,133.372L 424.074,124.362L 434.682,124.362L 434.682,133.372 Z ">
<GeometryDrawing.Pen>
<Pen Thickness="6.66667" LineJoin="Round" Brush="#FF959595"/>
</GeometryDrawing.Pen>
</GeometryDrawing>
<GeometryDrawing Brush="#FF959595" Geometry="F1 M 455.274,177.037L 444.666,177.037L 444.666,124.362L 455.274,124.362L 455.274,177.037 Z ">
<GeometryDrawing.Pen>
<Pen Thickness="6.66667" LineJoin="Round" Brush="#FF959595"/>
</GeometryDrawing.Pen>
</GeometryDrawing>
<GeometryDrawing Brush="#FF959595" Geometry="F1 M 508.938,177.037L 497.706,177.037L 497.706,144.841L 491.037,165.254L 483.159,165.254L 476.49,144.841L 476.49,177.037L 465.882,177.037L 465.882,126.441L 479.268,126.441L 487.39,150.255L 495.541,126.441L 508.938,126.441L 508.938,177.037 Z ">
<GeometryDrawing.Pen>
<Pen Thickness="6.66667" LineJoin="Round" Brush="#FF959595"/>
</GeometryDrawing.Pen>
</GeometryDrawing>
<GeometryDrawing Brush="#FF959595" Geometry="F1 M 535.769,167.658L 535.769,159.016C 534.833,159.175 533.836,159.394 532.776,159.672C 531.717,159.95 530.914,160.255 530.368,160.587C 529.724,160.991 529.216,161.585 528.842,162.368C 528.468,163.151 528.281,164.168 528.281,165.417C 528.281,166.825 528.567,167.958 529.139,168.817C 529.711,169.676 530.631,170.106 531.899,170.106C 532.542,170.106 533.234,169.893 533.975,169.467C 534.716,169.041 535.315,168.438 535.769,167.658 Z M 535.769,173.452C 535.119,174.167 534.56,174.782 534.092,175.299C 533.624,175.815 532.974,176.34 532.142,176.874C 531.434,177.329 530.633,177.701 529.739,177.99C 528.845,178.279 527.787,178.423 526.565,178.423C 524.069,178.423 521.963,177.302 520.247,175.06C 518.531,172.819 517.673,169.915 517.673,166.348C 517.673,163.54 518.094,161.255 518.936,159.493C 519.778,157.731 521.021,156.313 522.665,155.237C 524.251,154.212 526.218,153.481 528.564,153.044C 530.911,152.607 533.332,152.288 535.828,152.086L 535.828,151.533C 535.828,149.382 535.249,147.896 534.092,147.077C 532.935,146.257 531.177,145.848 528.818,145.848C 528.103,145.848 527.381,145.952 526.653,146.162C 525.925,146.371 525.194,146.624 524.459,146.92C 523.822,147.172 523.202,147.467 522.597,147.802C 521.993,148.138 521.486,148.411 521.076,148.62L 520.169,148.62L 520.169,139.491C 521.131,139.137 522.674,138.722 524.796,138.245C 526.918,137.769 529.048,137.531 531.187,137.531C 533.683,137.531 535.844,137.758 537.671,138.213C 539.497,138.668 541.073,139.444 542.399,140.541C 543.686,141.588 544.671,142.956 545.354,144.646C 546.036,146.335 546.378,148.422 546.378,150.905L 546.378,177.037L 535.769,177.037L 535.769,173.452 Z ">
<GeometryDrawing.Pen>
<Pen Thickness="6.66667" LineJoin="Round" Brush="#FF959595"/>
</GeometryDrawing.Pen>
</GeometryDrawing>
<GeometryDrawing Brush="#FF959595" Geometry="F1 M 566.345,177.037L 555.737,177.037L 555.737,138.917L 566.345,138.917L 566.345,177.037 Z M 566.345,133.372L 555.737,133.372L 555.737,124.362L 566.345,124.362L 566.345,133.372 Z ">
<GeometryDrawing.Pen>
<Pen Thickness="6.66667" LineJoin="Round" Brush="#FF959595"/>
</GeometryDrawing.Pen>
</GeometryDrawing>
<GeometryDrawing Brush="#FF959595" Geometry="F1 M 586.937,177.037L 576.329,177.037L 576.329,124.362L 586.937,124.362L 586.937,177.037 Z ">
<GeometryDrawing.Pen>
<Pen Thickness="6.66667" LineJoin="Round" Brush="#FF959595"/>
</GeometryDrawing.Pen>
</GeometryDrawing>
<GeometryDrawing Geometry="F1 M 377.274,177.037L 366.042,177.037L 366.042,144.841L 359.373,165.255L 351.495,165.255L 344.826,144.841L 344.826,177.037L 334.218,177.037L 334.218,126.442L 347.604,126.442L 355.726,150.256L 363.877,126.442L 377.274,126.442L 377.274,177.037 Z ">
<GeometryDrawing.Pen>
<Pen Thickness="1.33333" LineJoin="Round" Brush="#FFCF7200"/>
</GeometryDrawing.Pen>
<GeometryDrawing.Brush>
<LinearGradientBrush StartPoint="0.5,0.934258" EndPoint="0.5,0.00654315">
<LinearGradientBrush.GradientStops>
<GradientStop Color="#FFF8B057" Offset="0"/>
<GradientStop Color="#FFFFD68A" Offset="1"/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</GeometryDrawing.Brush>
</GeometryDrawing>
<GeometryDrawing Geometry="F1 M 404.106,167.659L 404.106,159.017C 403.17,159.176 402.172,159.394 401.112,159.672C 400.053,159.95 399.25,160.255 398.704,160.587C 398.061,160.991 397.552,161.585 397.178,162.368C 396.805,163.152 396.618,164.168 396.618,165.417C 396.618,166.825 396.904,167.958 397.476,168.817C 398.048,169.677 398.967,170.106 400.235,170.106C 400.878,170.106 401.571,169.893 402.312,169.467C 403.053,169.041 403.651,168.438 404.106,167.659 Z M 404.106,173.453C 403.456,174.167 402.897,174.783 402.429,175.299C 401.961,175.815 401.311,176.34 400.479,176.875C 399.77,177.329 398.969,177.701 398.075,177.99C 397.182,178.279 396.124,178.423 394.902,178.423C 392.406,178.423 390.3,177.302 388.584,175.061C 386.868,172.819 386.01,169.915 386.01,166.348C 386.01,163.54 386.431,161.255 387.272,159.493C 388.114,157.732 389.357,156.313 391.002,155.237C 392.588,154.212 394.554,153.481 396.9,153.044C 399.247,152.607 401.668,152.288 404.164,152.086L 404.164,151.534C 404.164,149.382 403.586,147.897 402.429,147.077C 401.272,146.258 399.513,145.848 397.154,145.848C 396.439,145.848 395.717,145.953 394.989,146.162C 394.261,146.371 393.53,146.624 392.796,146.92C 392.159,147.173 391.538,147.467 390.933,147.803C 390.329,148.138 389.822,148.411 389.412,148.62L 388.506,148.62L 388.506,139.491C 389.468,139.137 391.01,138.722 393.132,138.246C 395.254,137.769 397.385,137.531 399.523,137.531C 402.019,137.531 404.18,137.758 406.007,138.213C 407.833,138.668 409.41,139.444 410.736,140.542C 412.023,141.588 413.007,142.957 413.69,144.646C 414.372,146.335 414.714,148.422 414.714,150.905L 414.714,177.037L 404.106,177.037L 404.106,173.453 Z ">
<GeometryDrawing.Pen>
<Pen Thickness="1.33333" LineJoin="Round" Brush="#FFCF7200"/>
</GeometryDrawing.Pen>
<GeometryDrawing.Brush>
<LinearGradientBrush StartPoint="0.500001,0.86046" EndPoint="0.500001,0.0843549">
<LinearGradientBrush.GradientStops>
<GradientStop Color="#FFF8B057" Offset="0"/>
<GradientStop Color="#FFFFD68A" Offset="1"/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</GeometryDrawing.Brush>
</GeometryDrawing>
<GeometryDrawing Geometry="F1 M 434.682,177.037L 424.074,177.037L 424.074,138.917L 434.682,138.917L 434.682,177.037 Z M 434.682,133.372L 424.074,133.372L 424.074,124.362L 434.682,124.362L 434.682,133.372 Z ">
<GeometryDrawing.Pen>
<Pen Thickness="1.33333" LineJoin="Round" Brush="#FFCF7200"/>
</GeometryDrawing.Pen>
<GeometryDrawing.Brush>
<LinearGradientBrush StartPoint="0.500001,0.589712" EndPoint="0.500001,0.351091">
<LinearGradientBrush.GradientStops>
<GradientStop Color="#FFF8B057" Offset="0"/>
<GradientStop Color="#FFFFD68A" Offset="1"/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</GeometryDrawing.Brush>
</GeometryDrawing>
<GeometryDrawing Geometry="F1 M 455.273,177.037L 444.665,177.037L 444.665,124.362L 455.273,124.362L 455.273,177.037 Z ">
<GeometryDrawing.Pen>
<Pen Thickness="1.33333" LineJoin="Round" Brush="#FFCF7200"/>
</GeometryDrawing.Pen>
<GeometryDrawing.Brush>
<LinearGradientBrush StartPoint="0.499996,0.589712" EndPoint="0.499996,0.351091">
<LinearGradientBrush.GradientStops>
<GradientStop Color="#FFF8B057" Offset="0"/>
<GradientStop Color="#FFFFD68A" Offset="1"/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</GeometryDrawing.Brush>
</GeometryDrawing>
<GeometryDrawing Geometry="F1 M 508.937,177.037L 497.705,177.037L 497.705,144.841L 491.036,165.255L 483.158,165.255L 476.489,144.841L 476.489,177.037L 465.881,177.037L 465.881,126.442L 479.268,126.442L 487.39,150.256L 495.541,126.442L 508.937,126.442L 508.937,177.037 Z ">
<GeometryDrawing.Pen>
<Pen Thickness="1.33333" LineJoin="Round" Brush="#FFCF7200"/>
</GeometryDrawing.Pen>
<GeometryDrawing.Brush>
<LinearGradientBrush StartPoint="0.499999,0.934258" EndPoint="0.499999,0.00654315">
<LinearGradientBrush.GradientStops>
<GradientStop Color="#FFF8B057" Offset="0"/>
<GradientStop Color="#FFFFD68A" Offset="1"/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</GeometryDrawing.Brush>
</GeometryDrawing>
<GeometryDrawing Geometry="F1 M 535.769,167.659L 535.769,159.017C 534.833,159.176 533.835,159.394 532.776,159.672C 531.716,159.95 530.914,160.255 530.368,160.587C 529.724,160.991 529.216,161.585 528.842,162.368C 528.468,163.152 528.281,164.168 528.281,165.417C 528.281,166.825 528.567,167.958 529.139,168.817C 529.711,169.677 530.631,170.106 531.898,170.106C 532.542,170.106 533.234,169.893 533.975,169.467C 534.716,169.041 535.314,168.438 535.769,167.659 Z M 535.769,173.453C 535.119,174.167 534.56,174.783 534.092,175.299C 533.624,175.815 532.974,176.34 532.142,176.875C 531.434,177.329 530.633,177.701 529.739,177.99C 528.845,178.279 527.787,178.423 526.565,178.423C 524.069,178.423 521.963,177.302 520.247,175.061C 518.531,172.819 517.673,169.915 517.673,166.348C 517.673,163.54 518.094,161.255 518.936,159.493C 519.778,157.732 521.021,156.313 522.665,155.237C 524.251,154.212 526.217,153.481 528.564,153.044C 530.91,152.607 533.332,152.288 535.828,152.086L 535.828,151.534C 535.828,149.382 535.249,147.897 534.092,147.077C 532.935,146.258 531.177,145.848 528.817,145.848C 528.102,145.848 527.381,145.953 526.653,146.162C 525.925,146.371 525.194,146.624 524.459,146.92C 523.822,147.173 523.201,147.467 522.597,147.803C 521.992,148.138 521.485,148.411 521.076,148.62L 520.169,148.62L 520.169,139.491C 521.131,139.137 522.673,138.722 524.796,138.246C 526.918,137.769 529.048,137.531 531.187,137.531C 533.683,137.531 535.844,137.758 537.67,138.213C 539.497,138.668 541.073,139.444 542.399,140.542C 543.686,141.588 544.671,142.957 545.353,144.646C 546.036,146.335 546.377,148.422 546.377,150.905L 546.377,177.037L 535.769,177.037L 535.769,173.453 Z ">
<GeometryDrawing.Pen>
<Pen Thickness="1.33333" LineJoin="Round" Brush="#FFCF7200"/>
</GeometryDrawing.Pen>
<GeometryDrawing.Brush>
<LinearGradientBrush StartPoint="0.499998,0.86046" EndPoint="0.499998,0.0843549">
<LinearGradientBrush.GradientStops>
<GradientStop Color="#FFF8B057" Offset="0"/>
<GradientStop Color="#FFFFD68A" Offset="1"/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</GeometryDrawing.Brush>
</GeometryDrawing>
<GeometryDrawing Geometry="F1 M 566.345,177.037L 555.737,177.037L 555.737,138.917L 566.345,138.917L 566.345,177.037 Z M 566.345,133.372L 555.737,133.372L 555.737,124.362L 566.345,124.362L 566.345,133.372 Z ">
<GeometryDrawing.Pen>
<Pen Thickness="1.33333" LineJoin="Round" Brush="#FFCF7200"/>
</GeometryDrawing.Pen>
<GeometryDrawing.Brush>
<LinearGradientBrush StartPoint="0.499997,0.589712" EndPoint="0.499997,0.351091">
<LinearGradientBrush.GradientStops>
<GradientStop Color="#FFF8B057" Offset="0"/>
<GradientStop Color="#FFFFD68A" Offset="1"/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</GeometryDrawing.Brush>
</GeometryDrawing>
<GeometryDrawing Geometry="F1 M 586.937,177.037L 576.329,177.037L 576.329,124.362L 586.937,124.362L 586.937,177.037 Z ">
<GeometryDrawing.Pen>
<Pen Thickness="1.33333" LineJoin="Round" Brush="#FFCF7200"/>
</GeometryDrawing.Pen>
<GeometryDrawing.Brush>
<LinearGradientBrush StartPoint="0.499994,0.589712" EndPoint="0.499994,0.351091">
<LinearGradientBrush.GradientStops>
<GradientStop Color="#FFF8B057" Offset="0"/>
<GradientStop Color="#FFFFD68A" Offset="1"/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</GeometryDrawing.Brush>
</GeometryDrawing>
</DrawingGroup.Children>
</DrawingGroup>
</DrawingBrush.Drawing>
</DrawingBrush>
<!--MailMail字符突出顯示樣式-->
<Style x:Key="MailMailStyle" TargetType="Run">
<Setter Property="FontFamily" Value="Nina"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Foreground" Value="#FFF88900"/>
</Style>
</FlowDocument.Resources>
<!--標題,一個方形圖形填充MailMail標誌,後跟「簡介」二字-->
<!--Paragraph,段落,至關於HTML的<p>-->
<Paragraph FontWeight="Bold" FontSize="18">
<Rectangle Fill="{StaticResource title}" Height="44" Width="190" Margin="0,0,6,0"/> 簡介
</Paragraph>
<!--內容-->
<Paragraph>
<!--內嵌環繞區域-->
<Figure Width="160" Height="150" Padding="4" Margin="2">
<!--流文檔內的控件容器-->
<BlockUIContainer>
<!--一個帶邊框的圖片-->
<Border SnapsToDevicePixels="True" BorderThickness="1" Padding="3" BorderBrush="#999">
<Image Source="http://images.cnblogs.com/cnblogs_com/skyd/8.jpg" Stretch="UniformToFill" />
</Border>
</BlockUIContainer>
</Figure>
<!--Run,內聯字符串,貌似和使用Span沒什麼區別,至關於HTML的<span>-->
<Run Style="{StaticResource MailMailStyle}">MailMail</Run> 是一款獨特的郵件發送工具,或許它獨特到你從未感覺過的地步,它可以使你經過輕鬆、簡單、愉快的操做完成平常郵件發送操做,固然,它確定不是因「會發郵件」而獨特,而是在於「怎麼發」,相信我,你必定要本身來感覺一下。
</Paragraph>
<Paragraph>
經過
<Run Style="{StaticResource MailMailStyle}">MailMail</Run> ,你能夠達成不少你所不曾嘗試的郵箱應用,如備份文件、分享音樂、分發資料、提交工做文檔、羣發消息等,
<Run Style="{StaticResource MailMailStyle}">MailMail</Run> 提供了巧妙的選項設置及完善的配置系統讓你駕輕就熟地作這些事。
</Paragraph>
<Paragraph>
固然,好東西也有壞處:
<Run Style="{StaticResource MailMailStyle}">MailMail</Run> 會讓你的郵件服務商頭大,由於他們許諾的1G、2G、5G空間可能都要被你充分利用掉。是的,你有很高概率發上癮,就像一句老話:「一發不可收拾」。
</Paragraph>
<Paragraph>
<!--LineBreak,換行符,至關於HTML的<br/>-->
<LineBreak/>
相關網址:
</Paragraph>
<!--List,列表,至關於HTML的<ul>-->
<List>
<!--ListItem,列表項,至關於HTML的<li>-->
<ListItem>
<Paragraph>
<!--Hyperlink,超連接,至關於HTML的<a>-->
介紹及幫助:<Hyperlink NavigateUri="http://www.cnblogs.com/SkyD/archive/2008/08/09/1264083.html">http://www.cnblogs.com/SkyD/archive/2008/08/09/1264083.html</Hyperlink>
</Paragraph>
</ListItem>
<ListItem>
<Paragraph>
問題反饋及建議提交:<Hyperlink NavigateUri="http://www.cnblogs.com/SkyD/articles/1264078.html">http://www.cnblogs.com/SkyD/articles/1264078.html</Hyperlink>
</Paragraph>
</ListItem>
<ListItem>
<Paragraph>
更新信息及下載:<Hyperlink NavigateUri="http://www.cnblogs.com/SkyD/articles/1264080.html">http://www.cnblogs.com/SkyD/articles/1264080.html</Hyperlink>
</Paragraph>
</ListItem>
</List>
</FlowDocument>
很長啊,主要是由於我把以前那個標題圖形資源「title」給加進來了。
咱們在這裏取消了超連接的事件,而且將一些通用的樣式定義也取消了,由於咱們要的是一個比較乾淨、純粹的獨立文檔,通用的樣式應該留給使用方去按需求定義。
一個聽起來不錯的消息是:它如今能夠直接被IE打開並閱讀了
IE也自動使用咱們以前用過的流文檔閱讀器來呈現流文檔。
接下來還要修改一下咱們先前的程序,以使之能載入這個文檔。
Code
<Window x:Class="流文檔.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="376" Width="540">
<Grid>
<Grid.Resources>
<!--超連接樣式-->
<Style TargetType="Hyperlink">
<!--設置單擊超連接的事件處理程序-->
<EventSetter Event="Click" Handler="Hyperlink_Click"/>
<Setter Property="Foreground" Value="#209AC2"/>
<!--清除文字修飾(去掉下劃線)-->
<Setter Property="TextBlock.TextDecorations" Value="{x:Null}"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="#F27D00" />
<!--在鼠標懸停時顯示下劃線-->
<Setter Property="TextBlock.TextDecorations">
<Setter.Value>
<TextDecorationCollection>
<TextDecoration Location="Underline"/>
</TextDecorationCollection>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
<!--段落樣式-->
<Style TargetType="Paragraph">
<Setter Property="Margin" Value="8"/>
</Style>
</Grid.Resources>
<!--流文檔閱讀器-->
<FlowDocumentReader TextElement.Foreground="#647474" Loaded="FlowDocumentReader_Loaded"/>
</Grid>
</Window>
這是修改後的前臺代碼。
超連接樣式定義中加入了一個事件設置器,爲超連接的點擊事件設置爲先前的處理程序。
流文檔閱讀器增長一個事件用於在讀取後載入咱們分離出去的流文檔。
Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Markup;
using System.IO;
namespace 流文檔
{
/// <summary>
/// Window1.xaml 的交互邏輯
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void Hyperlink_Click(object sender, RoutedEventArgs e)
{
System.Diagnostics.Process.Start((sender as Hyperlink).NavigateUri.ToString());
}
private void FlowDocumentReader_Loaded(object sender, RoutedEventArgs e)
{
(sender as FlowDocumentReader).Document = XamlReader.Load(new FileStream("MailMailDoc.xaml", FileMode.Open)) as FlowDocument;
}
}
}
後臺就是兩個事件處理,很簡單。
這樣就能夠完美還原到咱們以前所做的效果了,爲了提升感性認識,我把前面的貼圖再弄過來個充數~~
總結一下,流文檔技術如今還不能讓人滿意:應用覆蓋面低,就連SilverLight都沒有對其支持;沒有配套編輯軟件,如今手寫代碼是最好的編輯流文檔的途徑,使用RichTextBox只能進行比較簡單的格式編輯,期待下一版的Office可以全力支持這一新格式。
這些問題的解決應該都只是時間問題,流文檔的設計很是簡約、完善,定位十分準確,相信會成爲將來網絡文檔的主要載體。
或許有人會問,這麼一個和HTML極度類似的東西有什麼意義?
首先他和HTML定位不同,至少是和HTML如今的定位不同。咱們拿到一個流文檔,很明確的知道它就是一份文檔;但拿到一個HTML,即便它格式再規範,咱們也不肯定它是什麼東西,它裏面可能摻雜了不少頁頭、頁腳、導航連接、菜單、佈局塊、側邊欄、腳本等等,它就是個大雜燴,咱們的程序並不喜歡這種不肯定的東西。
HTML設計之初也就是用於呈現簡單的文檔,但如今日益膨脹的應用,使得它不得不本身承擔起佈局、美化、處理交互等等行爲;而咱們WPF徹底不需顧慮這些,一個簡單到乏味的DockPanel在2分鐘內創造的佈局,使用CSS+XHTML可能須要半小時甚至更多的時間才能建立並調試完成,而當咱們決定從新調整佈局位置時也能一樣輕鬆的完成,換成CSS就是在經歷噩夢了(是的,它之前就是這麼說表格佈局的,事實證實,它們都是噩夢),而Grid更是會讓全部網頁設計師撓牆。
因此你不會看到我去絞盡腦汁地將一個TextBlock定義爲一個側邊欄,或是將一個List變爲導航菜單,WPF有更精確、更適用的元素用於佈局和交互,而HTML不得不靠整容來完成,那些隨之產生的無語義的標記就好像墊鼻樑、鹽水袋豐胸同樣讓我以爲噁心。
HTML如今被廣泛稱之爲網頁,是的,你閉着眼睛也能在互聯網上找到不少HTML「頁」,但你很難見到一份HTML「文檔」。WPF的Page就是頁、Window就是窗口、Document就是文檔,很是清晰明確。
HTML混亂、陳舊的現狀其實就是WPF的巨大機遇,這也應該就是微軟的野心所向,單純以技術能力來說,WPF能夠絕不費力的橫掃HTML、Flash、AIR,其所欠缺的,就是咱們的推進了。
原本還想寫出流文檔的編輯和輸出呢,一看都2W多字了~~下次再說了~~~
源文件