主頁 > .NET開發 > [C# 專案實戰]: 制作一個備忘錄(經典)

[C# 專案實戰]: 制作一個備忘錄(經典)

2022-02-21 06:03:00 .NET開發

 

01

 

概述

 

     前幾天群里有人問如何制作備忘錄,感覺這樣一個小實體挺適合新手們入門學習使用,所以就抽空做了出來,界面如下圖

這個備忘錄主要包括了如下功能:

① 備忘錄資訊的增、刪、改、查;

② 備忘錄時間到了以后進行語音播報,

功能很簡單,但是要實作這么一個功能,也涉及眾多的知識點,接下來詳細進行分解,

 

 

 

02

內容詳述

 

①界面button的圖示

圖示圖片可以上網上下載,下載好以后放到專案目錄中,然后在專案中找到你的圖片——>右鍵包括在專案中——>再右鍵,點擊屬性:

復制到輸出目錄,更改為始終復制,

生成操作,更改為內容,

 

 

 前臺XMAL操作:

 <Button Margin="15,5" Min cal:Message.Attach="[Event Click] = [Action SearchClick]" >
                <WrapPanel >
                    <Image Source="/Images/search.png"  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);
        }

  ④查詢:如果全選選中,則顯示全部內容,未勾選,則采用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" Min >
                        <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'}" Min />
    

      界面頂端的時間控制元件采用: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="https://www.cnblogs.com/zls366/archive/2022/02/20/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: 
                 mc:Ignorable="d" 
                 d:DesignHeight="450" d:Design >
        <UserControl.Resources>
            <local:FontColorConverter x:Key="FontColorConverter" />
            <Style TargetType="{x:Type TextBox}">
                <Setter Property="HorizontalContentAlignment" Value="https://www.cnblogs.com/zls366/archive/2022/02/20/Left"/>
                <Setter Property="VerticalContentAlignment" Value="https://www.cnblogs.com/zls366/archive/2022/02/20/Center"/>
                <Setter Property="Width" Value="https://www.cnblogs.com/zls366/archive/2022/02/20/100"/>
    </Style>
            <Style TargetType="{x:Type CheckBox}">
                <Setter Property="HorizontalAlignment" Value="https://www.cnblogs.com/zls366/archive/2022/02/20/Center"/>
                <Setter Property="VerticalAlignment" Value="https://www.cnblogs.com/zls366/archive/2022/02/20/Center"/>
                <Setter Property="Foreground" Value="https://www.cnblogs.com/zls366/archive/2022/02/20/Black"/>
    </Style>
            <Style TargetType="Button">
                <Setter Property="Foreground" Value="https://www.cnblogs.com/zls366/archive/2022/02/20/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}" Min 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="https://www.cnblogs.com/zls366/archive/2022/02/20/2016/01/01T12:00"  Margin="15,5"/>
    ?
                <CheckBox IsChecked="{Binding IsCompleteStatus}" Margin="15,5" Content="是否完成" Foreground="Black"/>
                <Button Margin="15,5" Min cal:Message.Attach="[Event Click] = [Action SearchClick]" >
                    <WrapPanel >
                        <Image Source="/Images/search.png"  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"   Min/>
                    <dxg:GridColumn  Header="型別" FieldName="EvenType"  Min/>
                    <dxg:GridColumn  Header="提醒時間" FieldName="DateTime" Min >
                        <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"  Min/>
            </dxg:GridControl>
            </Border>
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding SelectAll}" Margin="35,5" Content="全選"/>
                <Button Margin="35,5" Min cal:Message.Attach="[Event Click] = [Action DeleteClick]" >
                    <WrapPanel >
                        <Image Source="/Images/delete.png"  Height="15" />
                        <TextBlock Text="洗掉" VerticalAlignment="Center" />
                    </WrapPanel>
                </Button>
                <Button Margin="35,5" Min Name="Add">
                    <WrapPanel >
                        <Image Source="/Images/add.png"  Height="15" />
                        <TextBlock Text="添加" VerticalAlignment="Center" />
                    </WrapPanel>
                </Button>
                <Button Margin="35,5" Min Name="Modify">
                    <WrapPanel >
                        <Image Source="/Images/modify.png"  Height="15"/>
                        <TextBlock Text="修改" VerticalAlignment="Center" />
                    </WrapPanel>
                </Button>
            </StackPanel>
        </StackPanel>
    </UserControl>
    

      04

    效果演示

  • 05

    原始碼

     

    原始碼下載 

    鏈接:https://pan.baidu.com/s/1yExT_zXFfd6TiAJYoD8kIw 

    提取碼:添加小編微信:mm1552923   獲取,

  • 技術群:添加小編微信并備注進群小編微信:mm1552923   公眾號:dotNet編程大全      

01

 

概述

 

     前幾天群里有人問如何制作備忘錄,感覺這樣一個小實體挺適合新手們入門學習使用,所以就抽空做了出來,界面如下圖:

這個備忘錄主要包括了如下功能:

① 備忘錄資訊的增、刪、改、查;

② 備忘錄時間到了以后進行語音播報,

功能很簡單,但是要實作這么一個功能,也涉及眾多的知識點,接下來詳細進行分解,

 

CSharp編程大全CSharp編程大全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工控上位機編程DotNet工控上位機編程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//顯示分組panelShowHorizontalLines   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編程大全分享Python技術文章,實用案例,熱點資訊, 你想了解的Python的那些事都在這里...... 當你的才華還撐不起你的野心的時候,那就安靜下來學習吧!公眾號

或者直接添加小編微信:mm1552923   獲取,

技術群:添加小編微信并備注進群小編微信:mm1552923   公眾號:dotNet編程大全      

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/429230.html

標籤:.NET技术

上一篇:如何從React中的CSS模塊訪問隱藏的CSS類

下一篇:作為for回圈中的條件的函式-有人在C中這樣寫嗎?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more