2017-08-08 63 views
0

我试图通过从图表控件继承来实现滚动折线图(类似于旧的图表记录器)。要做到这一点,我需要做两件事情:继承图表控件:如何更改默认值和行为

  1. 各种对象的更改默认属性图表控件使用
    • 系列应该默认为线,而不是列
    • ChartArea的X轴所需要的时间间隔和标签格式改变
    • ChartArea的Y轴所需要的间隔,IsStartedFromZero,和标签格式改变
  2. 变化T的行为他DataPointCollection的AddXY方法
    • 在一定时间之后,应该删除最早的数据点,每一个新的数据点
    • 应该刷新轴每个数据点被添加

虽然我能后手动完成所有这些,我想将所有内容封装到一个自定义控件中。我只想添加自定义控件和设计器,并且已经设置了所有这些属性并且已经包含了该行为。

作为一个测试,我都试过,只是更改继承图表控件的Text属性,但没有成功:

Public Class ScrollChart 
    Inherits Chart 

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

而且通过重写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 

我试图用两种不同的方式更改Series chartType:

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 

在任何情况下,使用设计器添加的控件中的属性都没有改变。我也尝试继承DataPointCollection,但不能因为它没有公开的New(),因此不能被继承。

我怀疑我需要替换继承Chart使用的Series和DataPointCollection类,以便更改它们的属性和方法,但到目前为止,我对如何实现这一点感到茫然。

+0

属性分配在ctor运行后发生,所以试图在第一个代码段中对代码“test”进行硬编码将被覆盖。第二个是一样的。我不确定你在第三场比赛中的表现。请阅读[问]并参加[游览] – Plutonix

+0

在第三个片段中,我试图让继承的Chart类使用继承的Series集合。这是试图覆盖默认的ChartType。我相信这是行不通的,因为正如你所提到的那样,它被覆盖,就像其他两个一样。 –

+0

前两个可能正在工作 - 默认情况下 - 初始起始值应该被替换为代码或设计器中分配的任何值。最后一个块没有显示被调用的块,因此会失败。请阅读[问]并参加[旅游] – Plutonix

回答

2

创建一个用户控件(不需要继承)并向其添加图表控件,然后您可以在包含图表控件的用户控件上创建属性。例如:

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

在控制器中,您可以指定任何您想要的属性!

我没有看到在这种情况下继承的好处。