Liam的C# 学习历程(九):实验学习

  在最近的几周里,我们结合老师在课堂上所讲的知识,以及课下在通过视频学习的内容,通过Win8.1 App、WP8.1 App以及WPF的三种形式,联系了C#的一些具体的编程方法。下面我们就来回顾一下在编程过程中所使用到的一些方法:

  (一)、页面之间的跳转:

   对于这一部分,在编写Windows App时和编写WPF是所使用的方法是不同的,下面就分别来介绍一下:

   1.Windows App:

 Frame.Navigate(typeof(DetailPage), file1);    //跳转至名为DetailPage的页面
                                               //并将当前页面的file1作为参数传到DetailPage中。

   2.WPF:

 NavigationService.GetNavigationService(this).Navigate(new Uri("DetailPage.xaml", UriKind.Relative));      //同样是跳转到名为DetailPage的界面
                                                                                        //与Windows App中不同的是,它不支持向下一页传递参数。

    由于WPF中不支持向下一页传递参数,那么我所想到的解决方法是在创建一个环境变量,在每次页面跳转时通过对环境变量赋值,来起到传递参数的作用。

  (二)、数据的存储与调用:

    同样的,由于Windows App与WPF编程之间存在不同,这里我也使用到了不同的方法。

    1.Windows App:

     首先是在Windows App中,我选择的方法是对于每一个要存储的项目创建一个相应的file,并以项目的名称来对file进行命名,file的内部存储项目的具体信息。程序实现方法如下:

 1 StorageFolder storage = await ApplicationData.Current.LocalFolder.CreateFolderAsync("MemoryList", CreationCollisionOption.OpenIfExists);
 2 XmlDocument _doc = new XmlDocument();
 3 XmlElement _item = _doc.CreateElement("Element");
 4 _item.SetAttribute("Date", DateBox.Date.Year + "." + DateBox.Date.Month + "." + DateBox.Date.Day);
 5 _item.SetAttribute("First", FirstBox.Text);
 6 _item.SetAttribute("Second", SecondBox.Text);
 7 _item.SetAttribute("Third", ThirdBox.Text);
 8 _doc.AppendChild(_item);
 9
10 StorageFile file = await storage.CreateFileAsync(DateBox.Date.Year + "." + DateBox.Date.Month + "." + DateBox.Date.Day + ".xml", CreationCollisionOption.ReplaceExisting);
11 await _doc.SaveToFileAsync(file);

    在这里,首先是创建了一个用来储存每个项目的file的folder,然后对file内部的各个element进行了赋值,最后将file命名并保存。这样一来在我的Listview中药展示我已有的项目时就只要遍历我的folder中的所有文件,并将它们的文件名显示出来即可。实现方法如下:

 1             StorageFolder storage = await ApplicationData.Current.LocalFolder.CreateFolderAsync("MemoryList", CreationCollisionOption.OpenIfExists);
 2             OutputBox.Items.Clear();
 3             var files = await storage.GetFilesAsync();
 4             {
 5                 foreach (StorageFile file in files)
 6                 {
 7                     Grid a = new Grid();
 8                     ColumnDefinition col = new ColumnDefinition();
 9                     GridLength gl = new GridLength(200);
10                     col.Width = gl;
11                     a.ColumnDefinitions.Add(col);
12                     ColumnDefinition col2 = new ColumnDefinition();
13                     GridLength gl2 = new GridLength(200);
14                     col2.Width = gl;
15                     a.ColumnDefinitions.Add(col2);
16                     TextBlock txbx = new TextBlock();
17                     txbx.Text = file.DisplayName;
18                     Grid.SetColumn(txbx, 0);
19                     HyperlinkButton btn = new HyperlinkButton();
20                     btn.Width = 100;
21                     btn.Content = "Detail";
22                     btn.Name = file.DisplayName;
23                     btn.Click += (s, ea) =>
24                     {
25                         Frame.Navigate(typeof(DetailPage), file);
26                     };
27                     Grid.SetColumn(btn, 1);
28
29                     a.Children.Add(txbx);
30                     a.Children.Add(btn);
31
32                     OutputBox.Items.Add(a);
33                 }
34             }

最终所达到的效果大概是这样:

      图中红色方框内便是遍历了folder中的各个file后并将file名称显示出来的结果。

     2.WPF:

      在WPF中由于不能使用Windows.Storage这一方法,所以我不得不改变策略,选择了通过创建一个Xml文件,并将每个项目的信息作为文件中根节点下的子节点来储存。这样的方法实现过程如下:

 1             String title = DateBox.SelectedDate.Value.ToString().Split(‘ ‘)[0];
 2             xmlDoc = new XmlDocument();
 3             xmlDoc.Load("Events.xml");
 4             XmlNode root = xmlDoc.SelectSingleNode("Events");
 5             XmlNodeList nodeList = xmlDoc.SelectSingleNode("Events").ChildNodes;
 6             foreach (XmlNode xn in nodeList)
 7             {
 8                 XmlElement xe = (XmlElement)xn;
 9                 if (xe.GetAttribute("Date") == title )
10                     root.RemoveChild(xe);
11             }
12             XmlElement _item = xmlDoc.CreateElement("Event");
13             _item.SetAttribute("Date", DateBox.SelectedDate.Value.ToString().Split(‘ ‘)[0]);
14             _item.SetAttribute("First", FirstBox.Text);
15             _item.SetAttribute("Second", SecondBox.Text);
16             _item.SetAttribute("Third", ThirdBox.Text);
17             root.AppendChild(_item);
18             xmlDoc.Save("Events.xml");

      由于在Xml文件中存储不像存储file时,系统会自动对文件名相同的文件进行覆盖,这里为了避免出现多个同名项目,我在存储前先判断力是否与当前项目同名的子节点,如果有,则先删除原有项目在存    储新项目。

      在显示时的方法与Windows App中所用到的大致相同,也是遍历所有项目,不同的是这里是遍历了根节点下的所有子节点,并将子节点输出出来,当然使用的函数也稍有区别:

 1             OutputBox.Items.Clear();
 2             xmlDoc = new XmlDocument();
 3             xmlDoc.Load("Events.xml");
 4             XmlNodeList nodeList = xmlDoc.SelectSingleNode("Events").ChildNodes;
 5             foreach (XmlNode xn in nodeList)
 6             {
 7                 XmlElement xe = (XmlElement)xn;
 8
 9                 Grid evet = new Grid();
10                 ColumnDefinition col = new ColumnDefinition();
11                 GridLength gl = new GridLength(220);
12                 col.Width = gl;
13                 evet.ColumnDefinitions.Add(col);
14                 ColumnDefinition col2 = new ColumnDefinition();
15                 GridLength gl2 = new GridLength(220);
16                 col2.Width = gl;
17                 evet.ColumnDefinitions.Add(col2);
18                 TextBlock txbx = new TextBlock();
19                 txbx.FontSize = 25;
20                 txbx.Text = xe.GetAttribute("Date");
21                 Grid.SetColumn(txbx, 0);
22                 Button btn = new Button();
23                 btn.Width = 150;
24                 btn.FontSize = 15;
25                 btn.Content = "See Details";
26                 btn.Click += (s, ea) =>
27                 {
28                     App.elementDetail = xe;
29                     NavigationService.GetNavigationService(this).Navigate(new Uri("DetailPage.xaml", UriKind.Relative));
30                 };
31                 Grid.SetColumn(btn, 1);
32                 evet.Children.Add(txbx);
33                 evet.Children.Add(btn);
34                 OutputBox.Items.Add(evet);
35             }

    上述就是我在最近几周的实验中所学习到的一些知识,在今后的学习生活中我将继续学习新的方法,挑战更有难度的程序,并继续分享自己在其中的心得体会。

时间: 2024-10-18 16:03:36

Liam的C# 学习历程(九):实验学习的相关文章

Liam的C# 学习历程(九):最终产品规格说明书

"What is Today's Memory"规格说明书 Course Registration Problem Statement Version 1.0 Revision History Date Issue Description Author 17/May/2015 1.0 Initial creation. Finished the basic usage of original design. Liu Chang Course Registration Problem S

Liam的C# 学习历程(六):LINQ(Language-INtegrated Query)

在这一周的C#课程中,我们学习了一些在C#编程中需要用到的对数据库或XML文件进行处理的操作,这就是LINQ,它使得一种类似与我们在数据库中常用的SQL语言的查询语言成为了C#语言的一部分,方便了我们搜索数据库等方面的操作.下面我们就来一起复习一下. (一)创建LINQ(Creating the Query): 1.From字句(The from clause):指定范围变量和数据源 from customer in customers //customer:range variable fro

Liam的C# 学习历程(七):WPF(Windows Presentation Foundation)、Windows Form Applications

在今天的课堂中,老师向我们讲述了关于一些WPF(Windows Presentation Foundation)和Windows Form Applications的内容,接下来就让我们一起来复习一下: (一).WPF(Windows Presentation Foundation): WPF是一个重要运用于desktop手机开发方面.它使用到了一种XML的变形语言——XAML的语言(eXtensible Application Markup Language). 使用XAML开发人员可以对WP

Liam的C# 学习历程(五):正则表达式(Regular Expressions)

在这周的C#课堂上,我们学习了一些关于正则表达式的知识,结合老师上课所讲的,我又在网上搜索了一些相关的知识,接下来就让我们来实验一下. 首先我们先来复习一些在Linux课堂上学习过的简单的正则表达式的符号: “ . ” :通配一个单个字符,例如“a."可以在“ab.ac.cd.a1.abc”中通配出:“ab.ac和a1”: “.. ” :  与上一个类似,通配两个任意的字符. “ * ”:通配前一个字符的多次出现,  例如“a*”可以通配出:空.a.aa.aaa等: “{}”:可以通配出前一个字

Liam的C# 学习历程(三):类与对象、继承与多态

在这一次的课程中,我们主要学习了C#中一些关于类的的具体应用和面向对象(OOP)的三大特点:封装(Encapsulation).多态(Polymorphism)和继承(Inheritance).接下来就让我们来实验一下学到的知识. (一)This 关键字 this关键字(又称this指针)是类中所有非静态方法的隐藏指针. 调用this的方法有很多种,首先是在收到与成员变量同名的参数时,使用this可以避免混淆,就像下面过程所演示的: 成员函数SomeMethod收到了一个与成员变量hour同名的

Liam的软件测试学习历程(三):JUint使用

今天的上机课上,我尝试了使用JUint和EclEmma对项目进行测试. 首先是这两个工具的安装,JUint比较容易,只需将需要的jar包引入到项目中即可,而EclEmma则需要在Eclipse中选择安装新软件来进行安装. 安装好后,是完成对待测项目的编程,这次的测试代码是一个检测三角形形状的方法.我的代码如下: package com.triangleProblem; import junit.framework.Test; public class Triangle { public Tria

Liam的软件测试学习历程(二):查找错误的两道例题

观察两段代码并回答下列问题: (1) 发现错误代码: (2) 试着编写测试用例,不执行fault部分: (3) 执行fault部分,但不出现error情况: (4) 出现error情况,但不发生failure. 代码一: public int findLast (int[] x, int y) { //Effects: If x==null throw NullPointerException // else return the index of the last element // in

Liam的C# 学习历程(八):数据流(Streams)

在这节C#课上,老师为我们讲述了第22章数据流的相关内容.首先我们需要用到的类在System.IO的命名空间中.这些类包括了表示磁盘上某个文件的File类,以及表示目录的Directory类. 接下来我们就通过一些例子来体会一下: (一).二进制输入: using System; using System.IO; namespace ImplementingBinaryReadWriteToFile { class Tester { const int SizeBuff = 1024; publ

Liam的软件测试学习历程(五):Selenium测试

今天的实验是使用Selenium进行Web的测试.首先需要在Firefox中安装相关插件Selenium.安装好后,在Firefox右上角会出现一个标志:.出现这个标志就代表安装好了. 接下来点击这个按钮,就会出现Selenium IDE的界面: 单击右侧红色的录制按钮开始录制.录制的步骤即为测试一个用例要进行的所有步骤,包括填入网址,输入学号密码等.最后选中结果界面中的邮箱,邮件选择assertText. 之后在Selenium IDE中输出相应的结果,注意在输出钱要在option中勾选Ena