C# 在网格上显示大量线的最佳实践

C# 在网格上显示大量线的最佳实践,c#,wpf,line,lines,C#,Wpf,Line,Lines,我有一个程序,可以读取文件并从文件内容创建大约1000个点(X,Y坐标)。我想将这些点显示为网格上的小十字(基本上是一种图表) 这就是它的外观(绿色和蓝色交叉) 目前我正在代码隐藏中执行此操作: foreach (var measurement in collection) { createValueCross(measurement); } private void createValueCross(CGM_Measurement measurement) { // set c

我有一个程序,可以读取文件并从文件内容创建大约1000个点(X,Y坐标)。我想将这些点显示为网格上的小十字(基本上是一种图表)

这就是它的外观(绿色和蓝色交叉)

目前我正在代码隐藏中执行此操作:

foreach (var measurement in collection)
{
  createValueCross(measurement);
}

private void createValueCross(CGM_Measurement measurement)
{
    // set color of line (green when within opt range)
    var crossColor = measurement.Value < mvm.OptMaximum && measurement.Value > mvm.OptMinimum ? Colors.Green : Colors.Blue;

    //create lines
    Line horizontal = new Line();
    Line vertical = new Line();
    vertical.Stroke = horizontal.Stroke = new SolidColorBrush(crossColor);
    vertical.StrokeThickness = horizontal.StrokeThickness = 1;

    //get center coordinates
    var x = measurement.Time.getXPosition();
    x = x < 10 ? 10 : x;
    var y = measurement.Value.getYPosition();
    y = y < 10 ? 10 : y;

    // set line start/endpoint +-2 pix from center 
    horizontal.X1 = x - 2;
    horizontal.X2 = x + 2;
    horizontal.Y1 = horizontal.Y2 = y;
    vertical.Y1 = y - 2;
    vertical.Y2 = y + 2;
    vertical.X1 = vertical.X2 = x;

    // draw lines on grid
    chartDataGrid.Children.Add(horizontal);
    chartDataGrid.Children.Add(vertical);

}
foreach(集合中的var度量)
{
创造价值交叉(测量);
}
私有void createValueCross(CGM_测量)
{
//设置线条颜色(在选项范围内时为绿色)
var crossColor=measurement.Valuemvm.OptMinimum?颜色。绿色:颜色。蓝色;
//创建线条
水平线=新线();
直线垂直=新线();
垂直。笔划=水平。笔划=新的SolidColorBrush(crossColor);
垂直。冲程厚度=水平。冲程厚度=1;
//获取中心坐标
var x=measurement.Time.getXPosition();
x=x<10?10:x;
var y=measurement.Value.getYPosition();
y=y<10?10:y;
//将线起点/终点设置为距中心+2像素
水平方向X1=x-2;
水平方向:X2=x+2;
水平。Y1=水平。Y2=y;
垂直方向:y.Y1=y-2;
垂直方向:y.Y2=y+2;
垂直。X1=垂直。X2=x;
//在网格上画线
chartDataGrid.Children.Add(水平);
chartDataGrid.Children.Add(垂直);
}

在XAML中也有这样的好方法吗?与“多段线”类似,您可以在其中指定点集合?

因此,以下是解决方案:

C#代码:

LinesVM-vm;
公共主窗口()
{
初始化组件();
vm=新的LinesVM();
vm.Lines=新的ObservableCollection();
SolidColorBrush col=新的SolidColorBrush(Colors.Red);
添加(新的线点(1,5,col));
添加(新的线点(10、15、列));
添加(新的线点(41,45,col));
添加(新的线点(71、85、col));
DataContext=vm;
}
公共类LinesVM
{
私人可观测采集线;
公共可观测收集线
{
获取{返回_行;}
设置
{
如果(_行==值)
返回;
_行=值;
}
}
}
公共类线点:INotifyPropertyChanged
{
公共事件PropertyChangedEventHandler PropertyChanged=(发送方,e)=>{};
公共线点(双x、双y、SolidColorBrush颜色)
{
X=X;
Y=Y;
颜色=颜色;
}
私人SolidColorBrush_颜色;
公共色刷颜色
{
获取{return\u color;}
设置
{
如果(_color==值)
返回;
_颜色=值;
PropertyChanged(这是新的PropertyChangedEventArgs(名称(颜色));
}
}
私人双_x1;
公共双X1
{
获取{return}
设置
{
如果(_x1==值)
返回;
_x1=数值;
PropertyChanged(此,新PropertyChangedEventArgs(名称(X1));
}
}
私人双_x2;
公共双X2
{
获取{return}
设置
{
如果(x2==值)
返回;
_x2=数值;
PropertyChanged(此,新PropertyChangedEventArgs(名称(X2));
}
}
私人双1;
公共双Y1
{
获取{return}
设置
{
如果(_y1==值)
返回;
_y1=数值;
PropertyChanged(此,新PropertyChangedEventArgs(名称(Y1));
}
}
私人双人房(y2);;
公共双Y2
{
获取{return\uy2;}
设置
{
如果(_y2==值)
返回;
_y2=数值;
PropertyChanged(此,新PropertyChangedEventArgs(名称(Y2));
}
}
私人双人房;
公共双Y
{
获取{return\u y;}
设置
{
如果(_y==值)
返回;
_y=值;
PropertyChanged(此,新PropertyChangedEventArgs(名称(Y));
Y1=Y-2;
Y2=Y+2;
}
}
私人双x;
公共双X
{
获取{return\ux;}
设置
{
如果(_x==值)
返回;
_x=值;
PropertyChanged(此,新PropertyChangedEventArgs(名称(X));
X1=X-2;
X2=X+2;
}
}
}
私有无效按钮\u单击\u 1(对象发送者,路由目标)
{
SolidColorBrush col=新的SolidColorBrush(Colors.Black);
添加(新的线点(21、25、列));
添加(新的线点(210、215、列));
添加(新的线点(241、145、col));
添加(新的线点(171、185、列));
vm.Lines[1].Color=col;
}
和XAML:

 <Grid x:Name="maingrid">
        <Button Height="20" Width="50" HorizontalAlignment="Left" VerticalAlignment="Top" Click="Button_Click_1">click</Button>

        <ItemsControl Name="IC" ItemsSource="{Binding Lines}" Margin="10">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Canvas/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>

            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Canvas>
                        <Line Name="horizontal" X1="{Binding X1}" X2="{Binding X2}" Y1="{Binding Y}" Y2="{Binding Y}"
                          StrokeThickness="1" Stroke="{Binding Color}"/>
                        <Line Name="vertical" X1="{Binding X}" X2="{Binding X}" Y1="{Binding Y1}" Y2="{Binding Y2}"
                          StrokeThickness="1" Stroke="{Binding Color}"/>
                    </Canvas>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>

点击

这可能会有帮助:。或者这样:所以我必须创建一个itemscontrol,其中包含水平线和垂直线,并将其绑定到一个点集合?我不知道。你的问题太宽泛了。是的,我知道
 <Grid x:Name="maingrid">
        <Button Height="20" Width="50" HorizontalAlignment="Left" VerticalAlignment="Top" Click="Button_Click_1">click</Button>

        <ItemsControl Name="IC" ItemsSource="{Binding Lines}" Margin="10">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Canvas/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>

            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Canvas>
                        <Line Name="horizontal" X1="{Binding X1}" X2="{Binding X2}" Y1="{Binding Y}" Y2="{Binding Y}"
                          StrokeThickness="1" Stroke="{Binding Color}"/>
                        <Line Name="vertical" X1="{Binding X}" X2="{Binding X}" Y1="{Binding Y1}" Y2="{Binding Y2}"
                          StrokeThickness="1" Stroke="{Binding Color}"/>
                    </Canvas>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>