Редактировать: мои графики работают, но они не отвечают квесту в заголовке.
Я изменил свой xaml на следующий из приведенного ниже.
<chartWPF:CartesianChart Height="{Binding Path=MainVM.Scaler.HalfScreenLTHeight}" Width="{Binding Path=MainVM.Scaler.HalfScreenLTWidth}" Foreground="Black">
<chartWPF:CartesianChart.Series >
<chartWPF:LineSeries Values="{Binding Path=DBWindow.HourGross}" StrokeThickness="{Binding Path=MainVM.Scaler.StrokeSize}" Title="Target" PointGeometrySize = "{Binding Path=MainVM.Scaler.LineDotSize}" PointForeground = "DeepSkyBlue" Stroke="DeepSkyBlue" Fill="Transparent" LineSmoothness="0" />
<chartWPF:StackedColumnSeries Values="{Binding Path=DBWindow.HourCounts}" StrokeThickness="0" StrokeDashArray="0" Title="Good Parts" Fill="Green" PointGeometry="{x:Null}" />
<chartWPF:StackedColumnSeries Values="{Binding Path=DBWindow.HourScrap}" StrokeThickness="0" StrokeDashArray="0" Title="Scrap Parts" Fill="Red" PointGeometry="{x:Null}" />
</chartWPF:CartesianChart.Series>
<chartWPF:CartesianChart.AxisX>
<chartWPF:Axis Title="Hourly Counts" Labels="{Binding Path=DBWindow.Hours}" ShowLabels="True" Typography.Kerning="False" Foreground="Black" FontSize="{Binding Path=MainVM.Scaler.ScrapButtonFontSize3}" LabelFormatter="{Binding Path=DBWindow.HoursLabels}" MinValue="0">
<chartWPF:Axis.Separator>
<chartWPF:Separator Step="1"></chartWPF:Separator>
</chartWPF:Axis.Separator>
</chartWPF:Axis>
</chartWPF:CartesianChart.AxisX>
<chartWPF:CartesianChart.AxisY>
<chartWPF:Axis Title="Parts" Foreground="Black" FontSize="{Binding Path=MainVM.Scaler.ScrapButtonFontSize3}" MinValue="0">
</chartWPF:Axis>
</chartWPF:CartesianChart.AxisY>
</chartWPF:CartesianChart>
ОРИГИНАЛЬНЫЙ ПОЧТА:
Я пытаюсь перейти от показа диаграммы одной машины на экране к показу 4 машин одновременно. Я использую LiveCharts.WPF NuGet. Я использую WPF с настройкой MVVM. На графике должен быть столбец с накоплением для каждого часа хороших деталей и брака с серией линий, равной ожидаемой брутто для этих часов.
Я пробовал как с itemcontrol, так и с 4 отдельными диаграммами, настроенными на просмотр определенных машин в наблюдаемой коллекции "MachList [0]"
Если я изменюсь
chartWPF:CartesianChart Series="{Binding Path=DBWindow.SeriesHoursCollection}"
до
chartWPF:CartesianChart Series="{Binding Path=MainVM.SelectedMach.DBWindow.SeriesHoursCollection}"
График показывает только выбранный в данный момент компьютер на 4-м графике, независимо от того, какой компьютер я выбрал, хотя он должен быть на всех графиках. Я могу добавить счетчики к этой машине и обновления графиков без сбоев.
XAML:
<ItemsControl ItemsSource="{Binding Path=MachList}" >
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" HorizontalAlignment="Center"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<chartWPF:CartesianChart Series="{Binding Path=DBWindow.SeriesHoursCollection}" LegendLocation="Bottom"
Height="{Binding Path=MainVM.Scaler.HalfScreenLTHeight}" Width="{Binding Path=MainVM.Scaler.HalfScreenLTWidth}" Foreground="Black">
<chartWPF:CartesianChart.AxisX>
<chartWPF:Axis Title="Hourly Counts"
Labels="{Binding Path=DBWindow.Hours}" ShowLabels="True" Typography.Kerning="False"
Foreground="Black" FontSize="{Binding Path=MainVM.Scaler.ScrapButtonFontSize3}"
LabelFormatter="{Binding Path=DBWindow.HoursLabels}" MinValue="0">
<chartWPF:Axis.Separator>
<chartWPF:Separator Step="1"></chartWPF:Separator>
</chartWPF:Axis.Separator>
</chartWPF:Axis>
</chartWPF:CartesianChart.AxisX>
<chartWPF:CartesianChart.AxisY>
<chartWPF:Axis Title="Parts" Foreground="Black" FontSize="{Binding Path=MainVM.Scaler.ScrapButtonFontSize3}" MinValue="0">
</chartWPF:Axis>
</chartWPF:CartesianChart.AxisY>
</chartWPF:CartesianChart>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
DBWindow:
public SeriesCollection SeriesHoursCollection
{
get { return _seriesHoursCollection; }
set
{
_seriesHoursCollection = value;
OnPropertyChanged("");
}
}
public Func<double, string> HoursLabels
{
get { return _hLables; }
set
{
_hLables = value;
OnPropertyChanged();
}
}
public ChartValues<double> HourCounts
{
get { return _hourCouts; }
set
{
_hourCouts = value;
OnPropertyChanged();
}
}
public ChartValues<double> HourScraps
{
get { return _hourScraps; }
set
{
_hourScraps = value;
OnPropertyChanged();
}
}
public ChartValues<double> HourGross
{
get { return _hourGross; }
set
{
_hourGross = value;
OnPropertyChanged();
}
}
public List<string> Hours
{
get { return _hours; }
set
{
_hours = value;
OnPropertyChanged();
}
}
//Function is called to update the charts when counts are changed for a machine
public void HourStackBars()
{
if (SeriesHoursCollection.Chart != null)
{ SeriesHoursCollection.Clear(); }
Hours = new List<string>();
HourCounts = new ChartValues<double>();
HourScraps = new ChartValues<double>();
HourGross = new ChartValues<double>();
var maxGross = 0;
var hour = 1;
for (int i=0; i< _machVM.HourCountGraph.Count; i++)
{
if(i == 0) { maxGross = _machVM.HourCountGraph[i].Gross; }
HourCounts.Add(_machVM.HourCountGraph[i].GoodParts);
HourScraps.Add(_machVM.HourCountGraph[i].ScrapParts);
HourGross.Add(_machVM.HourCountGraph[i].Gross);
Hours.Add(Convert.ToString(_machVM.HourCountGraph[i].Hour));
hour++;
}
for (int t = hour; t <= _machVM.MainVM.ShiftHourCount; t++)
{
if (_machVM.RunningPart != "")
{
maxGross = Convert.ToInt32(_machVM.MainVM.SelectedPart.PartGross);
HourGross.Add(maxGross);
}
Hours.Add(Convert.ToString(hour));
hour++;
}
if (HourCounts.Count > 0 && HourGross.Count > 0)
{
SeriesHoursCollection = new SeriesCollection
{
new LineSeries
{
Title = "Target",
Values = HourGross,
Stroke = Brushes.DeepSkyBlue,
StrokeThickness = _machVM.MainVM.Scaler.StrokeSize,
PointGeometrySize = _machVM.MainVM.Scaler.LineDotSize,
FontSize = _machVM.MainVM.Scaler.ReportHeadFontSize,
PointForeground = Brushes.DeepSkyBlue,
UseLayoutRounding = false,
Fill = Brushes.Transparent
},
new StackedColumnSeries
{
Title = "Good Parts",
Values = HourCounts,
DataLabels = true,
Fill = Brushes.Green,
FontSize = _machVM.MainVM.Scaler.ReportHeadFontSize,
UseLayoutRounding = false
},
new StackedColumnSeries
{
Title = "Scrap Parts",
Values = HourScraps,
DataLabels = true,
Fill = Brushes.Red,
FontSize = _machVM.MainVM.Scaler.ReportHeadFontSize,
UseLayoutRounding = false
}
};
}
else
{
SeriesHoursCollection = new SeriesCollection();
}
HoursLabels = val => val.ToString("P");
}
Я хочу видеть 4 графика на экране, и когда я добавляю счет к машине, график этой машины обновляется, чтобы отразить это дополнение. Сейчас происходит сбой программы.
Все это отлично работает на одной диаграмме, в среде с одним компьютером.