使用vb.Net在WPF图表中显示行系列

时间:2014-07-29 16:31:51

标签: wpf vb.net charts lineseries

我在将一些VB.Net winforms代码移植到WPF时遇到了相当令人沮丧的时间,并且可以提供一些帮助:

简而言之,我拥有动态生成的数据,我需要在lineseries上绘制。无论我尝试什么,图表都顽固地拒绝显示我的数据!我几乎与.DataContext / .ItemsSource / Bindings /等的每一个组合都搞砸了。我可以找到并且有一个严肃的谷歌,但好的VB.Net例子似乎很薄。我显然错过了一些“简单”的东西......任何建议都会受到欢迎。

剪切代码如下:

XAML:

    <Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit" x:Class="MainWindow"
Title="MainWindow" Height="350" Width="525">
<Grid>

    <chartingToolkit:Chart x:Name="MyChart" HorizontalAlignment="Left" Margin="10,10,0,0" Title="Chart Title" VerticalAlignment="Top" Height="300" Width="497">
        <chartingToolkit:LineSeries x:Name="MyLineSeries" DependentValueBinding="{Binding Path=Intensity}"  IndependentValueBinding="{Binding Path=PxNum}" IsSelectionEnabled="True" ItemsSource="{Binding}" >


            <!-- Vertical axis for Intensity values -->
            <chartingToolkit:LineSeries.DependentRangeAxis>
                <chartingToolkit:LinearAxis
                                Orientation="Y"
                                Title="Intensity"
                                Minimum="0"
                                Maximum="65535"
                                Interval="8000"
                                ShowGridLines="True"
                    />
            </chartingToolkit:LineSeries.DependentRangeAxis>
        </chartingToolkit:LineSeries>

        <chartingToolkit:Chart.Axes>
            <!-- Shared horizontal axis -->
            <chartingToolkit:LinearAxis
                            Orientation="X"
                            Title="Detector px"
                            Interval="64"
                            Minimum="0"
                            Maximum="256"
                            ShowGridLines="True"/>
        </chartingToolkit:Chart.Axes>

    </chartingToolkit:Chart>

</Grid>
</Window>

VB:

    Imports System.Collections.ObjectModel

    Class MainWindow

    Dim Series_Saturation As New ObservableCollection(Of GraphPoint)

    Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded


    Series_Saturation.Add(New GraphPoint() With {.PxNum = 0, .Intensity = 54000}) '    New KeyValuePair(Of Int32, Int32)(0, 54000))
    Series_Saturation.Add(New GraphPoint() With {.PxNum = 200, .Intensity = 54000}) '   New KeyValuePair(Of Int32, Int32)(nPX, 54000))

    MyLineSeries.DataContext = Series_Saturation
End Sub

End Class


Public Class GraphPoint

    Public Property PxNum As Long
    Public Property Intensity As Long

End Class

1 个答案:

答案 0 :(得分:0)

对它进行排序: - )

信息的重要组成部分在此链接中:how to plot values in line series graph using two textboxes in wpf

似乎有两个细微之处 - 似乎没有孤立地解决问题,但两者的结合确实如此:

基本上,只需在VB WPF窗口上拖放WPF工具包图表,就可以添加xmlns条目:

    xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit" x:Class="MainWindow"

Title =“MainWindow”身高=“350”宽度=“525”&gt;

,您的图表定义为

    <chartingToolkit:Chart x:Name="MyChart"    ...>
    </chartingToolkit:Chart>

这一切似乎编译好了,但是我的VB代码不会显示点数。请注意以下代码中的不同xmlns,它们似乎工作得很好。这可能是因为我的开发PC上有多个开发环境?

另请注意,在此示例中,为图表设置了datacontext,而不是行系列。我的下一个挑战是看看当我尝试显示多行时会发生什么!

我还应该补充一点,定义轴的方式的变化不是使其表现的因素,这只是探索的众多途径之一。文本框&amp;按钮只是为了展示添加点 - 我对布局中缺乏技巧没有道歉,我只是希望这件事能够发挥作用!!

XAML:

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Toolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit" 
x:Class="MainWindow"
Title="MainWindow" Height="352.357" Width="803.114">
<Grid>


    <Toolkit:Chart Name="MyChart" 
                   Title="Line Series Demo" 
                   VerticalAlignment="Top" 
                   Height="320"
                   Width="500" Margin="32,0,263,0">
        <Toolkit:Chart.Axes>
            <!-- Shared horizontal axis -->
            <Toolkit:LinearAxis
                            Orientation="X"
                            Title="Detector px"
                            Interval="64"
                            Minimum="0"
                            Maximum="256"
                            ShowGridLines="True"/>
            <Toolkit:LinearAxis
                                Orientation="Y"
                                Title="Intensity"
                                Minimum="0"
                                Maximum="65535"
                                Interval="8000"
                                ShowGridLines="True"/>
        </Toolkit:Chart.Axes>

        <Toolkit:LineSeries  DependentValuePath="Intensity" 
                             IndependentValuePath="PxNum" 
                             ItemsSource="{Binding UpdateSourceTrigger=PropertyChanged}" 
                             IsSelectionEnabled="True"/>
    </Toolkit:Chart>

    <TextBox x:Name="txtX" HorizontalAlignment="Left" Height="25" Margin="550,10,0,0" TextWrapping="Wrap" Text="0" VerticalAlignment="Top" Width="78"/>
    <TextBox x:Name="txtY" HorizontalAlignment="Left" Height="25" Margin="648,10,0,0" TextWrapping="Wrap" Text="0" VerticalAlignment="Top" Width="78"/>
    <Button x:Name="butAdd" Content="Add Point" HorizontalAlignment="Left" Height="29" Margin="648,40,0,0" VerticalAlignment="Top" Width="78"/>

</Grid>
</Window>

VB:

Imports System.Collections.ObjectModel

Class MainWindow

Dim Series_Saturation As New ObservableCollection(Of GraphPoint)

Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded


    Series_Saturation.Add(New GraphPoint() With {.PxNum = 0, .Intensity = 54000}) '    New KeyValuePair(Of Int32, Int32)(0, 54000))
    Series_Saturation.Add(New GraphPoint() With {.PxNum = 200, .Intensity = 4000}) '   New KeyValuePair(Of Int32, Int32)(nPX, 54000))


    MyChart.DataContext = Series_Saturation

End Sub



Private Sub butAdd_Click(sender As Object, e As RoutedEventArgs) Handles butAdd.Click

    Dim X As Int32 = CInt(txtX.Text)
    Dim Y As Int32 = CInt(txtY.Text)

    Series_Saturation.Add(New GraphPoint() With {.PxNum = X, .Intensity = Y}) 

End Sub
End Class


Public Class GraphPoint

    Public Property PxNum As Long
    Public Property Intensity As Long

End Class

我衷心希望这有助于其他人!