2017-09-14 3 views
0

Je voudrais être en mesure d'afficher quelques changements de propriétés à l'exécution, et je ne sais pas comment le faire. J'apprends la liaison, et l'exemple suivant fonctionne bien, mais je veux être capable de surveiller les changements des propriétés liées lors de l'exécution.mettre à jour le contenu au moment de l'exécution WPF

J'ai un joueur de classe:

class Player : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private string id; 
    public string ID { get => id; } 

    private int power; 
    public int Power 
    { 
     get => power; 
     set 
     { 
      if (this.power != value) 
      { 
       this.power = value; 
       if (this.PropertyChanged != null) 
        this.NotifyPropertyChanged("Power"); 
      } 
     } 
    } 


    public Player(string playerId) 
    { 
     id = playerId; 
     power = 50; 
    } 
} 

Je crée un certain nombre de joueurs qui se battent les uns contre les autres et gagner ou perdre de la puissance. En utilisant la liaison de données I afficher tous les joueurs id et points de puissance dans un ListView et l'histogramme de la distribution de points de puissance, en utilisant Polygon:

public partial class MainWindow : Window, INotifyPropertyChanged 
    { 
     private static readonly Random random = new Random(); 

     public event PropertyChangedEventHandler PropertyChanged; 
     public void NotifyPropertyChanged(string propName) 
     { 
      if (this.PropertyChanged != null) 
       this.PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
     } 

     private ObservableCollection<Player> players; 

     private PointCollection powerHistogramPoints; 
     public PointCollection PowerHistogramPoints 
     { 
      get => this.powerHistogramPoints; 
      set 
      { 
       if (this.powerHistogramPoints != value) 
       { 
        this.powerHistogramPoints = value; 
        if (this.PropertyChanged != null) this.NotifyPropertyChanged("PowerHistogramPoints"); 
       } 
      } 
     } 

     public MainWindow() 
     { 
      InitializeComponent(); 
      this.DataContext = this; 

      players = new ObservableCollection<Player> { }; 
      for (int i = 1; i < 10; i++) players.Add(new Player("player" + i.ToString("D3"))); 
      popListView.ItemsSource = players; 
      CreateHistogram(); 
     } 

     private void runButton_Click(object sender, RoutedEventArgs e) 
     { 
      RunEpochs(Int32.Parse(nEpochsTextBox.Text)); 
      CreateHistogram(); 
     } 

     private int[] CreateHistogram(...){...} 

     internal void RunEpochs(int nEpochs) 
     {for (int i = 0; i < nEpochs; i++) RunEpoch();} 
     private void RunEpoch(){...} 
    } 

et code XAML est:

 <ListView Margin="2" Name="popListView"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Header="player ID" Width="120" DisplayMemberBinding="{Binding ID}" /> 
        <GridViewColumn Header="power" Width="50" DisplayMemberBinding="{Binding Power}" /> 
       </GridView> 
      </ListView.View> 
     </ListView> 

et

  <GroupBox Height="200" Width="300" Header="Power Distribution" BorderThickness="0"> 
       <Border BorderThickness="1" BorderBrush="Black" Background="White" Margin="4"> 
        <Polygon Points="{Binding PowerHistogramPoints}" Stretch="Fill" Fill="Black" Opacity="0.8" /> 
       </Border> 
      </GroupBox> 

J'ai des contrôles qui me permettent de choisir le nombre d'époques à exécuter, et après leur exécution, le listview et l'histogramme se mettent bien à jour. Mais je veux être capable de courir, disons un million d'époques, et d'être capable de surveiller les changements dans les points du joueur et l'histogramme en temps réel (par exemple, mettre à jour la liste et le graphique toutes les 1000 époques, ou chaque seconde, etc. ..) Quels changements au code ci-dessus dois-je faire?

Toute aide serait appréciée!

Répondre

0

Vous pouvez supprimer les appels à NotifyPropertyChanged des propriétés Setters,

Et les appeler manuellement après votre touche minuterie votre jeu ElapsedTime. Le temporisateur peut être dans un thread de travail en arrière-plan et faire toute la notification à l'intérieur d'un bloc Dispatcher.BeginInvoke.