[C# 项目实战]: 制作一个备忘录(经典)
01
—
概述
前几天群里有人问如何制作备忘录,感觉这样一个小实例挺适合新手们入门学习使用,所以就抽空做了出来。界面如下图
这个备忘录主要包括了如下功能:
① 备忘录信息的增、删、改、查;
② 备忘录时间到了以后进行语音播报。
功能很简单,但是要实现这么一个功能,也涉及众多的知识点,接下来详细进行分解。
02
—
内容详述
①界面button的图标
图标图片可以上网上下载,下载好以后放到项目目录中,然后在项目中找到你的图片——>右键包括在项目中——>再右键,点击属性:
复制到输出目录,更改为始终复制。
生成操作,更改为内容。
前台XMAL操作:
1 2 3 4 5 6 | <Button Margin= "15,5" MinWidth= "60" cal:Message.Attach= "[Event Click] = [Action SearchClick]" > <WrapPanel > <Image Source= "/Images/search.png" Width= "15" Height= "15" /> <TextBlock Text= "查找" VerticalAlignment= "Center" /> </WrapPanel> </Button> |
② 数据源:这里我采用从xml读取并绑定到界面,界面如果有修改,在页面退出时进行数据保存,当然你也可以使用数据库去操作
XML文件位置:根目录的RawData
XML文件数据内容如下:
MemorandumModel数据模型定义:
1 2 3 4 5 6 7 | public class MemorandumModel { public string Title { get ; set ; } public EvenType EvenType { get ; set ; } public DateTime DateTime { get ; set ; } public bool IsComplete { get ; set ; } } |
③XML文件的读取和保存:MemorandumRealList是我们所有数据的集合,为了方便界面查询,界面绑定了MemorandumShowList 这个集合
xml读取:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public void XmlDocReader() { //XmlDocument读取xml文件 XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(XmlDocPath); //获取xml根节点 XmlNode xmlRoot = xmlDoc.DocumentElement; if (xmlRoot == null ) return ; //读取所有的节点 foreach (XmlNode node in xmlRoot.SelectNodes( "MemorandumModel" )) { MemorandumRealList.Add( new MemorandumModel() { Title = node.SelectSingleNode( "Title" ).InnerText, EvenType = (EvenType)Enum.Parse( typeof (EvenType), node.SelectSingleNode( "EvenType" ).InnerText), DateTime = Convert.ToDateTime(node.SelectSingleNode( "DateTime" ).InnerText), IsComplete = Convert.ToBoolean(node.SelectSingleNode( "IsComplete" ).InnerText) }); } MemorandumShowList = new ObservableCollection<MemorandumModel>(MemorandumRealList); } |
xml文件保存:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public void SaveXmlDoc() { //获取根节点对象 XDocument document = new XDocument(); XElement xmlRoot = new XElement( "MemorandumModels" ); XElement memorandumModel; foreach ( var memorandumReal in MemorandumRealList) { memorandumModel = new XElement($ "MemorandumModel" ); memorandumModel.SetElementValue( "Title" , memorandumReal.Title); memorandumModel.SetElementValue( "EvenType" , memorandumReal.EvenType); memorandumModel.SetElementValue( "DateTime" , memorandumReal.DateTime); memorandumModel.SetElementValue( "IsComplete" , memorandumReal.IsComplete); xmlRoot.Add(memorandumModel); } xmlRoot.Save(XmlDocPath); } |
④查询:如果全选选中,则显示全部内容,未勾选,则采用link去匹配选中信息去筛选,我这里是所有信息去匹配的,你也可以自己修改下,去只匹配某一项或几项内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public void SearchClick() { SaveXmlDoc(); if (SelectAll) { MemorandumShowList = new ObservableCollection<MemorandumModel>(MemorandumRealList); return ; } MemorandumShowList = new ObservableCollection<MemorandumModel>( MemorandumRealList.Where( t => t.EvenType == EvenTypeList[SelectedIndex] ).Where(s => s.IsComplete == IsCompleteStatus ).Where(p => p.Title == TitleText ).Where(x => x.DateTime == DateTime.Parse(DataTimeContext) ) .ToList() ); } |
⑤标题栏未输入内容时显示灰色提示字体,有输入时输入内容显示黑色字体:
这里采用事件处理:获取到光标时
1 2 3 4 5 6 7 8 | public void LostFocus() { if ( string .IsNullOrEmpty(TitleText)) { TitleText = "备忘录标题" ; TitleColor = Color.DimGray; } } |
光标离开时:
1 2 3 4 5 | public void GotFocus() { TitleText = "" ; TitleColor = Color.Black; } |
⑥选中行删除:
1 2 3 4 5 | public void DeleteClick() { MemorandumRealList.Remove(SelectedItem); MemorandumShowList.Remove(SelectedItem); } |
⑦行号获取:在行选择改变事件中去做
1 2 3 4 5 | public void GridControl_SelectedItemChanged( object sender, SelectedItemChangedEventArgs e) { GridControl gd = sender as GridControl; SelectRow = gd.GetSelectedRowHandles()[0]; //选中行的行号 } |
⑧添加信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public void Add() { MemorandumRealList.Add( new MemorandumModel() { Title = titleText, DateTime =DateTime.Parse(DataTimeContext), EvenType = EvenTypeList[SelectedIndex], IsComplete = IsCompleteStatus }); MemorandumShowList.Add( new MemorandumModel() { Title = titleText, DateTime = DateTime.Parse(DataTimeContext), EvenType = EvenTypeList[SelectedIndex], IsComplete = IsCompleteStatus }); } |
⑨修改信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public void Modify() { MemorandumRealList[SelectRow] = new MemorandumModel() { Title = titleText, DateTime = DateTime.Parse(DataTimeContext), EvenType = EvenTypeList[SelectedIndex], IsComplete = IsCompleteStatus }; MemorandumShowList[SelectRow] = new MemorandumModel() { Title = titleText, DateTime = DateTime.Parse(DataTimeContext), EvenType = EvenTypeList[SelectedIndex], IsComplete = IsCompleteStatus }; } |
⑩定时器查询:采用using System.Threading.Tasks;下的单线程定时器DispatcherTimer,
定义和初始化:
1 2 3 4 5 6 | private DispatcherTimer timer; timer = new DispatcherTimer(); timer.Interval = TimeSpan.FromMinutes(1); timer.Tick += timer1_Tick; timer.Start(); |
定时器事件:我这里每隔一分钟查询一次,查询到当前事件到了提醒时间就进行一次语音播报:
1 2 3 4 5 6 7 8 9 10 | private void timer1_Tick( object sender, EventArgs e) { foreach ( var memorandum in MemorandumRealList) { if (DateTime.Now >= memorandum.DateTime) { SpeakAsync(memorandum.Title); } } } |
⑩①:语音播报:这里开了task线程执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | /// <summary> /// 微软语音识别 /// </summary> /// <param name="content">提示内容</param> public static void SpeakAsync( string content) { try { Task.Run(() => { SpVoice voice = new SpVoice(); voice.Rate = 1; //速率[-10,10] voice.Volume = 10; //音量[0,100] voice.Voice = voice.GetVoices().Item(0); //语音库 voice.Speak(content); }); } catch (Exception ex) { throw ex; } } |
⑩② 界面时间处理:
-
界面的表格采用的dev控件gridcontrol,默认情况下,时间只显示年月日,如果需要显示时分,需要设定:EditSettings如下
-
123456
<dxg:GridColumn Header=
"提醒时间"
FieldName=
"DateTime"
MinWidth=
"120"
>
<dxg:GridColumn.EditSettings>
<!--<xctk:DateEditSettings DisplayFormat=
"dd-MM-yyyy HH:mm:ss.fff"
/>-->
<xctk:DateEditSettings DisplayFormat=
"yyyy-MM-dd HH:mm"
/>
</dxg:GridColumn.EditSettings>
</dxg:GridColumn>
如果使用的是wpf 自带的表格控件datagrid,相对好处理
-
1
<DataGridTextColumn Header=
"提醒时间"
Binding=
"{Binding Path=DateTime,StringFormat='yyyy年MM月dd日 HH:mm:ss'}"
MinWidth=
"300"
/>
界面顶端的时间控件采用:toolkit下的xctk1:DateTimeUpDown这个控件
她绑定的是一个字符串类型的数据,所以添加时候,需要将他转换为datetime类型, DateTime.Parse(DataTimeContext),或者
DateTime = Convert.ToDateTime(DataTimeContext)
-
1234
<xctk1:DateTimeUpDown x:Name=
"_minimum"
Format=
"Custom"
FormatString=
"yyyy/MM/dd HH:mm"
Text=
"{Binding DataTimeContext}"
HorizontalAlignment=
"Left"
VerticalAlignment=
"Center"
Value=
"2016/01/01T12:00"
Margin=
"15,5"
/>
⑩③combobox枚举内容绑定:
-
public ObservableCollection<EvenType> EvenTypeList { get; set; } = new ObservableCollection<EvenType>();
-
1234
foreach
(EvenType evenType
in
Enum.GetValues(
typeof
(EvenType)))
{
EvenTypeList.Add(evenType);
}
⑩④关于gridcontrol TableView 的常用属性介绍
-
123456789101112131415161718
TableView 的常用属性:
AllowPerPixelScrolling
//逐像素滚动;
AllowScrollAnimation
//滚动动画,当下拉滚动条时有动画效果
NavigationStyle
//选中方式是一行还是单元格
ShowIndicator
//是否在每一行之前显示小方块
UseEvenRowBackground
//隔行其背景颜色会有所区分
AllowScrollToFocusedRow
//允许滚动到选中行
AllowResizing
//允许调整尺寸
AllowSorting
//允许排序
AutoWidth
//允许自动调整列宽
AllowMoveColumnToDropArea
//允许将一列拖到空白处进行分组
AllowGrouping
//允许分组
AllowFilterEditor
//允许显示过滤盘
AllowEditing
//允许编辑
ShowGroupPanel
//显示分组panel
ShowHorizontalLines ShowVerticalLines
//显示表格中每行每列垂直和水平线
IsColumnMenuEnabled
//是否关闭右键列菜单
03
—
前台代码
直接上代码,比较简单,不展开讲解了:
-
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
<UserControl
xmlns=
"http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x=
"http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc=
"http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d=
"http://schemas.microsoft.com/expression/blend/2008"
xmlns:local=
"clr-namespace:Caliburn.Micro.Hello"
xmlns:cal=
"http://www.caliburnproject.org"
xmlns:sys=
"clr-namespace:System;assembly=mscorlib"
xmlns:dxg=
"http://schemas.devexpress.com/winfx/2008/xaml/grid"
xmlns:xctk=
"http://schemas.devexpress.com/winfx/2008/xaml/editors"
xmlns:xctk1=
"http://schemas.xceed.com/wpf/xaml/toolkit"
x:Class=
"Caliburn.Micro.Hello.MemorandumView"
mc:Ignorable=
"d"
d:DesignHeight=
"450"
d:DesignWidth=
"800"
>
<UserControl.Resources>
<local:FontColorConverter x:Key=
"FontColorConverter"
/>
<Style TargetType=
"{x:Type TextBox}"
>
<Setter Property=
"HorizontalContentAlignment"
Value=
"Left"
/>
<Setter Property=
"VerticalContentAlignment"
Value=
"Center"
/>
<Setter Property=
"Width"
Value=
"100"
/>
</Style>
<Style TargetType=
"{x:Type CheckBox}"
>
<Setter Property=
"HorizontalAlignment"
Value=
"Center"
/>
<Setter Property=
"VerticalAlignment"
Value=
"Center"
/>
<Setter Property=
"Foreground"
Value=
"Black"
/>
</Style>
<Style TargetType=
"Button"
>
<Setter Property=
"Foreground"
Value=
"Black"
/>
</Style>
<DataTemplate x:Key=
"rowIndicatorContentTemplate"
>
<StackPanel VerticalAlignment=
"Stretch"
HorizontalAlignment=
"Stretch"
>
<TextBlock Text=
"{Binding RowHandle.Value}"
TextAlignment=
"Center"
Foreground=
"Black"
/>
</StackPanel>
</DataTemplate>
</UserControl.Resources>
<StackPanel Orientation=
"Vertical"
>
<StackPanel Orientation=
"Horizontal"
>
<TextBox Text=
"{Binding TitleText}"
Margin=
"15,5"
cal:Message.Attach=
"[Event GotFocus] = [Action GotFocus];[Event LostFocus] = [Action LostFocus]"
Foreground=
"{Binding TitleColor, Converter={StaticResource FontColorConverter}}"
/>
<ComboBox ItemsSource=
"{Binding EvenTypeList}"
Margin=
"15,5"
SelectedIndex=
"{Binding SelectedIndex}"
MinWidth=
"100"
Foreground=
"Black"
/>
<!--<DatePicker Text=
"{Binding DataTimeContext,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
SelectedDate=
"{x:Static sys:DateTime.Now}"
HorizontalAlignment=
"Left"
VerticalAlignment=
"Center"
Margin=
"15,5"
/>-->
<xctk1:DateTimeUpDown x:Name=
"_minimum"
Format=
"Custom"
FormatString=
"yyyy/MM/dd HH:mm"
Text=
"{Binding DataTimeContext}"
HorizontalAlignment=
"Left"
VerticalAlignment=
"Center"
Value=
"2016/01/01T12:00"
Margin=
"15,5"
/>
<CheckBox IsChecked=
"{Binding IsCompleteStatus}"
Margin=
"15,5"
Content=
"是否完成"
Foreground=
"Black"
/>
<Button Margin=
"15,5"
MinWidth=
"60"
cal:Message.Attach=
"[Event Click] = [Action SearchClick]"
>
<WrapPanel >
<Image Source=
"/Images/search.png"
Width=
"15"
Height=
"15"
/>
<TextBlock Text=
"查找"
VerticalAlignment=
"Center"
/>
</WrapPanel>
</Button>
</StackPanel>
<Border BorderBrush=
"LightBlue"
CornerRadius=
"2"
BorderThickness=
"2"
>
<dxg:GridControl AutoGenerateColumns=
"AddNew"
EnableSmartColumnsGeneration=
"True"
AllowLiveDataShaping=
"True"
cal:Message.Attach=
"[Event SelectedItemChanged] = [Action GridControl_SelectedItemChanged($source,$event)];"
ItemsSource=
"{Binding MemorandumShowList}"
SelectedItem=
"{Binding SelectedItem}"
Height=
"330"
Foreground=
"Black"
>
<dxg:GridControl.View>
<dxg:TableView ShowTotalSummary=
"True"
AllowMoveColumnToDropArea=
"False"
AllowGrouping=
"False"
AutoExpandOnDrag=
"False"
ShowDragDropHint=
"False"
ShowGroupPanel=
"False"
AllowColumnMoving=
"False"
AllowResizing=
"False"
Foreground=
"Black"
RowIndicatorContentTemplate=
"{StaticResource rowIndicatorContentTemplate}"
/>
</dxg:GridControl.View>
<dxg:GridColumn Header=
"标题"
FieldName=
"Title"
MinWidth=
"100"
/>
<dxg:GridColumn Header=
"类型"
FieldName=
"EvenType"
MinWidth=
"100"
/>
<dxg:GridColumn Header=
"提醒时间"
FieldName=
"DateTime"
MinWidth=
"120"
>
<dxg:GridColumn.EditSettings>
<!--<xctk:DateEditSettings DisplayFormat=
"dd-MM-yyyy HH:mm:ss.fff"
/>-->
<xctk:DateEditSettings DisplayFormat=
"yyyy-MM-dd HH:mm"
/>
</dxg:GridColumn.EditSettings>
</dxg:GridColumn>
<dxg:GridColumn Header=
"状态"
FieldName=
"IsComplete"
MinWidth=
"100"
/>
</dxg:GridControl>
</Border>
<StackPanel Orientation=
"Horizontal"
>
<CheckBox IsChecked=
"{Binding SelectAll}"
Margin=
"35,5"
Content=
"全选"
/>
<Button Margin=
"35,5"
MinWidth=
"60"
cal:Message.Attach=
"[Event Click] = [Action DeleteClick]"
>
<WrapPanel >
<Image Source=
"/Images/delete.png"
Width=
"15"
Height=
"15"
/>
<TextBlock Text=
"删除"
VerticalAlignment=
"Center"
/>
</WrapPanel>
</Button>
<Button Margin=
"35,5"
MinWidth=
"60"
Name=
"Add"
>
<WrapPanel >
<Image Source=
"/Images/add.png"
Width=
"15"
Height=
"15"
/>
<TextBlock Text=
"添加"
VerticalAlignment=
"Center"
/>
</WrapPanel>
</Button>
<Button Margin=
"35,5"
MinWidth=
"60"
Name=
"Modify"
>
<WrapPanel >
<Image Source=
"/Images/modify.png"
Width=
"15"
Height=
"15"
/>
<TextBlock Text=
"修改"
VerticalAlignment=
"Center"
/>
</WrapPanel>
</Button>
</StackPanel>
</StackPanel>
</UserControl>
04
—
效果演示
05
—
源码
源码下载
链接:https://pan.baidu.com/s/1yExT_zXFfd6TiAJYoD8kIw
提取码:添加小编微信:mm1552923 获取。
-
技术群:添加小编微信并备注进群小编微信:mm1552923 公众号:dotNet编程大全
01
—
概述
前几天群里有人问如何制作备忘录,感觉这样一个小实例挺适合新手们入门学习使用,所以就抽空做了出来。界面如下图:
这个备忘录主要包括了如下功能:
① 备忘录信息的增、删、改、查;
② 备忘录时间到了以后进行语音播报。
功能很简单,但是要实现这么一个功能,也涉及众多的知识点,接下来详细进行分解。
C#编程.net core开发,winform桌面开发,wpf开发,c sharp编程大全,CSharp程序开发,C#开发实例(附源代码),编程过程遇到的各种坑详解!公众号
02
—
内容详述
①界面button的图标:
图标图片可以上网上下载,下载好以后放到项目目录中,然后在项目中找到你的图片——>右键包括在项目中——>再右键,点击属性:
复制到输出目录,更改为始终复制。
生成操作,更改为内容。
前台XMAL操作:
<Button Margin="15,5" MinWidth="60" cal:Message.Attach="[Event Click] = [Action SearchClick]" >
<WrapPanel >
<Image Source="/Images/search.png" Width="15" Height="15" />
<TextBlock Text="查找" VerticalAlignment="Center" />
</WrapPanel>
</Button>
② 数据源:这里我采用从xml读取并绑定到界面,界面如果有修改,在页面退出时进行数据保存,当然你也可以使用数据库去操作
XML文件位置:根目录的RawData下
XML文件数据内容如下:
MemorandumModel数据模型定义:
public class MemorandumModel
{
public string Title { get; set; }
public EvenType EvenType { get; set; }
public DateTime DateTime { get; set; }
public bool IsComplete { get; set; }
}
③XML文件的读取和保存:MemorandumRealList是我们所有数据的集合,为了方便界面查询,界面绑定了MemorandumShowList 这个集合
xml读取:
public void XmlDocReader()
{
//XmlDocument读取xml文件
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(XmlDocPath);
//获取xml根节点
XmlNode xmlRoot = xmlDoc.DocumentElement;
if (xmlRoot == null)
return;
//读取所有的节点
foreach (XmlNode node in xmlRoot.SelectNodes("MemorandumModel"))
{
MemorandumRealList.Add(new MemorandumModel()
{
Title = node.SelectSingleNode("Title").InnerText,
EvenType = (EvenType)Enum.Parse(typeof(EvenType), node.SelectSingleNode("EvenType").InnerText),
DateTime = Convert.ToDateTime(node.SelectSingleNode("DateTime").InnerText),
IsComplete = Convert.ToBoolean(node.SelectSingleNode("IsComplete").InnerText)
});
}
MemorandumShowList = new ObservableCollection<MemorandumModel>(MemorandumRealList);
}
xml文件保存:
public void SaveXmlDoc()
{
//获取根节点对象
XDocument document = new XDocument();
XElement xmlRoot = new XElement("MemorandumModels");
XElement memorandumModel;
foreach (var memorandumReal in MemorandumRealList)
{
memorandumModel = new XElement($"MemorandumModel");
memorandumModel.SetElementValue("Title", memorandumReal.Title);
memorandumModel.SetElementValue("EvenType", memorandumReal.EvenType);
memorandumModel.SetElementValue("DateTime", memorandumReal.DateTime);
memorandumModel.SetElementValue("IsComplete", memorandumReal.IsComplete);
xmlRoot.Add(memorandumModel);
}
xmlRoot.Save(XmlDocPath);
}
dotnet工控上位机编程公众号
④查询:如果全选选中,则显示全部内容,未勾选,则采用link去匹配选中信息去筛选,我这里是所有信息去匹配的,你也可以自己修改下,去只匹配某一项或几项内容
public void SearchClick()
{
SaveXmlDoc();
if (SelectAll)
{
MemorandumShowList = new ObservableCollection<MemorandumModel>(MemorandumRealList);
return;
}
MemorandumShowList = new ObservableCollection<MemorandumModel>(
MemorandumRealList.Where(
t => t.EvenType == EvenTypeList[SelectedIndex]
).Where(s => s.IsComplete == IsCompleteStatus
).Where(p => p.Title == TitleText
).Where(x => x.DateTime == DateTime.Parse(DataTimeContext)
) .ToList() );
}
⑤标题栏未输入内容时显示灰色提示字体,有输入时输入内容显示黑色字体:
这里采用事件处理:获取到光标时
public void LostFocus()
{
if (string.IsNullOrEmpty(TitleText))
{
TitleText = "备忘录标题";
TitleColor = Color.DimGray;
}
}
光标离开时:
public void GotFocus()
{
TitleText = "";
TitleColor = Color.Black;
}
⑥选中行删除:
public void DeleteClick()
{
MemorandumRealList.Remove(SelectedItem);
MemorandumShowList.Remove(SelectedItem);
}
⑦行号获取:在行选择改变事件中去做
public void GridControl_SelectedItemChanged(object sender, SelectedItemChangedEventArgs e)
{
GridControl gd = sender as GridControl;
SelectRow = gd.GetSelectedRowHandles()[0];//选中行的行号
}
⑧添加信息:
public void Add()
{
MemorandumRealList.Add(new MemorandumModel()
{
Title = titleText,
DateTime =DateTime.Parse(DataTimeContext),
EvenType = EvenTypeList[SelectedIndex],
IsComplete = IsCompleteStatus
});
MemorandumShowList.Add(new MemorandumModel()
{
Title = titleText,
DateTime = DateTime.Parse(DataTimeContext),
EvenType = EvenTypeList[SelectedIndex],
IsComplete = IsCompleteStatus
});
}
⑨修改信息:
public void Modify()
{
MemorandumRealList[SelectRow] = new MemorandumModel()
{
Title = titleText,
DateTime = DateTime.Parse(DataTimeContext),
EvenType = EvenTypeList[SelectedIndex],
IsComplete = IsCompleteStatus
};
MemorandumShowList[SelectRow] = new MemorandumModel()
{
Title = titleText,
DateTime = DateTime.Parse(DataTimeContext),
EvenType = EvenTypeList[SelectedIndex],
IsComplete = IsCompleteStatus
};
}
⑩定时器查询:采用using System.Threading.Tasks;下的单线程定时器DispatcherTimer,
定义和初始化:
private DispatcherTimer timer;
timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromMinutes(1);
timer.Tick += timer1_Tick;
timer.Start();
定时器事件:我这里每隔一分钟查询一次,查询到当前事件到了提醒时间就进行一次语音播报:
private void timer1_Tick(object sender, EventArgs e)
{
foreach (var memorandum in MemorandumRealList)
{
if(DateTime.Now >= memorandum.DateTime)
{
SpeakAsync(memorandum.Title);
}
}
}
⑩①:语音播报:这里开了task线程执行
/// <summary>
/// 微软语音识别
/// </summary>
/// <param name="content">提示内容</param>
public static void SpeakAsync(string content)
{
try
{
Task.Run(() =>
{
SpVoice voice = new SpVoice();
voice.Rate = 1;//速率[-10,10]
voice.Volume = 10;//音量[0,100]
voice.Voice = voice.GetVoices().Item(0);//语音库
voice.Speak(content);
});
}
catch (Exception ex)
{
throw ex;
}
}
⑩② 界面时间处理:
-
界面的表格采用的dev控件gridcontrol,默认情况下,时间只显示年月日,如果需要显示时分,需要设定:EditSettings如下
<dxg:GridColumn Header="提醒时间" FieldName="DateTime" MinWidth="120" >
<dxg:GridColumn.EditSettings>
<!--<xctk:DateEditSettings DisplayFormat="dd-MM-yyyy HH:mm:ss.fff"/>-->
<xctk:DateEditSettings DisplayFormat="yyyy-MM-dd HH:mm"/>
</dxg:GridColumn.EditSettings>
</dxg:GridColumn>
如果使用的是wpf 自带的表格控件datagrid,相对好处理
<DataGridTextColumn Header="提醒时间" Binding="{Binding Path=DateTime,StringFormat='yyyy年MM月dd日 HH:mm:ss'}" MinWidth="300" />
-
界面顶端的时间控件采用:toolkit下的xctk1:DateTimeUpDown这个控件
她绑定的是一个字符串类型的数据,所以添加时候,需要将他转换为datetime类型, DateTime.Parse(DataTimeContext),或者
DateTime = Convert.ToDateTime(DataTimeContext)
<xctk1:DateTimeUpDown x:Name="_minimum" Format="Custom" FormatString="yyyy/MM/dd HH:mm" Text="{Binding DataTimeContext}" HorizontalAlignment="Left" VerticalAlignment="Center" Value="2016/01/01T12:00" Margin="15,5"/>
⑩③combobox枚举内容绑定:
public ObservableCollection<EvenType> EvenTypeList { get; set; } = new ObservableCollection<EvenType>();
foreach (EvenType evenType in Enum.GetValues(typeof(EvenType)))
{
EvenTypeList.Add(evenType);
}
⑩④关于gridcontrol TableView 的常用属性介绍
TableView 的常用属性:
AllowPerPixelScrolling //逐像素滚动;
AllowScrollAnimation //滚动动画,当下拉滚动条时有动画效果
NavigationStyle //选中方式是一行还是单元格
ShowIndicator //是否在每一行之前显示小方块
UseEvenRowBackground //隔行其背景颜色会有所区分
AllowScrollToFocusedRow //允许滚动到选中行
AllowResizing //允许调整尺寸
AllowSorting //允许排序
AutoWidth //允许自动调整列宽
AllowMoveColumnToDropArea //允许将一列拖到空白处进行分组
AllowGrouping //允许分组
AllowFilterEditor //允许显示过滤盘
AllowEditing //允许编辑
ShowGroupPanel//显示分组panel
ShowHorizontalLines ShowVerticalLines //显示表格中每行每列垂直和水平线
IsColumnMenuEnabled //是否关闭右键列菜单
03
—
前台代码
直接上代码,比较简单,不展开讲解了:
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Caliburn.Micro.Hello"
xmlns:cal="http://www.caliburnproject.org"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid" xmlns:xctk="http://schemas.devexpress.com/winfx/2008/xaml/editors" xmlns:xctk1="http://schemas.xceed.com/wpf/xaml/toolkit" x:Class="Caliburn.Micro.Hello.MemorandumView"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800" >
<UserControl.Resources>
<local:FontColorConverter x:Key="FontColorConverter" />
<Style TargetType="{x:Type TextBox}">
<Setter Property="HorizontalContentAlignment" Value="Left"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Width" Value="100"/>
</Style>
<Style TargetType="{x:Type CheckBox}">
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Foreground" Value="Black"/>
</Style>
<Style TargetType="Button">
<Setter Property="Foreground" Value="Black"/>
</Style>
<DataTemplate x:Key="rowIndicatorContentTemplate">
<StackPanel VerticalAlignment="Stretch"
HorizontalAlignment="Stretch">
<TextBlock Text="{Binding RowHandle.Value}"
TextAlignment="Center"
Foreground="Black"/>
</StackPanel>
</DataTemplate>
</UserControl.Resources>
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal">
<TextBox Text="{Binding TitleText}" Margin="15,5"
cal:Message.Attach="[Event GotFocus] = [Action GotFocus];[Event LostFocus] = [Action LostFocus]"
Foreground="{Binding TitleColor, Converter={StaticResource FontColorConverter}}"/>
<ComboBox ItemsSource="{Binding EvenTypeList}" Margin="15,5" SelectedIndex="{Binding SelectedIndex}" MinWidth="100" Foreground="Black"/>
<!--<DatePicker Text="{Binding DataTimeContext,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
SelectedDate="{x:Static sys:DateTime.Now}"
HorizontalAlignment="Left" VerticalAlignment="Center" Margin="15,5" />-->
<xctk1:DateTimeUpDown x:Name="_minimum" Format="Custom" FormatString="yyyy/MM/dd HH:mm"
Text="{Binding DataTimeContext}"
HorizontalAlignment="Left" VerticalAlignment="Center"
Value="2016/01/01T12:00" Margin="15,5"/>
<CheckBox IsChecked="{Binding IsCompleteStatus}" Margin="15,5" Content="是否完成" Foreground="Black"/>
<Button Margin="15,5" MinWidth="60" cal:Message.Attach="[Event Click] = [Action SearchClick]" >
<WrapPanel >
<Image Source="/Images/search.png" Width="15" Height="15" />
<TextBlock Text="查找" VerticalAlignment="Center" />
</WrapPanel>
</Button>
</StackPanel>
<Border BorderBrush="LightBlue" CornerRadius="2" BorderThickness="2" >
<dxg:GridControl AutoGenerateColumns="AddNew" EnableSmartColumnsGeneration="True" AllowLiveDataShaping="True"
cal:Message.Attach="[Event SelectedItemChanged] = [Action GridControl_SelectedItemChanged($source,$event)];"
ItemsSource="{Binding MemorandumShowList}" SelectedItem="{Binding SelectedItem}"
Height="330" Foreground="Black">
<dxg:GridControl.View>
<dxg:TableView ShowTotalSummary="True" AllowMoveColumnToDropArea="False"
AllowGrouping="False" AutoExpandOnDrag="False"
ShowDragDropHint="False" ShowGroupPanel="False"
AllowColumnMoving="False" AllowResizing="False" Foreground="Black"
RowIndicatorContentTemplate="{StaticResource rowIndicatorContentTemplate}" />
</dxg:GridControl.View>
<dxg:GridColumn Header="标题" FieldName="Title" MinWidth="100"/>
<dxg:GridColumn Header="类型" FieldName="EvenType" MinWidth="100"/>
<dxg:GridColumn Header="提醒时间" FieldName="DateTime" MinWidth="120" >
<dxg:GridColumn.EditSettings>
<!--<xctk:DateEditSettings DisplayFormat="dd-MM-yyyy HH:mm:ss.fff"/>-->
<xctk:DateEditSettings DisplayFormat="yyyy-MM-dd HH:mm"/>
</dxg:GridColumn.EditSettings>
</dxg:GridColumn>
<dxg:GridColumn Header="状态" FieldName="IsComplete" MinWidth="100"/>
</dxg:GridControl>
</Border>
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding SelectAll}" Margin="35,5" Content="全选"/>
<Button Margin="35,5" MinWidth="60" cal:Message.Attach="[Event Click] = [Action DeleteClick]" >
<WrapPanel >
<Image Source="/Images/delete.png" Width="15" Height="15" />
<TextBlock Text="删除" VerticalAlignment="Center" />
</WrapPanel>
</Button>
<Button Margin="35,5" MinWidth="60" Name="Add">
<WrapPanel >
<Image Source="/Images/add.png" Width="15" Height="15" />
<TextBlock Text="添加" VerticalAlignment="Center" />
</WrapPanel>
</Button>
<Button Margin="35,5" MinWidth="60" Name="Modify">
<WrapPanel >
<Image Source="/Images/modify.png" Width="15" Height="15"/>
<TextBlock Text="修改" VerticalAlignment="Center" />
</WrapPanel>
</Button>
</StackPanel>
</StackPanel>
</UserControl>
04
—
效果演示
05
—
源码
源码下载
链接:https://pan.baidu.com/s/1yExT_zXFfd6TiAJYoD8kIw
提取码:在下面这个公众号对话框发送【备忘录】
分享Python技术文章,实用案例,热点资讯。 你想了解的Python的那些事都在这里...... 当你的才华还撑不起你的野心的时候,那就安静下来学习吧!公众号
或者直接添加小编微信:mm1552923 获取。
技术群:添加小编微信并备注进群小编微信:mm1552923 公众号:dotNet编程大全
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
2021-02-20 C# 接口(Interface)