案例介绍

实现一个简单的备忘录程序,程序启动后,出现在桌面右上角(为了看上去更简洁,去掉了标题栏,并且去除了任务栏中的图标)

主要功能

  • 双击打开后,可以在窗体中输入备忘录内容。双击可以改变文本的编辑状态(可编辑,不可编辑)
  • 窗体加载时,去指定路径下查找指定的XML文档(用来存储备忘内容),如果存在,则加载最近一次节点的内容,如不存在,则不做操作
  • 每次当窗体中文本发生改变时,触发定时器,5分钟之后自动保存,如期间手动保存,则终止计时。如未手动保存,则5分钟之后自动保存后终止计时器
  • 监听窗体内按钮事件(注意并非全局按钮事件),Ctrl + S :保存; Ctrl + Q : 保存并退出
  • 设置文本改变标识符,全局记录文本是否变化。文本若未改变,手动保存时不写入XML文档(避免多次Ctrl + S 手动保存造成XML文档中大量重复数据)
  • 程序退出前自动保存最新文本记录

由于初学XML,所以尝试使用XML写了这个案例,仅为一次学习过程中的练习,不足之处望多指正!


WPF窗体主要代码

<Window x:Class="WpfApplication1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="memoire" Height="360" Width="280" WindowStyle="None" ResizeMode="NoResize" Background="Cornsilk" Topmost="False" ShowInTaskbar="False"WindowStartupLocation="Manual" Loaded="Grid_Loaded_1" Closing="Window_Closing_1" MouseDoubleClick="rbox_1_MouseDoubleClick_1" KeyDown="Window_KeyDown_1"><Grid Margin="0,0,0,0"><RichTextBox HorizontalAlignment="Left" Margin="0,0,0,10" VerticalAlignment="Top" Background="Transparent" Name="rbox_1" MouseDoubleClick="rbox_1_MouseDoubleClick_1" TextChanged="rbox_1_TextChanged_1" FontFamily="楷体" FontSize="20" FontWeight="Bold"><FlowDocument><Paragraph><Run Text=""/></Paragraph></FlowDocument></RichTextBox><!--<Button Content="" HorizontalAlignment="Left" Margin="270,350,0,0" Width="10" Name="btn_1" Click="btn_1_Click"/>--></Grid>
</Window>

C#后台主要代码

using System;
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Threading;
using System.Xml;namespace WpfApplication1 {/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{//创建定时器对象DispatcherTimer dispatcherTimer = new DispatcherTimer();//定义全局标识区分文本是否发生改变  如未改变 则手动保存后不写入文档(避免手动多次control + S占用)bool isChange = false;public MainWindow(){InitializeComponent();dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);dispatcherTimer.Interval = new TimeSpan(0, 0, 300);dispatcherTimer.IsEnabled = false;}/// <summary>/// 按钮点击事件 关闭窗口  暂时取消按钮(关闭窗口功能由 control + Q 完成)/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_1_Click(object sender, RoutedEventArgs e){Close();}/// <summary>/// 窗体加载时默认位置出现在桌面右上角  并加载上次关闭时的文本  默认文本状态为只读(双击改变为可编辑)/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Grid_Loaded_1(object sender, RoutedEventArgs e){Left = SystemParameters.PrimaryScreenWidth - Width;Top = 0;// SystemParameters.PrimaryScreenHeight;ReadLineXML("memoire.xml");rbox_1.IsReadOnly = true;isChange = false;}/// <summary>/// 双击窗体或文本域 改变文本的只读状态/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void rbox_1_MouseDoubleClick_1(object sender, MouseButtonEventArgs e){//rbox_1.Selection.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Gray);rbox_1.IsReadOnly = rbox_1.IsReadOnly ? false : true;}/// <summary>/// 定时执行    文本发生改变时触发计时  ///     5分钟后如果未手动保存则触发自动保存 如手动保存或关闭程序则终止计时  自动保存触发后终止计时 下次文本改变后重新触发/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void dispatcherTimer_Tick(object sender, EventArgs e){CreateXML();dispatcherTimer.Stop();}/// <summary>/// 新建/追加XML文档/// </summary>private void CreateXML(){if (!isChange) { return; }XmlDocument xml = new XmlDocument();//创建根节点对象XmlElement root;//新建或加载XML文件if (!File.Exists("memoire.xml")){XmlDeclaration header = xml.CreateXmlDeclaration("1.0", "UTF-8", null);xml.AppendChild(header);root = xml.CreateElement("memoire");xml.AppendChild(root);}else{xml.Load("memoire.xml");root = xml.DocumentElement;}//momoireText节点的Index属性每次保存时自增 方便直接读取最新记录int index = 0;if (xml.SelectNodes("/memoire/momoireText").Count > 0){index = xml.SelectNodes("/memoire/momoireText").Cast<XmlNode>().ToList().Select(p => int.Parse(p.Attributes["Index"].Value)).Max();}//创建momoireText节点 包含创建时间、序号两个属性  时间取系统时间  序号自动递增XmlElement memoireText = xml.CreateElement("momoireText");memoireText.SetAttribute("DateTime", DateTime.Now.ToString());memoireText.SetAttribute("Index", (++index).ToString());root.AppendChild(memoireText);//输入的文本逐行读取并保存TextRange tr = new TextRange(rbox_1.Document.ContentStart, rbox_1.Document.ContentEnd);string text = tr.Text;string[] items = text.Split("\r\n".ToArray(), StringSplitOptions.RemoveEmptyEntries);int seq = 0;foreach (var item in items){XmlElement mItem = xml.CreateElement("mItems");mItem.SetAttribute("Seq", seq++.ToString());mItem.SetAttribute("Content", item);mItem.SetAttribute("Status", "1");memoireText.AppendChild(mItem);}xml.Save("memoire.xml");isChange = false;//默认首次加载时 因为要读取上次关闭之前的文档 isChange会变为true 所以需要在加载完成后将其重新置为false}/// <summary>/// 读取XML文档/// </summary>/// <param name="fileName"></param>private void ReadLineXML(string fileName){XmlDocument xml = new XmlDocument();//加载XML文档if (!File.Exists("memoire.xml")) { return; }xml.Load(fileName);XmlElement root = xml.DocumentElement;//获取根节点//取Index值最大的momoireText节点中的所有子节点及其属性(即最新的一次保存记录)int index = xml.SelectNodes("/memoire/momoireText").Cast<XmlNode>().Select(p => int.Parse(p.Attributes["Index"].Value)).Max();XmlNodeList xnl = xml.SelectNodes("/memoire/momoireText[@Index='" + index.ToString() + "']/mItems");//读取XML文件 并加载foreach (XmlNode item in xnl){//string text = item.Attributes["Seq"].InnerText;string value = item.Attributes["Content"].Value;rbox_1.AppendText(value + "\r\n");}//xml.RemoveAll();}/// <summary>/// 程序退出时 自动保存/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Window_Closing_1(object sender, System.ComponentModel.CancelEventArgs e){CreateXML();}/// <summary>/// 键盘监听 按下control + Q 时 保存并退出  按下control + S 时 保存文本/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Window_KeyDown_1(object sender, KeyEventArgs e){if (Keyboard.IsKeyDown(Key.LeftCtrl) && Keyboard.IsKeyDown(Key.Q)){Close();}if (Keyboard.IsKeyDown(Key.LeftCtrl) && Keyboard.IsKeyDown(Key.S)){CreateXML();dispatcherTimer.Stop();}}/// <summary>/// 每次文本内容改变时  开启定时器 5 分钟后自动保存/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void rbox_1_TextChanged_1(object sender, TextChangedEventArgs e){isChange = true;dispatcherTimer.Start();}}
}

【C#案例】WPF + XML 本地备忘录相关推荐

  1. Spring配置XML本地提示:点击eclipse属性——选择XML Catalog

    Spring配置XML本地提示:点击eclipse属性-->选择XML Catalog

  2. wpf+xml实现的一个随机生成早晚餐的小demo

    话说每到吃完的时间就发愁,真的不知道该吃什么,然后就想到做一个生成吃什么的小软件,既然这个软件如此的简单,就打算用wpf开发吧,也不用数据库了,直接保存在xml中就可以了 程序整体结构如下图 首先我写 ...

  3. 使用Mapreduce案例编写用于统计文本中单词出现的次数的案例、mapreduce本地运行等,Combiner使用及其相关的知识,流量统计案例和流量总和以及流量排序案例,自定义Partitioner

    工程结构: 在整个案例过程中,代码如下: WordCountMapper的代码如下: package cn.toto.bigdata.mr.wc; import java.io.IOException ...

  4. WPF浏览本地html页面,并实现js交互

    1.nuget添加cefsharp 声明 xmlns:wpf="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"在xaml文件中使 ...

  5. ssm使用全注解实现增删改查案例——web.xml

    <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" ...

  6. ssm使用全注解实现增删改查案例——mybatis-config.xml

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC & ...

  7. ssm使用全注解实现增删改查案例——applicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  8. ssm使用全注解实现增删改查案例——applicationContext-servlet.xml

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  9. struts+hibernate+oracle+easyui实现lazyout组件的简单案例——struts.xml配置详情

    最后我们来看一下struts.xml里面是怎么配置的呢, struts.xml: <?xml version="1.0" encoding="UTF-8" ...

最新文章

  1. python 去除str的引号 去除括号_Python基础教程:运算符以及数据类型解析
  2. STM32 电机教程 21 - 基于ST MCLIB无感FOC 与 有感FOC 代码差异分析
  3. 关于css知识要点总结大全
  4. 机器学习篇-指标:AUC
  5. Java多线程系列(三):Java线程池的使用方式,及核心运行原理
  6. unity串口 连接多个串口崩溃_3分钟全面了解串口服务器原理技术
  7. python中lastch_python复习笔记
  8. 《oracle每日一练》oralce数据库的导入导出
  9. Uber再受万点暴击:亚利桑那州无限期吊销其路测资格
  10. MapXtreme2005开发的经典问题
  11. java上下载不了jdk_新手想学java,到哪里下载jdk?我在甲骨文官网下载jdk下载不了。...
  12. 学生用计算机如何解方程,学生党必备神器!一键解方程计算器App
  13. 客户下单邮件跟进书写
  14. 物联网工程设计与实施
  15. debian8.4安装sqliteman总结
  16. windowspython专用装B代码
  17. 后门程序技术知识全面深解
  18. linux基础之系统安装
  19. oracle获取每月的第一天和最后一天
  20. 树莓派 Pico Clion开发

热门文章

  1. LeetCode面试题 01.02. 判定是否互为字符重排
  2. TD-SCDMA与TD-LTE的切换
  3. 蓝海卓越AP功能简述
  4. LINUX 安装MegaRAID Storage Manager (MSM)安装使用教程
  5. 下载官方Skype的link。
  6. 前端路线--Vue(day01)
  7. 团队协作工具新锐—Teamin使用初体验
  8. 【Unity球体移动】
  9. 云顶之弈法机器人_云顶之弈里面出现了一个雷电法王,机器人一个勾自己没了!...
  10. MATLAB-矩阵求解特征值,特征向量,以及特征向量标准化。