一、说明

本文代码来源:

《windows phone 7 程序设计》 Charles Petzold

控件效果:

二、要点:

1.ItemControl、子项容器模板(ItemsControl.ItemsPanel)和子项模板(ItemsControl.ItemTemplate)

            <ScrollViewer>
                <ItemsControl ItemsSource="{Binding Students}">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <local:StudentCard />
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>

                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <petzold:OverlapPanel Orientation="Vertical"
                                                  MinimumOverlap="24" />
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                </ItemsControl>

            </ScrollViewer>

2.UseControl、VisualStateManager

1).VisualStateManager必须紧跟在于UseControl顶级控件:

    <UserControl.RenderTransform>
        <TranslateTransform x:Name="translate" />
    </UserControl.RenderTransform>

  <!-- Border是StudentCard控件的顶级控件-->

<Border.....>

        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="CommonStates">
                <VisualState x:Name="Open">
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetName="translate"
                             Storyboard.TargetProperty="X"
                             To="" Duration="0:0:1" />

                    </Storyboard>
                </VisualState>

                <VisualState x:Name="Normal">
                <Storyboard>
                    <DoubleAnimation Storyboard.TargetName="translate"
                             Storyboard.TargetProperty="X"
                             Duration="0:0:1" />

                </Storyboard>
            </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>

...

</Border>

2).当依赖属性

public static readonly DependencyProperty IsOpenProperty =
            DependencyProperty.Register("IsOpen",
                typeof(bool),
                typeof(StudentCard),
                new PropertyMetadata(false, OnIsOpenChanged));

改变时就改变控件的视觉状态:

        static void OnIsOpenChanged(DependencyObject obj,
                                    DependencyPropertyChangedEventArgs args)
        {
            (obj as StudentCard).OnIsOpenChanged(args);
        }

        void OnIsOpenChanged(DependencyPropertyChangedEventArgs args)
        {
            VisualStateManager.GoToState(this, IsOpen ? "Open" : "Normal", false);
        }

3.重写布局控件Panel中的方法:

1). protected override Size MeasureOverride(Size availableSize);

MeasureOverride方法为该布局控件确定每个子元素的大小。

MeasureOverride调用其所有子元素的Measure方法(UIElement中定义的,密封的Sealed方法)。

各个子元素的Measure方法又调用自己的MeasureOverride,这样一直持续遍历完整棵树。

2).protected override Size ArrangeOverride(Size finalSize);

 ArrangeOverride方法为该布局控件把子元素排列到相对于自身的位置。

ArrangeOverride调用其所有子元素的Arrange方法(UIElement中定义的,密封的Sealed方法)。

各个子元素的Arrange方法又调用自己的ArrangeOverride,这样一直持续遍历完整棵树。

三、源码

Mainpage.xmal:

  1. <phone:PhoneApplicationPage
  2. x:Class="StudentCardFile.MainPage"
  3. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  4. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  5. xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
  6. xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
  7. xmlns:elpaso="clr-namespace:ElPasoHighSchool;assembly=ElPasoHighSchool"
  8. xmlns:petzold="clr-namespace:Petzold.Phone.Silverlight;assembly=Petzold.Phone.Silverlight"
  9. xmlns:local="clr-namespace:StudentCardFile"
  10. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  11. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  12. mc:Ignorable="d" d:DesignWidth="" d:DesignHeight=""
  13. FontFamily="{StaticResource PhoneFontFamilyNormal}"
  14. FontSize="{StaticResource PhoneFontSizeNormal}"
  15. Foreground="{StaticResource PhoneForegroundBrush}"
  16. SupportedOrientations="Portrait" Orientation="Portrait"
  17. shell:SystemTray.IsVisible="True">
  18.  
  19. <phone:PhoneApplicationPage.Resources>
  20. <elpaso:StudentBodyPresenter x:Key="studentBodyPresenter" />
  21. </phone:PhoneApplicationPage.Resources>
  22.  
  23. <!--LayoutRoot is the root grid where all page content is placed-->
  24. <Grid x:Name="LayoutRoot" Background="Transparent">
  25. <Grid.RowDefinitions>
  26. <RowDefinition Height="Auto"/>
  27. <RowDefinition Height="*"/>
  28. </Grid.RowDefinitions>
  29.  
  30. <!--TitlePanel contains the name of the application and page title-->
  31. <StackPanel x:Name="TitlePanel" Grid.Row="" Margin="12,17,0,28">
  32. <TextBlock x:Name="ApplicationTitle" Text="STUDENT CARD FILE" Style="{StaticResource PhoneTextNormalStyle}"/>
  33. </StackPanel>
  34.  
  35. <!--ContentPanel - place additional content here-->
  36. <Grid x:Name="ContentPanel" Grid.Row="" Margin="12,0,12,0"
  37. DataContext="{Binding Source={StaticResource studentBodyPresenter},
  38. Path=StudentBody}">
  39. <ScrollViewer>
  40. <ItemsControl ItemsSource="{Binding Students}">
  41. <ItemsControl.ItemTemplate>
  42. <DataTemplate>
  43. <local:StudentCard />
  44. </DataTemplate>
  45. </ItemsControl.ItemTemplate>
  46.  
  47. <ItemsControl.ItemsPanel>
  48. <ItemsPanelTemplate>
  49.  
  50. <petzold:OverlapPanel Orientation="Vertical"
  51. MinimumOverlap="" />
  52. </ItemsPanelTemplate>
  53. </ItemsControl.ItemsPanel>
  54. </ItemsControl>
  55.  
  56. </ScrollViewer>
  57.  
  58. </Grid>
  59. </Grid>
  60.  
  61. <!--Sample code showing usage of ApplicationBar-->
  62. <!--<phone:PhoneApplicationPage.ApplicationBar>
  63. <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
  64. <shell:ApplicationBarIconButton IconUri="/Images/appbar_button1.png" Text="Button 1"/>
  65. <shell:ApplicationBarIconButton IconUri="/Images/appbar_button2.png" Text="Button 2"/>
  66. <shell:ApplicationBar.MenuItems>
  67. <shell:ApplicationBarMenuItem Text="MenuItem 1"/>
  68. <shell:ApplicationBarMenuItem Text="MenuItem 2"/>
  69. </shell:ApplicationBar.MenuItems>
  70. </shell:ApplicationBar>
  71. </phone:PhoneApplicationPage.ApplicationBar>-->
  72.  
  73. </phone:PhoneApplicationPage>

StudentCard.xaml

  1. <UserControl x:Class="StudentCardFile.StudentCard"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. FontFamily="{StaticResource PhoneFontFamilyNormal}"
  5. FontSize="{StaticResource PhoneFontSizeNormal}"
  6. Foreground="{StaticResource PhoneForegroundBrush}"
  7. Width="" Height="">
  8.  
  9. <UserControl.RenderTransform>
  10. <TranslateTransform x:Name="translate" />
  11. </UserControl.RenderTransform>
  12.  
  13. <Border BorderBrush="{StaticResource PhoneAccentBrush}"
  14. BorderThickness=""
  15. Background="{StaticResource PhoneChromeBrush}"
  16. CornerRadius=""
  17. Padding="6 0">
  18.  
  19. <VisualStateManager.VisualStateGroups>
  20. <VisualStateGroup x:Name="CommonStates">
  21. <VisualState x:Name="Open">
  22. <Storyboard>
  23. <DoubleAnimation Storyboard.TargetName="translate"
  24. Storyboard.TargetProperty="X"
  25. To="" Duration="0:0:1" />
  26. </Storyboard>
  27. </VisualState>
  28.  
  29. <VisualState x:Name="Normal">
  30. <Storyboard>
  31. <DoubleAnimation Storyboard.TargetName="translate"
  32. Storyboard.TargetProperty="X"
  33. Duration="0:0:1" />
  34. </Storyboard>
  35. </VisualState>
  36. </VisualStateGroup>
  37. </VisualStateManager.VisualStateGroups>
  38.  
  39. <Grid>
  40. <Grid.RowDefinitions>
  41. <RowDefinition Height="Auto" />
  42. <RowDefinition Height="Auto" />
  43. <RowDefinition Height="*" />
  44. <RowDefinition Height="Auto" />
  45. </Grid.RowDefinitions>
  46.  
  47. <TextBlock Grid.Row=""
  48. Text="{Binding FullName}" />
  49.  
  50. <Rectangle Grid.Row=""
  51. Fill="{StaticResource PhoneAccentBrush}"
  52. Height=""
  53. Margin="0 0 0 4" />
  54.  
  55. <Image Grid.Row=""
  56. Source="{Binding PhotoFilename}" />
  57.  
  58. <StackPanel Grid.Row=""
  59. Orientation="Horizontal"
  60. HorizontalAlignment="Center">
  61. <TextBlock Text="GPA = " />
  62. <TextBlock Text="{Binding GradePointAverage}" />
  63. </StackPanel>
  64. </Grid>
  65. </Border>
  66. </UserControl>

StudentCard.xaml.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Windows;
  4. using System.Windows.Controls;
  5. using System.Windows.Input;
  6. using System.Windows.Media;
  7.  
  8. namespace StudentCardFile
  9. {
  10. public partial class StudentCard : UserControl
  11. {
  12. static List<StudentCard> studentCards = new List<StudentCard>();
  13. static int contactTime;
  14. static Point contactPoint;
  15.  
  16. public static readonly DependencyProperty IsOpenProperty =
  17. DependencyProperty.Register("IsOpen",
  18. typeof(bool),
  19. typeof(StudentCard),
  20. new PropertyMetadata(false, OnIsOpenChanged));
  21.  
  22. static StudentCard()
  23. {
  24. Touch.FrameReported += OnTouchFrameReported;
  25. }
  26.  
  27. static void OnIsOpenChanged(DependencyObject obj,
  28. DependencyPropertyChangedEventArgs args)
  29. {
  30. (obj as StudentCard).OnIsOpenChanged(args);
  31. }
  32.  
  33. static void OnTouchFrameReported(object sender, TouchFrameEventArgs args)
  34. {
  35. TouchPoint touchPoint = args.GetPrimaryTouchPoint(null);
  36.  
  37. if (touchPoint != null && touchPoint.Action == TouchAction.Down)
  38. {
  39. contactPoint = touchPoint.Position;
  40. contactTime = args.Timestamp;
  41. }
  42. else if (touchPoint != null && touchPoint.Action == TouchAction.Up)
  43. {
  44. // Check if finger is directly over StudentCard or child
  45. DependencyObject element = touchPoint.TouchDevice.DirectlyOver;
  46.  
  47. while (element != null && !(element is StudentCard))
  48. element = VisualTreeHelper.GetParent(element);
  49.  
  50. if (element == null)
  51. return;
  52.  
  53. // Get lift point and calculate difference
  54. Point liftPoint = touchPoint.Position;
  55. double distance = Math.Sqrt(Math.Pow(contactPoint.X - liftPoint.X, ) +
  56. Math.Pow(contactPoint.Y - liftPoint.Y, ));
  57.  
  58. // Qualify as a Tap if distance < 12 pixels within 1/4 second
  59. if (distance < && args.Timestamp - contactTime < )
  60. {
  61. // Enumerate StudentCard objects and set IsOpen property
  62. foreach (StudentCard studentCard in studentCards)
  63. studentCard.IsOpen = (element == studentCard && !studentCard.IsOpen);
  64. }
  65. }
  66. }
  67.  
  68. public StudentCard()
  69. {
  70. InitializeComponent();
  71. studentCards.Add(this);
  72. }
  73.  
  74. bool IsOpen
  75. {
  76. set { SetValue(IsOpenProperty, value); }
  77. get { return (bool)GetValue(IsOpenProperty); }
  78. }
  79.  
  80. void OnIsOpenChanged(DependencyPropertyChangedEventArgs args)
  81. {
  82. VisualStateManager.GoToState(this, IsOpen ? "Open" : "Normal", false);
  83. }
  84. }
  85. }

用反射工具得到布局控件OverlapPanel的代码:

  1. public class OverlapPanel : Panel
  2. {
  3. // Fields
  4. private Size maxChildSize = new Size();
  5. public static readonly DependencyProperty MinimumOverlapProperty = DependencyProperty.Register("MinimumOverlap", typeof(double), typeof(OverlapPanel), new PropertyMetadata(0.0, new PropertyChangedCallback(null, (IntPtr) OnAffectsMeasure)));
  6. public static readonly DependencyProperty OrientationProperty = DependencyProperty.Register("Orientation", typeof(Orientation), typeof(OverlapPanel), new PropertyMetadata((Orientation) , new PropertyChangedCallback(null, (IntPtr) OnAffectsMeasure)));
  7.  
  8. // Methods
  9. protected override Size ArrangeOverride(Size finalSize)
  10. {
  11. if (base.get_Children().get_Count() != )
  12. {
  13. double num = 0.0;
  14. if (this.Orientation == )
  15. {
  16. num = Math.Max(this.MinimumOverlap, (finalSize.get_Width() - this.maxChildSize.get_Width()) / ((double) (base.get_Children().get_Count() - )));
  17. }
  18. else
  19. {
  20. num = Math.Max(this.MinimumOverlap, (finalSize.get_Height() - this.maxChildSize.get_Height()) / ((double) (base.get_Children().get_Count() - )));
  21. }
  22. Point point = new Point();
  23. foreach (UIElement element in base.get_Children())
  24. {
  25. element.Arrange(new Rect(point, this.maxChildSize));
  26. if (this.Orientation == )
  27. {
  28. point.set_X(point.get_X() + num);
  29. }
  30. else
  31. {
  32. point.set_Y(point.get_Y() + num);
  33. }
  34. }
  35. }
  36. return finalSize;
  37. }
  38.  
  39. protected override Size MeasureOverride(Size availableSize)
  40. {
  41. if (base.get_Children().get_Count() == )
  42. {
  43. return new Size(0.0, 0.0);
  44. }
  45. this.maxChildSize = new Size();
  46. foreach (UIElement element in base.get_Children())
  47. {
  48. if (this.Orientation == )
  49. {
  50. element.Measure(new Size(double.PositiveInfinity, availableSize.get_Height()));
  51. }
  52. else
  53. {
  54. element.Measure(new Size(availableSize.get_Width(), double.PositiveInfinity));
  55. }
  56. this.maxChildSize.set_Width(Math.Max(this.maxChildSize.get_Width(), element.get_DesiredSize().get_Width()));
  57. this.maxChildSize.set_Height(Math.Max(this.maxChildSize.get_Height(), element.get_DesiredSize().get_Height()));
  58. }
  59. if (this.Orientation == )
  60. {
  61. double num = this.maxChildSize.get_Width() * base.get_Children().get_Count();
  62. double num2 = this.maxChildSize.get_Width() + (this.MinimumOverlap * (base.get_Children().get_Count() - ));
  63. if (!double.IsPositiveInfinity(availableSize.get_Width()))
  64. {
  65. if (num < availableSize.get_Width())
  66. {
  67. return new Size(num, this.maxChildSize.get_Height());
  68. }
  69. if (num2 < availableSize.get_Width())
  70. {
  71. return new Size(availableSize.get_Width(), this.maxChildSize.get_Height());
  72. }
  73. }
  74. return new Size(num2, this.maxChildSize.get_Height());
  75. }
  76. double num3 = this.maxChildSize.get_Height() * base.get_Children().get_Count();
  77. double num4 = this.maxChildSize.get_Height() + (this.MinimumOverlap * (base.get_Children().get_Count() - ));
  78. if (double.IsPositiveInfinity(availableSize.get_Height()))
  79. {
  80. return new Size(this.maxChildSize.get_Width(), num4);
  81. }
  82. if (num3 < availableSize.get_Height())
  83. {
  84. return new Size(this.maxChildSize.get_Width(), num3);
  85. }
  86. if (num4 < availableSize.get_Height())
  87. {
  88. return new Size(this.maxChildSize.get_Width(), availableSize.get_Height());
  89. }
  90. return new Size(this.maxChildSize.get_Width(), num4);
  91. }
  92.  
  93. private static void OnAffectsMeasure(DependencyObject obj, DependencyPropertyChangedEventArgs args)
  94. {
  95. (obj as OverlapPanel).InvalidateMeasure();
  96. }
  97.  
  98. // Properties
  99. public double MinimumOverlap
  100. {
  101. get
  102. {
  103. return (double) base.GetValue(MinimumOverlapProperty);
  104. }
  105. set
  106. {
  107. base.SetValue(MinimumOverlapProperty, value);
  108. }
  109. }
  110.  
  111. public Orientation Orientation
  112. {
  113. get
  114. {
  115. return (Orientation) base.GetValue(OrientationProperty);
  116. }
  117. set
  118. {
  119. base.SetValue(OrientationProperty, value);
  120. }
  121. }
  122. }
  123.  
  124. Collapse Methods

四、MainPage.xmal中的数据源:

。。。

xmlns:elpaso="clr-namespace:ElPasoHighSchool;assembly=ElPasoHighSchool"

。。。

  <phone:PhoneApplicationPage.Resources>
        <elpaso:StudentBodyPresenter x:Key="studentBodyPresenter" />
    </phone:PhoneApplicationPage.Resources>

ElPasoHighSchool.dll 反射工具得到如下用到得类:

Student.c

  1. public class Student : INotifyPropertyChanged
  2. {
  3. // Fields
  4. private string firstName;
  5. private string fullName;
  6. private decimal gradePointAverage;
  7. private string lastName;
  8. private string middleName;
  9. private string photoFilename;
  10. private PropertyChangedEventHandler PropertyChanged;
  11. private string sex;
  12.  
  13. // Events
  14. public event PropertyChangedEventHandler PropertyChanged
  15. {
  16. add
  17. {
  18. PropertyChangedEventHandler handler2;
  19. PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
  20. do
  21. {
  22. handler2 = propertyChanged;
  23. PropertyChangedEventHandler handler3 = (PropertyChangedEventHandler) Delegate.Combine(handler2, value);
  24. propertyChanged = Interlocked.CompareExchange<PropertyChangedEventHandler>(ref this.PropertyChanged, handler3, handler2);
  25. }
  26. while (propertyChanged != handler2);
  27. }
  28. remove
  29. {
  30. PropertyChangedEventHandler handler2;
  31. PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
  32. do
  33. {
  34. handler2 = propertyChanged;
  35. PropertyChangedEventHandler handler3 = (PropertyChangedEventHandler) Delegate.Remove(handler2, value);
  36. propertyChanged = Interlocked.CompareExchange<PropertyChangedEventHandler>(ref this.PropertyChanged, handler3, handler2);
  37. }
  38. while (propertyChanged != handler2);
  39. }
  40. }
  41.  
  42. // Methods
  43. protected virtual void OnPropertyChanged(string propChanged)
  44. {
  45. if (this.PropertyChanged != null)
  46. {
  47. this.PropertyChanged(this, new PropertyChangedEventArgs(propChanged));
  48. }
  49. }
  50.  
  51. // Properties
  52. public string FirstName
  53. {
  54. get
  55. {
  56. return this.firstName;
  57. }
  58. set
  59. {
  60. if (this.firstName != value)
  61. {
  62. this.firstName = value;
  63. this.OnPropertyChanged("FirstName");
  64. }
  65. }
  66. }
  67.  
  68. public string FullName
  69. {
  70. get
  71. {
  72. return this.fullName;
  73. }
  74. set
  75. {
  76. if (this.fullName != value)
  77. {
  78. this.fullName = value;
  79. this.OnPropertyChanged("FullName");
  80. }
  81. }
  82. }
  83.  
  84. public decimal GradePointAverage
  85. {
  86. get
  87. {
  88. return this.gradePointAverage;
  89. }
  90. set
  91. {
  92. if (this.gradePointAverage != value)
  93. {
  94. this.gradePointAverage = value;
  95. this.OnPropertyChanged("GradePointAverage");
  96. }
  97. }
  98. }
  99.  
  100. public string LastName
  101. {
  102. get
  103. {
  104. return this.lastName;
  105. }
  106. set
  107. {
  108. if (this.lastName != value)
  109. {
  110. this.lastName = value;
  111. this.OnPropertyChanged("LastName");
  112. }
  113. }
  114. }
  115.  
  116. public string MiddleName
  117. {
  118. get
  119. {
  120. return this.middleName;
  121. }
  122. set
  123. {
  124. if (this.middleName != value)
  125. {
  126. this.middleName = value;
  127. this.OnPropertyChanged("MiddleName");
  128. }
  129. }
  130. }
  131.  
  132. public string PhotoFilename
  133. {
  134. get
  135. {
  136. return this.photoFilename;
  137. }
  138. set
  139. {
  140. if (this.photoFilename != value)
  141. {
  142. this.photoFilename = value;
  143. this.OnPropertyChanged("PhotoFilename");
  144. }
  145. }
  146. }
  147.  
  148. public string Sex
  149. {
  150. get
  151. {
  152. return this.sex;
  153. }
  154. set
  155. {
  156. if (this.sex != value)
  157. {
  158. this.sex = value;
  159. this.OnPropertyChanged("Sex");
  160. }
  161. }
  162. }
  163. }
  164.  
  165. Collapse Methods

StudentBody.cs

  1. public class StudentBody : INotifyPropertyChanged
  2. {
  3. // Fields
  4. private PropertyChangedEventHandler PropertyChanged;
  5. private string school;
  6. private ObservableCollection<Student> students = new ObservableCollection<Student>();
  7.  
  8. // Events
  9. public event PropertyChangedEventHandler PropertyChanged
  10. {
  11. add
  12. {
  13. PropertyChangedEventHandler handler2;
  14. PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
  15. do
  16. {
  17. handler2 = propertyChanged;
  18. PropertyChangedEventHandler handler3 = (PropertyChangedEventHandler) Delegate.Combine(handler2, value);
  19. propertyChanged = Interlocked.CompareExchange<PropertyChangedEventHandler>(ref this.PropertyChanged, handler3, handler2);
  20. }
  21. while (propertyChanged != handler2);
  22. }
  23. remove
  24. {
  25. PropertyChangedEventHandler handler2;
  26. PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
  27. do
  28. {
  29. handler2 = propertyChanged;
  30. PropertyChangedEventHandler handler3 = (PropertyChangedEventHandler) Delegate.Remove(handler2, value);
  31. propertyChanged = Interlocked.CompareExchange<PropertyChangedEventHandler>(ref this.PropertyChanged, handler3, handler2);
  32. }
  33. while (propertyChanged != handler2);
  34. }
  35. }
  36.  
  37. // Methods
  38. protected virtual void OnPropertyChanged(string propChanged)
  39. {
  40. if (this.PropertyChanged != null)
  41. {
  42. this.PropertyChanged(this, new PropertyChangedEventArgs(propChanged));
  43. }
  44. }
  45.  
  46. // Properties
  47. public string School
  48. {
  49. get
  50. {
  51. return this.school;
  52. }
  53. set
  54. {
  55. if (this.school != value)
  56. {
  57. this.school = value;
  58. this.OnPropertyChanged("School");
  59. }
  60. }
  61. }
  62.  
  63. public ObservableCollection<Student> Students
  64. {
  65. get
  66. {
  67. return this.students;
  68. }
  69. set
  70. {
  71. if (this.students != value)
  72. {
  73. this.students = value;
  74. this.OnPropertyChanged("Students");
  75. }
  76. }
  77. }
  78. }
  79.  
  80. Collapse Methods

StudentBodyPresenter.cs

  1. public class StudentBodyPresenter : INotifyPropertyChanged
  2. {
  3. // Fields
  4. private PropertyChangedEventHandler PropertyChanged;
  5. private Random rand = new Random();
  6. private StudentBody studentBody;
  7.  
  8. // Events
  9. public event PropertyChangedEventHandler PropertyChanged
  10. {
  11. add
  12. {
  13. PropertyChangedEventHandler handler2;
  14. PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
  15. do
  16. {
  17. handler2 = propertyChanged;
  18. PropertyChangedEventHandler handler3 = (PropertyChangedEventHandler) Delegate.Combine(handler2, value);
  19. propertyChanged = Interlocked.CompareExchange<PropertyChangedEventHandler>(ref this.PropertyChanged, handler3, handler2);
  20. }
  21. while (propertyChanged != handler2);
  22. }
  23. remove
  24. {
  25. PropertyChangedEventHandler handler2;
  26. PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
  27. do
  28. {
  29. handler2 = propertyChanged;
  30. PropertyChangedEventHandler handler3 = (PropertyChangedEventHandler) Delegate.Remove(handler2, value);
  31. propertyChanged = Interlocked.CompareExchange<PropertyChangedEventHandler>(ref this.PropertyChanged, handler3, handler2);
  32. }
  33. while (propertyChanged != handler2);
  34. }
  35. }
  36.  
  37. // Methods
  38. public StudentBodyPresenter()
  39. {
  40. Uri uri = new Uri("http://www.charlespetzold.com/Students/students.xml");
  41. WebClient client = new WebClient();
  42. client.add_DownloadStringCompleted(new DownloadStringCompletedEventHandler(this, (IntPtr) this.OnDownloadStringCompleted));
  43. client.DownloadStringAsync(uri);
  44. }
  45.  
  46. private void OnDownloadStringCompleted(object sender, DownloadStringCompletedEventArgs args)
  47. {
  48. StringReader reader = new StringReader(args.get_Result());
  49. XmlSerializer serializer = new XmlSerializer(typeof(StudentBody));
  50. this.StudentBody = serializer.Deserialize(reader) as StudentBody;
  51. DispatcherTimer timer = new DispatcherTimer();
  52. timer.add_Tick(new EventHandler(this.TimerOnTick));
  53. timer.set_Interval(TimeSpan.FromMilliseconds(100.0));
  54. timer.Start();
  55. }
  56.  
  57. protected virtual void OnPropertyChanged(string propChanged)
  58. {
  59. if (this.PropertyChanged != null)
  60. {
  61. this.PropertyChanged(this, new PropertyChangedEventArgs(propChanged));
  62. }
  63. }
  64.  
  65. private void TimerOnTick(object sender, EventArgs args)
  66. {
  67. int num = this.rand.Next(this.studentBody.Students.Count);
  68. Student student = this.studentBody.Students[num];
  69. double num2 = 1.0 + ((this.rand.NextDouble() - 0.5) / 5.0);
  70. student.GradePointAverage = Math.Max(0M, Math.Min(5M, decimal.Round(((decimal) num2) * student.GradePointAverage, )));
  71. }
  72.  
  73. // Properties
  74. public StudentBody StudentBody
  75. {
  76. get
  77. {
  78. return this.studentBody;
  79. }
  80. protected set
  81. {
  82. if (this.studentBody != value)
  83. {
  84. this.studentBody = value;
  85. this.OnPropertyChanged("StudentBody");
  86. }
  87. }
  88. }
  89. }
  90.  
  91. Collapse Methods

要点:

1).数据是存在一个名为students.xml,地址为:

http://www.charlespetzold.com/Students/students.xml

students.xml:

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. - <StudentBody xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  3. <School>El Paso High School</School>
  4. - <Students>
  5. - <Student>
  6. <FullName>Adkins Bowden</FullName>
  7. <FirstName>Adkins</FirstName>
  8. <MiddleName />
  9. <LastName>Bowden</LastName>
  10. <Sex>Male</Sex>
  11. <PhotoFilename>http://www.charlespetzold.com/Students/AdkinsBowden.png</PhotoFilename>
  12. <GradePointAverage>2.71</GradePointAverage>
  13. </Student>
  14. - <Student>
  15. <FullName>Alfred Black</FullName>
  16. <FirstName>Alfred</FirstName>
  17. <MiddleName />
  18. <LastName>Black</LastName>
  19. <Sex>Male</Sex>
  20. <PhotoFilename>http://www.charlespetzold.com/Students/AlfredBlack.png</PhotoFilename>
  21. <GradePointAverage>2.87</GradePointAverage>
  22. </Student>
  23. - <Student>
  24. <FullName>Alice Bishop</FullName>
  25. <FirstName>Alice</FirstName>
  26. <MiddleName />
  27. <LastName>Bishop</LastName>
  28. <Sex>Female</Sex>
  29. <PhotoFilename>http://www.charlespetzold.com/Students/AliceBishop.png</PhotoFilename>
  30. <GradePointAverage>3.68</GradePointAverage>
  31. </Student>
  32. - <Student>
  33. <FullName>Alma Hermine Morrison</FullName>
  34. <FirstName>Alma</FirstName>
  35. <MiddleName>Hermine</MiddleName>
  36. <LastName>Morrison</LastName>
  37. <Sex>Female</Sex>
  38. <PhotoFilename>http://www.charlespetzold.com/Students/AlmaHermineMorrison.png</PhotoFilename>
  39. <GradePointAverage>1.99</GradePointAverage>
  40. </Student>
  41. - <Student>
  42. <FullName>Angie Foster</FullName>
  43. <FirstName>Angie</FirstName>
  44. <MiddleName />
  45. <LastName>Foster</LastName>
  46. <Sex>Male</Sex>
  47. <PhotoFilename>http://www.charlespetzold.com/Students/AngieFoster.png</PhotoFilename>
  48. <GradePointAverage>1.37</GradePointAverage>
  49. </Student>
  50. - <Student>
  51. <FullName>Antoinette Matkin</FullName>
  52. <FirstName>Antoinette</FirstName>
  53. <MiddleName />
  54. <LastName>Matkin</LastName>
  55. <Sex>Female</Sex>
  56. <PhotoFilename>http://www.charlespetzold.com/Students/AntoinetteMatkin.png</PhotoFilename>
  57. <GradePointAverage>1.17</GradePointAverage>
  58. </Student>
  59. - <Student>
  60. <FullName>Barbara Byers</FullName>
  61. <FirstName>Barbara</FirstName>
  62. <MiddleName />
  63. <LastName>Byers</LastName>
  64. <Sex>Female</Sex>
  65. <PhotoFilename>http://www.charlespetzold.com/Students/BarbaraByers.png</PhotoFilename>
  66. <GradePointAverage>1.85</GradePointAverage>
  67. </Student>
  68. - <Student>
  69. <FullName>Bernadine Wilma Schultz</FullName>
  70. <FirstName>Bernadine</FirstName>
  71. <MiddleName>Wilma</MiddleName>
  72. <LastName>Schultz</LastName>
  73. <Sex>Female</Sex>
  74. <PhotoFilename>http://www.charlespetzold.com/Students/BernadineWilmaSchultz.png</PhotoFilename>
  75. <GradePointAverage>3.65</GradePointAverage>
  76. </Student>
  77. - <Student>
  78. <FullName>Bernita Thomas</FullName>
  79. <FirstName>Bernita</FirstName>
  80. <MiddleName />
  81. <LastName>Thomas</LastName>
  82. <Sex>Female</Sex>
  83. <PhotoFilename>http://www.charlespetzold.com/Students/BernitaThomas.png</PhotoFilename>
  84. <GradePointAverage>1.96</GradePointAverage>
  85. </Student>
  86. - <Student>
  87. <FullName>Camille Kibler</FullName>
  88. <FirstName>Camille</FirstName>
  89. <MiddleName />
  90. <LastName>Kibler</LastName>
  91. <Sex>Female</Sex>
  92. <PhotoFilename>http://www.charlespetzold.com/Students/CamilleKibler.png</PhotoFilename>
  93. <GradePointAverage>2.54</GradePointAverage>
  94. </Student>
  95. - <Student>
  96. <FullName>Charles Carter</FullName>
  97. <FirstName>Charles</FirstName>
  98. <MiddleName />
  99. <LastName>Carter</LastName>
  100. <Sex>Female</Sex>
  101. <PhotoFilename>http://www.charlespetzold.com/Students/CharlesCarter.png</PhotoFilename>
  102. <GradePointAverage>1.12</GradePointAverage>
  103. </Student>
  104. - <Student>
  105. <FullName>Charles Edgar Virden</FullName>
  106. <FirstName>Charles</FirstName>
  107. <MiddleName>Edgar</MiddleName>
  108. <LastName>Virden</LastName>
  109. <Sex>Male</Sex>
  110. <PhotoFilename>http://www.charlespetzold.com/Students/CharlesEdgarVirden.png</PhotoFilename>
  111. <GradePointAverage>2.28</GradePointAverage>
  112. </Student>
  113. - <Student>
  114. <FullName>Charles Kilburn</FullName>
  115. <FirstName>Charles</FirstName>
  116. <MiddleName />
  117. <LastName>Kilburn</LastName>
  118. <Sex>Male</Sex>
  119. <PhotoFilename>http://www.charlespetzold.com/Students/CharlesKilburn.png</PhotoFilename>
  120. <GradePointAverage>1.72</GradePointAverage>
  121. </Student>
  122. - <Student>
  123. <FullName>Christian Jungjohann</FullName>
  124. <FirstName>Christian</FirstName>
  125. <MiddleName />
  126. <LastName>Jungjohann</LastName>
  127. <Sex>Male</Sex>
  128. <PhotoFilename>http://www.charlespetzold.com/Students/ChristianJungjohann.png</PhotoFilename>
  129. <GradePointAverage>3.73</GradePointAverage>
  130. </Student>
  131. - <Student>
  132. <FullName>Christina Moelich</FullName>
  133. <FirstName>Christina</FirstName>
  134. <MiddleName />
  135. <LastName>Moelich</LastName>
  136. <Sex>Female</Sex>
  137. <PhotoFilename>http://www.charlespetzold.com/Students/ChristinaMoelich.png</PhotoFilename>
  138. <GradePointAverage>2.41</GradePointAverage>
  139. </Student>
  140. - <Student>
  141. <FullName>Clara Louise Fink</FullName>
  142. <FirstName>Clara</FirstName>
  143. <MiddleName>Louise</MiddleName>
  144. <LastName>Fink</LastName>
  145. <Sex>Female</Sex>
  146. <PhotoFilename>http://www.charlespetzold.com/Students/ClaraLouiseFink.png</PhotoFilename>
  147. <GradePointAverage>3.21</GradePointAverage>
  148. </Student>
  149. - <Student>
  150. <FullName>Clarinda Corbin</FullName>
  151. <FirstName>Clarinda</FirstName>
  152. <MiddleName />
  153. <LastName>Corbin</LastName>
  154. <Sex>Female</Sex>
  155. <PhotoFilename>http://www.charlespetzold.com/Students/ClarindaCorbin.png</PhotoFilename>
  156. <GradePointAverage>2.73</GradePointAverage>
  157. </Student>
  158. - <Student>
  159. <FullName>Dayverne Stearns</FullName>
  160. <FirstName>Dayverne</FirstName>
  161. <MiddleName />
  162. <LastName>Stearns</LastName>
  163. <Sex>Male</Sex>
  164. <PhotoFilename>http://www.charlespetzold.com/Students/DayverneStearns.png</PhotoFilename>
  165. <GradePointAverage>1.28</GradePointAverage>
  166. </Student>
  167. - <Student>
  168. <FullName>Dorothy Congdon</FullName>
  169. <FirstName>Dorothy</FirstName>
  170. <MiddleName />
  171. <LastName>Congdon</LastName>
  172. <Sex>Female</Sex>
  173. <PhotoFilename>http://www.charlespetzold.com/Students/DorothyCongdon.png</PhotoFilename>
  174. <GradePointAverage>2.07</GradePointAverage>
  175. </Student>
  176. - <Student>
  177. <FullName>Earl Weisiger</FullName>
  178. <FirstName>Earl</FirstName>
  179. <MiddleName />
  180. <LastName>Weisiger</LastName>
  181. <Sex>Male</Sex>
  182. <PhotoFilename>http://www.charlespetzold.com/Students/EarlWeisiger.png</PhotoFilename>
  183. <GradePointAverage>1.28</GradePointAverage>
  184. </Student>
  185. - <Student>
  186. <FullName>Edna Richardson</FullName>
  187. <FirstName>Edna</FirstName>
  188. <MiddleName />
  189. <LastName>Richardson</LastName>
  190. <Sex>Female</Sex>
  191. <PhotoFilename>http://www.charlespetzold.com/Students/EdnaRichardson.png</PhotoFilename>
  192. <GradePointAverage>2.39</GradePointAverage>
  193. </Student>
  194. - <Student>
  195. <FullName>Eldon Routledge</FullName>
  196. <FirstName>Eldon</FirstName>
  197. <MiddleName />
  198. <LastName>Routledge</LastName>
  199. <Sex>Male</Sex>
  200. <PhotoFilename>http://www.charlespetzold.com/Students/EldonRoutledge.png</PhotoFilename>
  201. <GradePointAverage>3.26</GradePointAverage>
  202. </Student>
  203. - <Student>
  204. <FullName>Elgie Means</FullName>
  205. <FirstName>Elgie</FirstName>
  206. <MiddleName />
  207. <LastName>Means</LastName>
  208. <Sex>Male</Sex>
  209. <PhotoFilename>http://www.charlespetzold.com/Students/ElgieMeans.png</PhotoFilename>
  210. <GradePointAverage>1.16</GradePointAverage>
  211. </Student>
  212. - <Student>
  213. <FullName>Elizabeth Barnes</FullName>
  214. <FirstName>Elizabeth</FirstName>
  215. <MiddleName />
  216. <LastName>Barnes</LastName>
  217. <Sex>Female</Sex>
  218. <PhotoFilename>http://www.charlespetzold.com/Students/ElizabethBarnes.png</PhotoFilename>
  219. <GradePointAverage>3.68</GradePointAverage>
  220. </Student>
  221. - <Student>
  222. <FullName>Elizabeth Bruce Lucas</FullName>
  223. <FirstName>Elizabeth</FirstName>
  224. <MiddleName>Bruce</MiddleName>
  225. <LastName>Lucas</LastName>
  226. <Sex>Female</Sex>
  227. <PhotoFilename>http://www.charlespetzold.com/Students/ElizabethBruceLucas.png</PhotoFilename>
  228. <GradePointAverage>3.43</GradePointAverage>
  229. </Student>
  230. - <Student>
  231. <FullName>Elizabeth Routledge</FullName>
  232. <FirstName>Elizabeth</FirstName>
  233. <MiddleName />
  234. <LastName>Routledge</LastName>
  235. <Sex>Female</Sex>
  236. <PhotoFilename>http://www.charlespetzold.com/Students/ElizabethRoutledge.png</PhotoFilename>
  237. <GradePointAverage>3.86</GradePointAverage>
  238. </Student>
  239. - <Student>
  240. <FullName>Eugene Smith</FullName>
  241. <FirstName>Eugene</FirstName>
  242. <MiddleName />
  243. <LastName>Smith</LastName>
  244. <Sex>Male</Sex>
  245. <PhotoFilename>http://www.charlespetzold.com/Students/EugeneSmith.png</PhotoFilename>
  246. <GradePointAverage>3.92</GradePointAverage>
  247. </Student>
  248. - <Student>
  249. <FullName>Eunice Anderson</FullName>
  250. <FirstName>Eunice</FirstName>
  251. <MiddleName />
  252. <LastName>Anderson</LastName>
  253. <Sex>Female</Sex>
  254. <PhotoFilename>http://www.charlespetzold.com/Students/EuniceAnderson.png</PhotoFilename>
  255. <GradePointAverage>3.96</GradePointAverage>
  256. </Student>
  257. - <Student>
  258. <FullName>Eunice Winifred Preston</FullName>
  259. <FirstName>Eunice</FirstName>
  260. <MiddleName>Winifred</MiddleName>
  261. <LastName>Preston</LastName>
  262. <Sex>Female</Sex>
  263. <PhotoFilename>http://www.charlespetzold.com/Students/EuniceWinifredPreston.png</PhotoFilename>
  264. <GradePointAverage>2.70</GradePointAverage>
  265. </Student>
  266. - <Student>
  267. <FullName>George Johnston</FullName>
  268. <FirstName>George</FirstName>
  269. <MiddleName />
  270. <LastName>Johnston</LastName>
  271. <Sex>Male</Sex>
  272. <PhotoFilename>http://www.charlespetzold.com/Students/GeorgeJohnston.png</PhotoFilename>
  273. <GradePointAverage>1.07</GradePointAverage>
  274. </Student>
  275. - <Student>
  276. <FullName>Grace Fleck</FullName>
  277. <FirstName>Grace</FirstName>
  278. <MiddleName />
  279. <LastName>Fleck</LastName>
  280. <Sex>Female</Sex>
  281. <PhotoFilename>http://www.charlespetzold.com/Students/GraceFleck.png</PhotoFilename>
  282. <GradePointAverage>1.96</GradePointAverage>
  283. </Student>
  284. - <Student>
  285. <FullName>Harry Stearns</FullName>
  286. <FirstName>Harry</FirstName>
  287. <MiddleName />
  288. <LastName>Stearns</LastName>
  289. <Sex>Male</Sex>
  290. <PhotoFilename>http://www.charlespetzold.com/Students/HarryStearns.png</PhotoFilename>
  291. <GradePointAverage>3.61</GradePointAverage>
  292. </Student>
  293. - <Student>
  294. <FullName>Henry Avery Schumacher</FullName>
  295. <FirstName>Henry</FirstName>
  296. <MiddleName>Avery</MiddleName>
  297. <LastName>Schumacher</LastName>
  298. <Sex>Male</Sex>
  299. <PhotoFilename>http://www.charlespetzold.com/Students/HenryAverySchumacher.png</PhotoFilename>
  300. <GradePointAverage>1.31</GradePointAverage>
  301. </Student>
  302. - <Student>
  303. <FullName>Idus Gilbert</FullName>
  304. <FirstName>Idus</FirstName>
  305. <MiddleName />
  306. <LastName>Gilbert</LastName>
  307. <Sex>Male</Sex>
  308. <PhotoFilename>http://www.charlespetzold.com/Students/IdusGilbert.png</PhotoFilename>
  309. <GradePointAverage>1.23</GradePointAverage>
  310. </Student>
  311. - <Student>
  312. <FullName>Irene Bryan</FullName>
  313. <FirstName>Irene</FirstName>
  314. <MiddleName />
  315. <LastName>Bryan</LastName>
  316. <Sex>Female</Sex>
  317. <PhotoFilename>http://www.charlespetzold.com/Students/IreneBryan.png</PhotoFilename>
  318. <GradePointAverage>2.52</GradePointAverage>
  319. </Student>
  320. - <Student>
  321. <FullName>Isabelle Valentine</FullName>
  322. <FirstName>Isabelle</FirstName>
  323. <MiddleName />
  324. <LastName>Valentine</LastName>
  325. <Sex>Female</Sex>
  326. <PhotoFilename>http://www.charlespetzold.com/Students/IsabelleValentine.png</PhotoFilename>
  327. <GradePointAverage>2.80</GradePointAverage>
  328. </Student>
  329. - <Student>
  330. <FullName>Joseph Idus Lambert</FullName>
  331. <FirstName>Joseph</FirstName>
  332. <MiddleName>Idus</MiddleName>
  333. <LastName>Lambert</LastName>
  334. <Sex>Male</Sex>
  335. <PhotoFilename>http://www.charlespetzold.com/Students/JosephIdusLambert.png</PhotoFilename>
  336. <GradePointAverage>2.13</GradePointAverage>
  337. </Student>
  338. - <Student>
  339. <FullName>Kate Mulcahy</FullName>
  340. <FirstName>Kate</FirstName>
  341. <MiddleName />
  342. <LastName>Mulcahy</LastName>
  343. <Sex>Female</Sex>
  344. <PhotoFilename>http://www.charlespetzold.com/Students/KateMulcahy.png</PhotoFilename>
  345. <GradePointAverage>2.80</GradePointAverage>
  346. </Student>
  347. - <Student>
  348. <FullName>Katherine Glenn</FullName>
  349. <FirstName>Katherine</FirstName>
  350. <MiddleName />
  351. <LastName>Glenn</LastName>
  352. <Sex>Female</Sex>
  353. <PhotoFilename>http://www.charlespetzold.com/Students/KatherineGlenn.png</PhotoFilename>
  354. <GradePointAverage>1.88</GradePointAverage>
  355. </Student>
  356. - <Student>
  357. <FullName>Kathleen Elizabeth Faris</FullName>
  358. <FirstName>Kathleen</FirstName>
  359. <MiddleName>Elizabeth</MiddleName>
  360. <LastName>Faris</LastName>
  361. <Sex>Female</Sex>
  362. <PhotoFilename>http://www.charlespetzold.com/Students/KathleenElizabethFaris.png</PhotoFilename>
  363. <GradePointAverage>2.69</GradePointAverage>
  364. </Student>
  365. - <Student>
  366. <FullName>Lena Butchofsky</FullName>
  367. <FirstName>Lena</FirstName>
  368. <MiddleName />
  369. <LastName>Butchofsky</LastName>
  370. <Sex>Female</Sex>
  371. <PhotoFilename>http://www.charlespetzold.com/Students/LenaButchofsky.png</PhotoFilename>
  372. <GradePointAverage>2.72</GradePointAverage>
  373. </Student>
  374. - <Student>
  375. <FullName>Lillian Lockwood</FullName>
  376. <FirstName>Lillian</FirstName>
  377. <MiddleName />
  378. <LastName>Lockwood</LastName>
  379. <Sex>Female</Sex>
  380. <PhotoFilename>http://www.charlespetzold.com/Students/LillianLockwood.png</PhotoFilename>
  381. <GradePointAverage>1.07</GradePointAverage>
  382. </Student>
  383. - <Student>
  384. <FullName>Louise Isabelle Springer</FullName>
  385. <FirstName>Louise</FirstName>
  386. <MiddleName>Isabelle</MiddleName>
  387. <LastName>Springer</LastName>
  388. <Sex>Female</Sex>
  389. <PhotoFilename>http://www.charlespetzold.com/Students/LouiseIsabelleSpringer.png</PhotoFilename>
  390. <GradePointAverage>1.66</GradePointAverage>
  391. </Student>
  392. - <Student>
  393. <FullName>Lucas Bacon</FullName>
  394. <FirstName>Lucas</FirstName>
  395. <MiddleName />
  396. <LastName>Bacon</LastName>
  397. <Sex>Male</Sex>
  398. <PhotoFilename>http://www.charlespetzold.com/Students/LucasBacon.png</PhotoFilename>
  399. <GradePointAverage>1.17</GradePointAverage>
  400. </Student>
  401. - <Student>
  402. <FullName>Margaret Bryan</FullName>
  403. <FirstName>Margaret</FirstName>
  404. <MiddleName />
  405. <LastName>Bryan</LastName>
  406. <Sex>Female</Sex>
  407. <PhotoFilename>http://www.charlespetzold.com/Students/MargaretBryan.png</PhotoFilename>
  408. <GradePointAverage>3.21</GradePointAverage>
  409. </Student>
  410. - <Student>
  411. <FullName>Maria Mateus</FullName>
  412. <FirstName>Maria</FirstName>
  413. <MiddleName />
  414. <LastName>Mateus</LastName>
  415. <Sex>Female</Sex>
  416. <PhotoFilename>http://www.charlespetzold.com/Students/MariaMateus.png</PhotoFilename>
  417. <GradePointAverage>3.92</GradePointAverage>
  418. </Student>
  419. - <Student>
  420. <FullName>Marie Schwartz</FullName>
  421. <FirstName>Marie</FirstName>
  422. <MiddleName />
  423. <LastName>Schwartz</LastName>
  424. <Sex>Female</Sex>
  425. <PhotoFilename>http://www.charlespetzold.com/Students/MarieSchwartz.png</PhotoFilename>
  426. <GradePointAverage>3.53</GradePointAverage>
  427. </Student>
  428. - <Student>
  429. <FullName>Mary Frances Henderson</FullName>
  430. <FirstName>Mary</FirstName>
  431. <MiddleName>Frances</MiddleName>
  432. <LastName>Henderson</LastName>
  433. <Sex>Female</Sex>
  434. <PhotoFilename>http://www.charlespetzold.com/Students/MaryFrancesHenderson.png</PhotoFilename>
  435. <GradePointAverage>3.91</GradePointAverage>
  436. </Student>
  437. - <Student>
  438. <FullName>Mary Keating</FullName>
  439. <FirstName>Mary</FirstName>
  440. <MiddleName />
  441. <LastName>Keating</LastName>
  442. <Sex>Female</Sex>
  443. <PhotoFilename>http://www.charlespetzold.com/Students/MaryKeating.png</PhotoFilename>
  444. <GradePointAverage>3.53</GradePointAverage>
  445. </Student>
  446. - <Student>
  447. <FullName>Mary Redmond</FullName>
  448. <FirstName>Mary</FirstName>
  449. <MiddleName />
  450. <LastName>Redmond</LastName>
  451. <Sex>Female</Sex>
  452. <PhotoFilename>http://www.charlespetzold.com/Students/MaryRedmond.png</PhotoFilename>
  453. <GradePointAverage>3.51</GradePointAverage>
  454. </Student>
  455. - <Student>
  456. <FullName>Mattie Clark</FullName>
  457. <FirstName>Mattie</FirstName>
  458. <MiddleName />
  459. <LastName>Clark</LastName>
  460. <Sex>Female</Sex>
  461. <PhotoFilename>http://www.charlespetzold.com/Students/MattieClark.png</PhotoFilename>
  462. <GradePointAverage>1.98</GradePointAverage>
  463. </Student>
  464. - <Student>
  465. <FullName>Mildred Helen Marston</FullName>
  466. <FirstName>Mildred</FirstName>
  467. <MiddleName>Helen</MiddleName>
  468. <LastName>Marston</LastName>
  469. <Sex>Female</Sex>
  470. <PhotoFilename>http://www.charlespetzold.com/Students/MildredHelenMarston.png</PhotoFilename>
  471. <GradePointAverage>2.70</GradePointAverage>
  472. </Student>
  473. - <Student>
  474. <FullName>Mineta Henning</FullName>
  475. <FirstName>Mineta</FirstName>
  476. <MiddleName />
  477. <LastName>Henning</LastName>
  478. <Sex>Female</Sex>
  479. <PhotoFilename>http://www.charlespetzold.com/Students/MinetaHenning.png</PhotoFilename>
  480. <GradePointAverage>2.71</GradePointAverage>
  481. </Student>
  482. - <Student>
  483. <FullName>Minnie Lee Lassiter</FullName>
  484. <FirstName>Minnie</FirstName>
  485. <MiddleName>Lee</MiddleName>
  486. <LastName>Lassiter</LastName>
  487. <Sex>Female</Sex>
  488. <PhotoFilename>http://www.charlespetzold.com/Students/MinnieLeeLassiter.png</PhotoFilename>
  489. <GradePointAverage>1.26</GradePointAverage>
  490. </Student>
  491. - <Student>
  492. <FullName>Moline Lopas Hughes</FullName>
  493. <FirstName>Moline</FirstName>
  494. <MiddleName>Lopas</MiddleName>
  495. <LastName>Hughes</LastName>
  496. <Sex>Male</Sex>
  497. <PhotoFilename>http://www.charlespetzold.com/Students/MolineLopasHughes.png</PhotoFilename>
  498. <GradePointAverage>1.79</GradePointAverage>
  499. </Student>
  500. - <Student>
  501. <FullName>Nannie Hammons</FullName>
  502. <FirstName>Nannie</FirstName>
  503. <MiddleName />
  504. <LastName>Hammons</LastName>
  505. <Sex>Female</Sex>
  506. <PhotoFilename>http://www.charlespetzold.com/Students/NannieHammons.png</PhotoFilename>
  507. <GradePointAverage>1.70</GradePointAverage>
  508. </Student>
  509. - <Student>
  510. <FullName>Nell Mulcahy</FullName>
  511. <FirstName>Nell</FirstName>
  512. <MiddleName />
  513. <LastName>Mulcahy</LastName>
  514. <Sex>Female</Sex>
  515. <PhotoFilename>http://www.charlespetzold.com/Students/NellMulcahy.png</PhotoFilename>
  516. <GradePointAverage>2.33</GradePointAverage>
  517. </Student>
  518. - <Student>
  519. <FullName>Nelson Rheinheimer</FullName>
  520. <FirstName>Nelson</FirstName>
  521. <MiddleName />
  522. <LastName>Rheinheimer</LastName>
  523. <Sex>Male</Sex>
  524. <PhotoFilename>http://www.charlespetzold.com/Students/NelsonRheinheimer.png</PhotoFilename>
  525. <GradePointAverage>3.56</GradePointAverage>
  526. </Student>
  527. - <Student>
  528. <FullName>Opal Edson Hadlock</FullName>
  529. <FirstName>Opal</FirstName>
  530. <MiddleName>Edson</MiddleName>
  531. <LastName>Hadlock</LastName>
  532. <Sex>Female</Sex>
  533. <PhotoFilename>http://www.charlespetzold.com/Students/OpalEdsonHadlock.png</PhotoFilename>
  534. <GradePointAverage>2.42</GradePointAverage>
  535. </Student>
  536. - <Student>
  537. <FullName>Ralph O'Neill</FullName>
  538. <FirstName>Ralph</FirstName>
  539. <MiddleName />
  540. <LastName>O'Neill</LastName>
  541. <Sex>Male</Sex>
  542. <PhotoFilename>http://www.charlespetzold.com/Students/RalphO'Neill.png</PhotoFilename>
  543. <GradePointAverage>3.18</GradePointAverage>
  544. </Student>
  545. - <Student>
  546. <FullName>Ramiel Jungjohann</FullName>
  547. <FirstName>Ramiel</FirstName>
  548. <MiddleName />
  549. <LastName>Jungjohann</LastName>
  550. <Sex>Male</Sex>
  551. <PhotoFilename>http://www.charlespetzold.com/Students/RamielJungjohann.png</PhotoFilename>
  552. <GradePointAverage>3.90</GradePointAverage>
  553. </Student>
  554. - <Student>
  555. <FullName>Reed Harlan</FullName>
  556. <FirstName>Reed</FirstName>
  557. <MiddleName />
  558. <LastName>Harlan</LastName>
  559. <Sex>Male</Sex>
  560. <PhotoFilename>http://www.charlespetzold.com/Students/ReedHarlan.png</PhotoFilename>
  561. <GradePointAverage>3.46</GradePointAverage>
  562. </Student>
  563. - <Student>
  564. <FullName>Rose Clayton</FullName>
  565. <FirstName>Rose</FirstName>
  566. <MiddleName />
  567. <LastName>Clayton</LastName>
  568. <Sex>Female</Sex>
  569. <PhotoFilename>http://www.charlespetzold.com/Students/RoseClayton.png</PhotoFilename>
  570. <GradePointAverage>2.11</GradePointAverage>
  571. </Student>
  572. - <Student>
  573. <FullName>Ross Hill</FullName>
  574. <FirstName>Ross</FirstName>
  575. <MiddleName />
  576. <LastName>Hill</LastName>
  577. <Sex>Male</Sex>
  578. <PhotoFilename>http://www.charlespetzold.com/Students/RossHill.png</PhotoFilename>
  579. <GradePointAverage>2.83</GradePointAverage>
  580. </Student>
  581. - <Student>
  582. <FullName>Ruy Darnall</FullName>
  583. <FirstName>Ruy</FirstName>
  584. <MiddleName />
  585. <LastName>Darnall</LastName>
  586. <Sex>Male</Sex>
  587. <PhotoFilename>http://www.charlespetzold.com/Students/RuyDarnall.png</PhotoFilename>
  588. <GradePointAverage>1.75</GradePointAverage>
  589. </Student>
  590. - <Student>
  591. <FullName>Steve Lattner</FullName>
  592. <FirstName>Steve</FirstName>
  593. <MiddleName />
  594. <LastName>Lattner</LastName>
  595. <Sex>Male</Sex>
  596. <PhotoFilename>http://www.charlespetzold.com/Students/SteveLattner.png</PhotoFilename>
  597. <GradePointAverage>2.44</GradePointAverage>
  598. </Student>
  599. - <Student>
  600. <FullName>Therese Youngberg</FullName>
  601. <FirstName>Therese</FirstName>
  602. <MiddleName />
  603. <LastName>Youngberg</LastName>
  604. <Sex>Female</Sex>
  605. <PhotoFilename>http://www.charlespetzold.com/Students/ThereseYoungberg.png</PhotoFilename>
  606. <GradePointAverage>2.95</GradePointAverage>
  607. </Student>
  608. - <Student>
  609. <FullName>Walter Ponsford</FullName>
  610. <FirstName>Walter</FirstName>
  611. <MiddleName />
  612. <LastName>Ponsford</LastName>
  613. <Sex>Male</Sex>
  614. <PhotoFilename>http://www.charlespetzold.com/Students/WalterPonsford.png</PhotoFilename>
  615. <GradePointAverage>2.52</GradePointAverage>
  616. </Student>
  617. - <Student>
  618. <FullName>William Sheley Warnock</FullName>
  619. <FirstName>William</FirstName>
  620. <MiddleName>Sheley</MiddleName>
  621. <LastName>Warnock</LastName>
  622. <Sex>Male</Sex>
  623. <PhotoFilename>http://www.charlespetzold.com/Students/WilliamSheleyWarnock.png</PhotoFilename>
  624. <GradePointAverage>1.82</GradePointAverage>
  625. </Student>
  626. </Students>
  627. </StudentBody>

用到如下方法获得xml文件:

  1. public StudentBodyPresenter()
  2. {
  3. Uri uri = new Uri("http://www.charlespetzold.com/Students/students.xml");
  4. WebClient client = new WebClient();
  5. client.add_DownloadStringCompleted(new DownloadStringCompletedEventHandler(this, (IntPtr) this.OnDownloadStringCompleted));
  6. client.DownloadStringAsync(uri);
  7. }

2).然后用反序列化得到StudentBody对象:

  1. private void OnDownloadStringCompleted(object sender, DownloadStringCompletedEventArgs args)
  2. {
  3. StringReader reader = new StringReader(args.get_Result());
  4. XmlSerializer serializer = new XmlSerializer(typeof(StudentBody));
  5. this.StudentBody = serializer.Deserialize(reader) as StudentBody;
  6. DispatcherTimer timer = new DispatcherTimer();
  7. timer.add_Tick(new EventHandler(this.TimerOnTick));
  8. timer.set_Interval(TimeSpan.FromMilliseconds(100.0));
  9. timer.Start();
  10. }
  11.  
  12. private void TimerOnTick(object sender, EventArgs args)
  13. {
  14. int num = this.rand.Next(this.studentBody.Students.Count);
  15. Student student = this.studentBody.Students[num];
  16. double num2 = 1.0 + ((this.rand.NextDouble() - 0.5) / 5.0);
  17. student.GradePointAverage = Math.Max(0M, Math.Min(5M, decimal.Round(((decimal) num2) * student.GradePointAverage, )));
  18. }

StudentBodyprivate ObservableCollection<Student> students;保存所有的Student对象,反序列化时,students得到赋值。

WP 类似扑克牌布局控件和类似扑克卡片控件的更多相关文章

  1. Android AutoCompleteTextView控件实现类似百度搜索提示,限制输入数字长度

    Android AutoCompleteTextView 控件实现类似被搜索提示,效果如下 1.首先贴出布局代码 activity_main.xml: <?xml version="1 ...

  2. 用UWP实现一个和win10设置页面类似的布局

    不知道有人注意过Win10中的设置页面的布局没?那个页面会根据不同的窗口宽度来调节显示的内容,甚至来后退按钮的操作在不同的宽度也是不同的,看图: 是不是有点cool呢,这篇文章,我们就来做一个类似的布 ...

  3. swing实现QQ登录界面1.0( 实现了同一张图片只加载一次)、(以及实现简单的布局面板添加背景图片控件的标签控件和添加一个关闭按钮控件)

    swing实现QQ登录界面1.0( 实现了同一张图片只加载一次).(以及实现简单的布局面板添加背景图片控件的标签控件和添加一个关闭按钮控件) 代码思路分析: 1.(同一张图片仅仅需要加载一次就够了,下 ...

  4. UGUI核心元素、基本控件、复合控件和高级控件

    UGUI的核心元素: Anchor(锚点):每个控件都有一个Anchor属性,控件的4个顶点,分别与Anchor的4个点保持不变的距离,不受屏幕分辨率变化的影响. 系统默认设置控件的Anchor位置在 ...

  5. Android控件之Button(按钮控件)和ImageButton(图片按钮控件)

    一.Button和ImageButton特证: 1.共同特证: 都可以作为一个按钮产生点击事件 2.不同特证: Button有text的属性,ImageButton没有 ImageButton有src ...

  6. Dev控件GridView单元格绑定控件

    Dev控件GridView单元格绑定控件 //文本按钮 RepositoryItemButtonEdit btnFields = new RepositoryItemButtonEdit();//创建 ...

  7. Delphi7 第三方控件1stClass4000的TfcImageBtn按钮控件动态加载jpg图片例子

    Delphi7 第三方控件1stClass4000的TfcImageBtn按钮控件动态加载jpg图片例子 procedure TForm1.Button1Click(Sender: TObject); ...

  8. 把某个asp.net 控件 替换成 自定义的控件

    功能:可以把某个asp.net 控件 替换成 自定义的控件 pages 的 tagMapping 元素(ASP.NET 设置架构) 定义一个标记类型的集合,这些标记类型在编译时重新映射为其他标记类型. ...

  9. 重新想象 Windows 8 Store Apps (16) - 控件基础: 依赖属性, 附加属性, 控件的继承关系, 路由事件和命中测试

    原文:重新想象 Windows 8 Store Apps (16) - 控件基础: 依赖属性, 附加属性, 控件的继承关系, 路由事件和命中测试 [源码下载] 重新想象 Windows 8 Store ...

随机推荐

  1. unicode 汉字编码表

    啊:21834 阿:38463 埃:22467 挨:25384 哎:21710 唉:21769 哀:21696 皑:30353 癌:30284 蔼:34108矮:30702 艾:33406 碍:308 ...

  2. python:浅析python 中__name__ = '__main__' 的作用

    有句话经典的概括了这段代码的意义: “Make a script both importable and executable” 意思就是说让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可 ...

  3. (转)Centos5.5安装MONO2.10.8和Jexus 5.0开启Linux平台.net应用新篇章

    注:本文只做本人记录使用,也可供大家参考,有兴趣的可以一起讨论. 安装步骤 1.yum –y update 2.安装Mono源码安装需要的库 yum -y install gcc gcc-c++ bi ...

  4. android 网络_网络图片查看器

    xml <?xml version="1.0"?> -<LinearLayout tools:context=".MainActivity" ...

  5. 洛谷 P1195 口袋的天空

    题目背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 题目描述 给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在 ...

  6. 一款功能强大的iphone购物应用源码

    一款功能强大的iphone购物应用源码,这款应用源码比较完整的,并且还支持信用卡支付服务等功能的,基本实现了我们常用的购物应用功能了,实现商品的基本展示功能,还具有完整的用户管理,以及完整的购物流程等 ...

  7. 匹配一级分类和二级分类 名字和url 里面有玄机

    1:要匹配的html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:// ...

  8. IIS目录下文件共享后System.IO.File.Exists返回false

    场景:在iis目录下,因为特殊需要共享一个文件夹,给到其他的技术人员访问,突然发现小小的操作,搞“大”了,使用 string path = Server.MapPath("~/file/te ...

  9. TortoiseGit 安装和使用的图文教程

    TortoiseGit.SourceTree都是Windows下不错的Git客户端工具,下面介绍一下TortoiseGit安装和使用的方法. 安装TortoiseGit并使用它需要两个软件:Torto ...

  10. Web Capacity Analysis Tool 压力测试工具使用笔记

    一.背景介绍 Web Capacity Analysis Tool是微软轻量级Web压力测试工具, 早先是IIS 6.0Resource Tool kit 工具包中的一个组件,现在独立出来有一个社区版 ...