WPF自學筆記(一):簡易記事本(Rich TextBox)

  本文利用WPF的Rich TextBox控件製作簡易的記事本,實現文本文檔的打開與閱讀。曾嘗試利用SetParent()方法把windows自帶的記事本嵌入到WPF中,但是按鈕較小,不適合項目需要。因此纔想着利用Rich TextBox控件自己做。

界面框架

  在XAML中放入一個Rich TextBox(用來顯示文檔)和5個Button(作用分別是打開文件、上一行、下一行、上一頁和下一頁)

      <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="108"/>
                <RowDefinition Height="108"/>
                <RowDefinition Height="108"/>
                <RowDefinition Height="107"/>
                <RowDefinition Height="107"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="126"/>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="957"/>
            </Grid.ColumnDefinitions>
            <Button x:Name="Openbt" Style="{StaticResource btStyle}" 
                    Grid.Row="0" Grid.Column="0" Width="124"  
                    Content="打開文件&#xD;&#xA;OpenFile" Click="Openbt_Click"/>
            <Button x:Name="Lastlbt" Style="{StaticResource btStyle}" 
                    Grid.Row="1" Grid.Column="0" Width="124"  
                    Content=" 上一行&#xD;&#xA;LastLine" Click="Lastl_Click"/>
            <Button x:Name="Nextlbt" Style="{StaticResource btStyle}" 
                    Grid.Row="2" Grid.Column="0" Width="124"  
                    Content=" 下一行&#xD;&#xA;NextLine" Click="Nextl_Click"/>
            <Button x:Name="Lastpbt" Style="{StaticResource btStyle}" 
                    Grid.Row="3" Grid.Column="0"  Width="124"
                    Content=" 上一頁&#xD;&#xA;LastPage" Click="Lastp_Click" />
            <Button x:Name="Nextpbt" Style="{StaticResource btStyle}" 
                    Grid.Row="4" Grid.Column="0" Width="124"
                    Content=" 下一頁&#xD;&#xA;NextPage" Click="Nextp_Click"/>
            <RichTextBox x:Name="richtb" Grid.Row="0" Grid.RowSpan="5" Grid.Column="2"       
                    FontSize="18"/>
       </Grid>

按鈕樣式

  注意,上面使用了Grid.RowDefinitions把Grid分成了5行3列方便佈局。Button使用了Style=”{StaticResource btStyle}”統一外觀。其Style代碼如下所示:

    <Window.Resources>
        <Style x:Key="btStyle" TargetType="{x:Type Button}">
            <Setter Property="Background" Value="#FF0091FF"/>
            <Setter Property="Foreground" Value="#FFFFE100"/>
            <Setter Property="FontSize" Value="18"/>
            <Setter Property="FontWeight" Value="Bold"/>
        </Style>
    </Window.Resources>

  最後得到的界面外觀圖如下所示:

這裏寫圖片描述

  左側爲五個功能按鈕,右側爲Rich TextBox顯示區域。

瀏覽文件按鈕

  瀏覽文件功能需要使用windows API Code Pack,VS2015中好像集成的有,添加引用就好了。我使用的VS2013,所以需要安裝。VS打開工程,找到“工具”>>“庫程序包管理器”>>”程序包管理器控制檯”,輸入:

這裏寫圖片描述

這裏寫圖片描述

  安裝完成之後,會自動添加引用到工程:

這裏寫圖片描述

  添加命名空間

using Microsoft.WindowsAPICodePack.Dialogs;

  下面寫“打開文件”按鈕的Click

        private void Openbt_Click(object sender, RoutedEventArgs e)
        {
            CommonOpenFileDialog cofd2 = new CommonOpenFileDialog();
            cofd2.Filters.Add(new CommonFileDialogFilter("文檔文件", "*.txt"));

            string str = null;
            if (cofd2.ShowDialog() == CommonFileDialogResult.Ok)
            {
                FilePath = cofd2.FileName;

                FileStream myfile = new FileStream(FilePath, FileMode.Open, FileAccess.Read);  
                StreamReader reader = new       
                StreamReader(myfile, System.Text.Encoding.Default);                  
                str = rder.ReadToEnd();             
             }

            richtb.Document.Blocks.Clear();            
            richtb.Document.Blocks.Add(new Paragraph(new Run(str))); //顯示內容
        }

  上面最後兩句代碼的richtb爲界面中Rich TextBox的名字。這裏需要注意,可能很多博客裏面會使用Rich TextBox.LoadFile()直接加載文檔,但是這個只是System.Windows.Forms中的Rich TextBox。在WPF中的Rich TextBox是沒有這個方法的。而我們知道,System.Windows.Forms中的控件,在界面中會默認置頂的,所以會遮擋其它WPF控件,可能會產生其他後續問題。經過實際測試:

richtb.Document.Blocks.Add(new Paragraph(new Run(str)));

  這句代碼打開文檔的效率很高, 不會出現界面卡頓延遲的情況,點擊“打開文件”運行效果圖如下。

這裏寫圖片描述

  打開文檔之後:

這裏寫圖片描述

  Rich TextBox有豐富的文本格式,所以上面顯示的字體,背景等屬性都是可以自己定義的,不再贅述。

其它按鈕

  其它四個按鈕(上一行,下一行,上一頁,下一頁)的Click直接在裏面使用Rich TextBox自帶的方法就可以了。

        private void Lastl_Click(object sender, RoutedEventArgs e)
        {
            richtb.LineUp();
        }
        private void Nextl_Click(object sender, RoutedEventArgs e)
        {
            richtb.LineDown();
        }
        private void Lastp_Click(object sender, RoutedEventArgs e)
        {
            richtb.PageUp();
        }
        private void Nextp_Click(object sender, RoutedEventArgs e)
        {
            richtb.PageDown();
        }

總結

代碼自己敲出來的纔是自己的。繼續努力!

發佈了29 篇原創文章 · 獲贊 59 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章