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             }

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

 

posted @ 2015-05-18 11:34  Liam_LC  阅读(137)  评论(0编辑  收藏  举报