在wpf中设计一个柱状图,横坐标为日期,纵坐标为数量,每个日期有2个柱状图,分别代表合格与不合格
时间: 2024-10-17 20:12:13 浏览: 23
要在 WPF 中创建一个带有两个柱状图(分别代表合格与不合格)的日期横向柱状图,你可以使用`Chart`控件以及数据绑定。以下是一个简单的步骤和代码示例:
首先,确保已经添加了 `System.Windows.DataVisualization.Charting` 命名空间,如果尚未添加,可以在 XAML 文件顶部加上:
```xml
xmlns:charting="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=WindowsBase"
```
然后,在 XAML 部分编写 Chart 控制器:
```xml
<Window x:Class="YourNamespace.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:YourNamespace"
xmlns:charting="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=WindowsBase"
Title="MainWindow" Height="450" Width="800">
<Grid>
<StackPanel Orientation="Horizontal">
<!-- 合格柱状图 -->
<charting:ColumnSeries Name="PassSeries">
<charting:CategoryAxis DisplayMemberPath="Date" />
<charting:ValueAxis Minimum="0" />
</charting:ColumnSeries>
<!-- 不合格柱状图 -->
<charting:ColumnSeries Name="FailSeries">
<charting:CategoryAxis DisplayMemberPath="Date" />
<charting:ValueAxis Minimum="0" />
</charting:ColumnSeries>
</StackPanel>
<charting:Chart Grid.Row="1">
<charting:Chart.Series>
<charting:Series>
<!-- 将 DataTemplate 设置为包含两个数据点,一个代表合格,另一个代表不合格 -->
<charting:Series.ItemsSource>
<local:ArrayOfDataPoints/>
</charting:Series.ItemsSource>
<charting:Series.DataPointStyle>
<Style TargetType="{x:Type charting:DataPoint}">
<Setter Property="Fill">
<!-- 使用条件模板根据合格/不合格状态填充颜色 -->
<Setter.Value>
<SolidColorBrush Color="{Binding IsPass, Converter={StaticResource BoolToColorConverter}, FallbackValue=Transparent}"/>
</Setter.Value>
</Setter>
</Style>
</charting:Series.DataPointStyle>
<!-- 指定柱状图系列类型为堆积柱状图 -->
<charting:Series.BarGrouping="Group">
<charting:Series.Title>Quality</charting:Series.Title>
</charting:Series>
</charting:Series>
</charting:Chart.Series>
</charting:Chart>
</Grid>
</Window>
```
这里我们假设有一个名为`ArrayOfDataPoints`的数据模型类,其中包含`Date`, `IsPass`属性以及对应的数据。`BoolToColorConverter` 是一个自定义转换器,用于将布尔值转换为颜色。
接下来,你需要实现`ArrayOfDataPoints`类和`BoolToColorConverter`。`ArrayOfDataPoints` 类可以是这样的:
```csharp
public class ArrayOfDataPoints : ObservableCollection<DataPoint>
{
public ArrayOfDataPoints()
{
// 添加你的合格与不合格数据点,例如:
Add(new DataPoint { Date = DateTime.Now.AddDays(-1), IsPass = true });
Add(new DataPoint { Date = DateTime.Now.AddDays(-2), IsPass = false });
// 更多数据...
}
}
public class DataPoint
{
public DateTime Date { get; set; }
public bool IsPass { get; set; }
}
```
`BoolToColorConverter` 可能看起来像这样:
```csharp
public class BoolToColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool pass && targetType == typeof(Brush))
{
return pass ? Brushes.Green : Brushes.Red;
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
```
阅读全文