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