中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

WPF如何實現雷達圖

發布時間:2022-07-29 09:43:49 來源:億速云 閱讀:352 作者:iii 欄目:開發技術

今天小編給大家分享一下WPF如何實現雷達圖的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

實現代碼

一、創建 RadarChart.cs 菜單繼承 Control代碼如下

RadarChart.cs實現思路如下

1、RadarArray :存放展示集合 。

2、重寫OnRender 。

3、根據三角函數和圓的半徑計算出圓上的N個點繪制成多邊形GetPolygonPoint()。

4、在繪制多邊形的時候因為需要多個大小不一的多邊形,則需要多次調用GetPolygonPoint()方法,最外層繪制150,中間層100,中心點層 50。

5、DrawPoints() 方法增加了一個bool參數isDrawText是否繪制Text文本,因為最外側需要繪制文本。

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;

namespace WPFDevelopers.Controls
{
    public class RadarChart:Control
    {
        public ObservableCollection<RadarModel> RadarArray
        {
            get { return (ObservableCollection<RadarModel>)GetValue(RadarArrayProperty); }
            set { SetValue(RadarArrayProperty, value); }
        }

        public static readonly DependencyProperty RadarArrayProperty =
            DependencyProperty.Register("RadarArray", typeof(ObservableCollection<RadarModel>), typeof(RadarChart), new PropertyMetadata(null));


        static RadarChart()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(RadarChart), new FrameworkPropertyMetadata(typeof(RadarChart)));
        }
        protected override void OnRender(DrawingContext drawingContext)
        {
            DrawPoints(150, drawingContext,true);
            DrawPoints(100, drawingContext);
            DrawPoints(50, drawingContext);

            var myPen = new Pen
            {
                Thickness = 4,
                Brush = Brushes.DodgerBlue
            };
            myPen.Freeze();
            StreamGeometry streamGeometry = new StreamGeometry();
            using (StreamGeometryContext geometryContext = streamGeometry.Open())
            {
                var h = this.ActualHeight / 2;
                var w = this.ActualWidth / 2;
                PointCollection points = new PointCollection();
                foreach (var item in RadarArray)
                {
                    var ss = new Point((item.PointValue.X - w) / 100 * item.ValueMax + w,(item.PointValue.Y - h) / 100 * item.ValueMax + h);
                    points.Add(ss);
                }
                geometryContext.BeginFigure(points[points.Count - 1], true, true);
                geometryContext.PolyLineTo(points, true, true);
            }
            streamGeometry.Freeze();
            SolidColorBrush rectBrush = new SolidColorBrush(Colors.LightSkyBlue);
            rectBrush.Opacity = 0.5;
            drawingContext.DrawGeometry(rectBrush, myPen, streamGeometry);
        }
        void DrawPoints(int circleRadius, DrawingContext drawingContext,bool isDrawText = false)
        {
            var myPen = new Pen
            {
                Thickness = 2,
                Brush = Brushes.Gainsboro
            };
            myPen.Freeze();
            StreamGeometry streamGeometry = new StreamGeometry();
            using (StreamGeometryContext geometryContext = streamGeometry.Open())
            {
                var h = this.ActualHeight / 2;
                var w = this.ActualWidth / 2;
                PointCollection points = null;
                if (isDrawText)
                    points = GetPolygonPoint(new Point(w, h), circleRadius, RadarArray.Count, drawingContext);
                else
                    points = GetPolygonPoint(new Point(w, h), circleRadius, RadarArray.Count);
                geometryContext.BeginFigure(points[points.Count - 1], true, true);
                geometryContext.PolyLineTo(points, true, true);
            }
            streamGeometry.Freeze();
            drawingContext.DrawGeometry(null, myPen, streamGeometry);
        }
        private PointCollection GetPolygonPoint(Point center, double r, int polygonBound, DrawingContext drawingContext = null)
        {
            double g = 18;
            double perangle = 360 / polygonBound;
            double pi = Math.PI;
            List<Point> values = new List<Point>();
            for (int i = 0; i < polygonBound; i++)
            {
                Point p2 = new Point(r * Math.Cos(g * pi / 180) + center.X, r * Math.Sin(g * pi / 180) + center.Y);
                if(drawingContext != null)
                {
                    FormattedText formattedText = new FormattedText(
                   RadarArray[i].Text,
                   CultureInfo.CurrentCulture,
                   FlowDirection.LeftToRight,
                   new Typeface(new FontFamily("Arial"), FontStyles.Normal, FontWeights.Thin, FontStretches.Normal),
                   20.001D, Brushes.Black)
                    {
                        MaxLineCount = 1,
                        TextAlignment = TextAlignment.Justify,
                        Trimming = TextTrimming.CharacterEllipsis
                    };
                    RadarArray[i].PointValue = p2;
                    if (p2.Y > center.Y && p2.X < center.X)
                        drawingContext.DrawText(formattedText, new Point(p2.X - formattedText.Width - 5, p2.Y - formattedText.Height / 2));
                    else if (p2.Y < center.Y && p2.X > center.X)
                        drawingContext.DrawText(formattedText, new Point(p2.X, p2.Y - formattedText.Height));
                    else if (p2.Y < center.Y && p2.X < center.X)
                        drawingContext.DrawText(formattedText, new Point(p2.X - formattedText.Width - 5, p2.Y - formattedText.Height));
                    else if (p2.Y < center.Y && p2.X == center.X)
                        drawingContext.DrawText(formattedText, new Point(p2.X - formattedText.Width, p2.Y - formattedText.Height));
                    else
                        drawingContext.DrawText(formattedText, new Point(p2.X, p2.Y));
                }
                values.Add(p2);
                g += perangle;
            }
            PointCollection pcollect = new PointCollection(values);
            return pcollect;
        }
    }
}

二、創建RadarChartExample.xaml代碼如下

<UserControl x:Class="WPFDevelopers.Samples.ExampleViews.RadarChartExample"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WPFDevelopers.Samples.ExampleViews"
             xmlns:wpfdev="https://github.com/yanjinhuagood/WPFDevelopers"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid Background="Gainsboro" >
        <Border Background="White" Width="500" Height="500">
            <Grid Margin="20,10">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition Width="40"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="40"/>
                    <RowDefinition/>
                </Grid.RowDefinitions>
                <WrapPanel>
                    <Rectangle Width="6" Height="26" Fill="Black"/>
                    <TextBlock Text="能力圖" FontWeight="Black" FontSize="24" Padding="10,0"/>
                </WrapPanel>
                <wpfdev:RadarChart Grid.Column="0" Grid.Row="1" RadarArray="{Binding RadarModels,RelativeSource={RelativeSource AncestorType=local:RadarChartExample}}"/>
            </Grid>
        </Border>
    </Grid>
</UserControl>

三、創建RadarChartExample.xaml.cs代碼如下

ReadrChartExample.cs 思路如下

1、ValueMax 需要注意最小值0,最大值100。

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;
using WPFDevelopers.Controls;

namespace WPFDevelopers.Samples.ExampleViews
{
    /// <summary>
    /// RadarChartExample.xaml 的交互邏輯
    /// </summary>
    public partial class RadarChartExample : UserControl
    {
        public ObservableCollection<RadarModel> RadarModels
        {
            get { return (ObservableCollection<RadarModel>)GetValue(RadarModelsProperty); }
            set { SetValue(RadarModelsProperty, value); }
        }

        public static readonly DependencyProperty RadarModelsProperty =
            DependencyProperty.Register("RadarModels", typeof(ObservableCollection<RadarModel>), typeof(RadarChartExample), new PropertyMetadata(null));
        List<ObservableCollection<RadarModel>> collectionList = new List<ObservableCollection<RadarModel>>();
        public RadarChartExample()
        {
            InitializeComponent();
            RadarModels = new ObservableCollection<RadarModel>();
            var collection1 = new ObservableCollection<RadarModel>();
            collection1.Add(new RadarModel { Text = "擊殺", ValueMax = 95});
            collection1.Add(new RadarModel { Text = "生存", ValueMax = 80 });
            collection1.Add(new RadarModel { Text = "助攻", ValueMax = 70 });
            collection1.Add(new RadarModel { Text = "物理", ValueMax = 80 });
            collection1.Add(new RadarModel { Text = "魔法", ValueMax = 90 });
            collection1.Add(new RadarModel { Text = "防御", ValueMax = 87 });
            collection1.Add(new RadarModel { Text = "金錢", ValueMax = 59 });

            var collection2 = new ObservableCollection<RadarModel>();
            collection2.Add(new RadarModel { Text = "擊殺", ValueMax = 59 });
            collection2.Add(new RadarModel { Text = "生存", ValueMax = 80 });
            collection2.Add(new RadarModel { Text = "助攻", ValueMax = 90 });
            collection2.Add(new RadarModel { Text = "物理", ValueMax = 70 });
            collection2.Add(new RadarModel { Text = "魔法", ValueMax = 80 });
            collection2.Add(new RadarModel { Text = "防御", ValueMax = 90 });
            collection2.Add(new RadarModel { Text = "金錢", ValueMax = 66 });
            collectionList.AddRange(new[] { collection1, collection2 });
            RadarModels = collectionList[0];
        }
        bool isRefresh = false;
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            if (!isRefresh)
                RadarModels = collectionList[1];
            else
                RadarModels = collectionList[0];
            isRefresh = !isRefresh;
        }
    }
}

效果預覽

WPF如何實現雷達圖

WPF如何實現雷達圖

以上就是“WPF如何實現雷達圖”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

wpf
AI

乐平市| 通榆县| 莫力| 阳曲县| 麦盖提县| 山阳县| 涡阳县| 大石桥市| 行唐县| 蕉岭县| 扬中市| 威远县| 科技| 新安县| 稻城县| 玉屏| 河津市| 宜黄县| 资源县| 信阳市| 潮安县| 孟津县| 宾阳县| 宁明县| 沅江市| 乐安县| 渑池县| 定陶县| 清流县| 寿宁县| 和林格尔县| 霸州市| 威信县| 灵川县| 湖口县| 内丘县| 青海省| 株洲县| 台安县| 安塞县| 凤台县|