using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace AutomaticApp.Controls { /// /// RaderChart.xaml 的交互逻辑 /// public partial class RaderChart : UserControl { public ObservableCollection ItemsSources { get { return (ObservableCollection)GetValue(ItemsSourcesProperty); } set { SetValue(ItemsSourcesProperty, value); } } public static readonly DependencyProperty ItemsSourcesProperty = DependencyProperty.Register( "ItemsSources", typeof(ObservableCollection), typeof(RaderChart), new PropertyMetadata(null, new PropertyChangedCallback(OnPropertyChanged))); private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (e.NewValue == null) return; (e.NewValue as ObservableCollection).CollectionChanged += (se, ev) => { (d as RaderChart).Refresh(); }; } public RaderChart() { InitializeComponent(); this.SizeChanged += RaderChart_SizeChanged; } private void RaderChart_SizeChanged(object sender, SizeChangedEventArgs e) { this.Refresh(); } private void Refresh() { if (ItemsSources.Count == 0) return; this.mainCanvas.Children.Clear(); this.p1.Points.Clear(); this.p2.Points.Clear(); this.p3.Points.Clear(); this.p4.Points.Clear(); this.p5.Points.Clear(); // 设置区域大小 double size = Math.Min(RenderSize.Width, RenderSize.Height); this.LayoutRoot.Width = size; this.LayoutRoot.Height = size; double raduis = size / 2; double step = 360.0 / ItemsSources.Count; for (int i = 0; i < ItemsSources.Count; i++) { p1.Points.Add(new Point( raduis + (raduis - 20) * Math.Cos((step * i - 90) * Math.PI / 180), raduis + (raduis - 20) * Math.Sin((step * i - 90) * Math.PI / 180) )); p2.Points.Add(new Point( raduis + (raduis - 20) * Math.Cos((step * i - 90) * Math.PI / 180) * 0.25, raduis + (raduis - 20) * Math.Sin((step * i - 90) * Math.PI / 180) * 0.25 )); p3.Points.Add(new Point( raduis + (raduis - 20) * Math.Cos((step * i - 90) * Math.PI / 180) * 0.5, raduis + (raduis - 20) * Math.Sin((step * i - 90) * Math.PI / 180) * 0.5 )); p4.Points.Add(new Point( raduis + (raduis - 20) * Math.Cos((step * i - 90) * Math.PI / 180) * 0.75, raduis + (raduis - 20) * Math.Sin((step * i - 90) * Math.PI / 180) * 0.75 )); p5.Points.Add(new Point( raduis + (raduis - 20) * Math.Cos((step * i - 90) * Math.PI / 180) * ItemsSources[i].Value / 100, raduis + (raduis - 20) * Math.Sin((step * i - 90) * Math.PI / 180) * ItemsSources[i].Value / 100 )); Line line = new Line(); line.Stroke = new SolidColorBrush(Color.FromArgb(34, 255, 255, 255));//颜色 line.StrokeThickness = 1;//线厚度 line.X1 = raduis; line.Y1 = raduis; line.X2 = raduis + (raduis - 20) * Math.Cos((step * i - 90) * Math.PI / 180); line.Y2 = raduis + (raduis - 20) * Math.Sin((step * i - 90) * Math.PI / 180); this.mainCanvas.Children.Add(line); TextBlock text = new TextBlock(); text.Width = 60; text.FontSize = 10; text.TextAlignment = TextAlignment.Center; text.Text = ItemsSources[i].Header; text.Foreground = new SolidColorBrush(Color.FromArgb(100, 255, 255, 255)); text.SetValue(Canvas.LeftProperty, raduis + (raduis - 10) * Math.Cos((step * i - 90) * Math.PI / 180) - 30); text.SetValue(Canvas.TopProperty, raduis + (raduis - 10) * Math.Sin((step * i - 90) * Math.PI / 180) - 7); this.mainCanvas.Children.Add(text); } } } public class RaderSeriesModel { public string Header { get; set; } public double Value { get; set; } } }