wpf 研习1-24小时自学wpf8

A real-world program

 

basic application layout
wpf 研习1-24小时自学wpf8
  

<Window x:Class="TextEditor.MainWindow"
                xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                Title="Text Editor"
                Height="600"
                Width="800">
        <DockPanel>
                <Menu x:Name="menu"
                            DockPanel.Dock="Top" />
                <ToolBarTray x:Name="toolbar"
                                      DockPanel.Dock="Top" />
                <StatusBar DockPanel.Dock="Bottom">
                        <TextBlock x:Name="status" />
                </StatusBar>
                <RichTextBox x:Name="body"
                                      SpellCheck.IsEnabled="True"
                                      AcceptsReturn="True"
                                      AcceptsTab="True"
                                      BorderThickness="0 2 0 0" />
        </DockPanel>
</Window> 

 
toolbars with quick-access

<ToolBarTray>
     <ToolBar>
         <Button ToolTip="Open">
               <Image Source="Icons/folder_page.png" />
         </Button>
         <Button ToolTip="Save">
               <Image Source="Icons/page_save.png" />
         </Button>
     </ToolBar>
</ToolBarTray>


increasing maintainability

导入xml名字空间:xmlns:name="clrnamespace:clrNamespace;

                                                assembly=assembly.dll"

 

TextEditorToolbar.xaml.cs代码

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
   for (double i = 8; i < 48; i += 2)
   {
      fontSize.Items.Add(i);
   }
}

 

<UserControl x:Class="TextEditor.TextEditorToolbar"
                      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                      Loaded="UserControl_Loaded">
        <ToolBarTray>
               <ToolBar>
                   <Button ToolTip="Open">
                           <Image Source="Icons/folder_page.png" />
                   </Button>
                   <Button ToolTip="Save">
                           <Image Source="Icons/page_save.png" />
                   </Button>
               </ToolBar>

.........

 

using menu


wpf 研习1-24小时自学wpf8
 

TextEditorMenu.xaml.cs代码

private void About_Click(object sender, RoutedEventArgs e)
{
      MessageBox.Show("Teach Yourself WPF in 24 Hours - Text Editor”,"About”);
}

 

<UserControl x:Class="TextEditor.TextEditorMenu"
                         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Menu>
        <MenuItem Header="_File">
           <MenuItem Header="_New" />
           <MenuItem Header="_Open" />
           <MenuItem Header="_Save" />
           <MenuItem Header="Save As" />
           <Separator />
                  <MenuItem Header="_Print" />
           <Separator />
           <MenuItem Header="Close" />
        </MenuItem>

 .......

 

RichTextBox

FlowDocument(Powerful!Some of the major features supported by FlowDocument are Block elements like Paragraph, Section, List, and Table. When these elements are combined with those mentioned earlier in this hour, almost any document layout can be achieved.);

ItemsControl;

TextRange(To save or load the content of a RichTextBox);

 

DocumentManager.cs

using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using Microsoft.Win32;

namespace TextEditor
{
    public class DocumentManager
    {
        private string _currentFile;
        private readonly RichTextBox _textBox;

        public DocumentManager(RichTextBox textBox)
        {
            _textBox = textBox;
        }

        public bool CanSaveDocument()
        {
            return !string.IsNullOrEmpty(_currentFile);
        }

        public void ApplyToSelection(DependencyProperty property, object value)
        {
            if (value != null)
                _textBox.Selection.ApplyPropertyValue(property, value);
        }

        public void NewDocument()
        {
            _currentFile = null;
            _textBox.Document = new FlowDocument();
        }

        public bool OpenDocument()
        {
            OpenFileDialog dlg = new OpenFileDialog();

            if (dlg.ShowDialog() == true)
            {
                _currentFile = dlg.FileName;

                using (Stream stream = dlg.OpenFile())
                {
                    TextRange range = new TextRange(_textBox.Document.ContentStart, _textBox.Document.ContentEnd);
                    range.Load(stream, DataFormats.Rtf);
                }

                return true;
            }

            return false;
        }

        public bool SaveDocument()
        {
            if (string.IsNullOrEmpty(_currentFile)) return SaveDocumentAs();
            else
            {
                using (Stream stream = new FileStream(_currentFile, FileMode.Create))
                {
                    TextRange range = new TextRange(_textBox.Document.ContentStart, _textBox.Document.ContentEnd);
                    range.Save(stream, DataFormats.Rtf);
                }

                return true;
            }
        }

        public bool SaveDocumentAs()
        {
            SaveFileDialog dlg = new SaveFileDialog();

            if (dlg.ShowDialog() == true)
            {
                _currentFile = dlg.FileName;
                return SaveDocument();
            }

            return false;
        }
    }
}

 

详细程序见 附件1