2017-08-08 5 views
0

J'essaie d'implémenter un graphique en ligne déroulant (similaire aux anciens enregistreurs graphiques) en héritant du contrôle de graphique. Pour ce faire, je dois faire deux choses:Contrôle de diagramme hérité: comment modifier les valeurs et le comportement par défaut

  1. Modifier les propriétés par défaut des différents objets du contrôle graphique utilise
    • série devrait par défaut à la ligne, au lieu de la colonne
    • de ChartArea l'axe X a besoin de l'intervalle et le format de l'étiquette a changé
    • l'axe Y de ChartArea doit l'intervalle, IsStartedFromZero et format d'étiquette a changé
  2. changer le comportement de t La méthode AddXY de lui DataPointCollection
    • Après un certain temps, il faut supprimer le point de données les plus anciennes pour chaque nouvelle point de données
    • Il faut rafraîchir l'axe après chaque point de données est ajouté

Alors que je peux faire tout cela manuellement, je voudrais tout encapsuler dans un contrôle personnalisé. Je veux juste ajouter le contrôle personnalisé avec le concepteur, et avoir toutes ces propriétés déjà définies et le comportement déjà inclus.

En tant que test, j'ai essayé de changer juste la propriété Text du contrôle graphique hérité, sans succès:

Public Class ScrollChart 
    Inherits Chart 

    Public Sub New() 
     Me.Text = "Test" 
    End Sub 
End Class 

Et en remplaçant la propriété Text:

Public Class ScrollChart 
    Inherits Chart 

    Private _myText As String = "Test" 
    Public Overrides Property Text() As String 
     Get 
      Return _myText 
     End Get 
     Set(value As String) 
      _myText = value 
     End Set 
    End Property 
End Class 

I essayé de changer la série chartType de deux façons différentes:

Public Class ScrollChart 
    Inherits Chart 

    Friend WithEvents Chart1 As Chart 

    Private Sub InitializeComponent() 
     Dim ChartArea1 As System.Windows.Forms.DataVisualization.Charting.ChartArea = New System.Windows.Forms.DataVisualization.Charting.ChartArea() 
     Dim Legend1 As System.Windows.Forms.DataVisualization.Charting.Legend = New System.Windows.Forms.DataVisualization.Charting.Legend() 
     Dim Series1 As ScrollSeries = New ScrollSeries 
     Me.Chart1 = New System.Windows.Forms.DataVisualization.Charting.Chart() 
     CType(Me.Chart1, System.ComponentModel.ISupportInitialize).BeginInit() 
     CType(Me, System.ComponentModel.ISupportInitialize).BeginInit() 
     Me.SuspendLayout() 
     ' 
     'Chart1 
     ' 
     ChartArea1.Name = "ChartArea1" 
     Me.Chart1.ChartAreas.Add(ChartArea1) 
     Legend1.Name = "Legend1" 
     Me.Chart1.Legends.Add(Legend1) 
     Me.Chart1.Location = New System.Drawing.Point(0, 0) 
     Me.Chart1.Name = "Chart1" 
     Series1.ChartArea = "ChartArea1" 
     Series1.Legend = "Legend1" 
     Series1.Name = "Series1" 
     Series1.ChartType = SeriesChartType.Line 
     Me.Chart1.Series.Add(Series1) 
     Me.Chart1.Size = New System.Drawing.Size(300, 300) 
     Me.Chart1.TabIndex = 0 
     Me.Chart1.Text = "Test" 
     CType(Me.Chart1, System.ComponentModel.ISupportInitialize).EndInit() 
     CType(Me, System.ComponentModel.ISupportInitialize).EndInit() 
     Me.ResumeLayout(False) 

    End Sub 
End Class 

Public Class ScrollSeries 
    Inherits Series 

    Public Sub New() 
     MyBase.New() 

     Me.ChartType = SeriesChartType.Line 
    End Sub 

End Class 

Dans tous les cas, les propriétés du contrôle que j'ai ajouté en utilisant le concepteur n'ont pas changé. J'ai également essayé d'hériter de DataPointCollection, mais je ne peux pas parce qu'il n'a pas exposé New(), et donc ne peut pas être hérité. Je suppose que j'ai besoin de remplacer les classes Series et DataPointCollection que mon graphique hérité utilise pour changer leurs propriétés et leurs méthodes, mais jusqu'à présent je ne sais pas comment faire.

+0

Les affectations de propriété se produisent après l'exécution de ctor, de sorte que le fait d'essayer de coder en dur "test" comme dans le premier extrait sera écrasé. Pareil pour la seconde. Je ne suis pas sûr de ce que vous faites dans la 3ème. Veuillez lire [ask] et prendre le [tour] – Plutonix

+0

Dans le troisième extrait, j'essayais de faire en sorte que la classe Chart héritée utilise à la place une collection Series héritée.C'était une tentative de remplacer le ChartType par défaut. Je crois que cela n'a pas fonctionné parce que, comme vous l'avez mentionné, il a été remplacé par les deux autres. –

+0

Les deux premiers fonctionnent probablement - le défaut - la valeur de départ initiale est censée être remplacée par n'importe quelle valeur assignée dans le code ou le concepteur. Le dernier bloc ne montre pas que le bloc est appelé, donc cela échouera. S'il vous plaît lire [demander] et prendre le [tour] – Plutonix

Répondre

2

Créez un contrôle utilisateur (sans hériter) et ajoutez-lui le contrôle de graphique, puis vous pouvez créer des propriétés sur le contrôle utilisateur qui enveloppent le contrôle de graphique. Par exemple:

Public Property ChartText() As String 
    Get 
     Return Chart1.Text 
    End Get 
    Set(value As String) 
     Chart1.Text = value 
    End Set 
End Property 

Dans le ctor pour votre contrôle, vous pouvez affecter toutes les propriétés que vous voulez!

Je ne vois pas l'avantage d'hériter dans ce cas.