【问题标题】:Inherited Chart control: How to change default values and behaviour继承的图表控件:如何更改默认值和行为
【发布时间】:2018-01-16 07:20:03
【问题描述】:

我正在尝试通过从图表控件继承来实现滚动折线图(类似于旧的图表记录器)。为此,我需要做两件事:

  1. 更改图表控件使用的各种对象的默认属性
    • 系列应默认为行,而不是列
    • ChartArea 的 X 轴需要更改区间和标签格式
    • ChartArea 的 Y 轴需要区间,IsStartedFromZero,标签格式改变
  2. 更改 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


【解决方案1】:

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

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

在您的控件的ctor中,您可以分配您想要的任何属性!

在这种情况下,我看不到继承的好处。

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 2011-08-04
    • 2010-09-05
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多