【发布时间】:2018-01-16 07:20:03
【问题描述】:
我正在尝试通过从图表控件继承来实现滚动折线图(类似于旧的图表记录器)。为此,我需要做两件事:
- 更改图表控件使用的各种对象的默认属性
- 系列应默认为行,而不是列
- ChartArea 的 X 轴需要更改区间和标签格式
- ChartArea 的 Y 轴需要区间,IsStartedFromZero,标签格式改变
- 更改 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 类以更改它们的属性和方法,但到目前为止我不知道该怎么做。
【问题讨论】:
-
属性分配发生在 ctor 运行之后,因此在第一个 sn-p 中尝试硬编码“测试”将被覆盖。第二个也一样。我不确定你在 3 日在做什么。请阅读How to Ask 并采取tour
-
在第三个 sn-p 中,我试图让继承的 Chart 类使用继承的 Series 集合。这是一种覆盖默认 ChartType 的尝试。我相信它不起作用,因为正如你所提到的,它被覆盖与其他两个相同。
-
前两个可能正在工作 - 默认值 - 初始起始值应该被代码或设计器中分配的任何值替换。最后一个块没有显示该块被调用,所以这将失败。请阅读How to Ask 并采取tour
-
另外,我确实读过如何提问;以后提问的时候有什么我应该做或不应该做的事情吗?我应该缩短第三个 sn-p 吗?
-
你可能想阅读继承 - 如果你继承 Chart,你的东西 is 是一个图表,所以你不需要一个本地 Chart 变量.要挂钩事件,您将
override相应的方法(例如OnMouseDoubleClick)而不是使用事件
标签: .net vb.net inheritance mschart microsoft-chart-controls