wpf ضز mschart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ ٴاؿڂٹٶ ... ·...

22
ن مقاله : عنوارهایده از نموداستفا اMsChart درWPF یه تهویسان مرجع تخصصی برنامه ن وتنظیم کننده :www.barnamenevisan.org [email protected] کنترلی شود که چگونه نمودارن داده مما نشاین مقاله، به ش در افت را در یک مایکروساUserControl کپسوله کنید که با سازیMVVM سازگار کنترلد از این توانیا می باشد. شمWPF های برنامه درWPF الگو تان باMVVM وزی داده مقید سا(data binding) مشابهه البته در یک روشید کستفاده نمای ا داخلیز کنترل های که اWPF کنیدستفاده می ا. مقدمه برای مشخصال نمودار را کنترت مایکروسافتانید شرکانطور که می د همwinform وASP.NET توسعه داد کهندار هستامه ا داد و دارای ه ارائه می به شماده ای راجموعه گستر م بود از جملهزم ایline chart ، pie chart . ... وندد مانش می داز به شما نمای را نیوصیرهای مخص نموداین همچنpyramid ، bubble ، stock وTechnical indicator charts. ی نمودار، ازژگی هامع از ویموعه جا ها و قابلیت ها مجژگیوه بر این وی عنی از جمله پشتیبا سری های م شامل می رارچسب هازی حرفه ای، ب، سفارشی سا ختلف شود. ازستقیما مایکروسافت منه، نمودار متاسفاWPF وMVVM ید که از عنصرا مجبورمی کند. شمبانی ن پشتیWindowsFormsHost ه کنیدستفاد خواهید از آن اقعا می واگر شمافت انترل مایکروسانی از نمودار ک میزبا برای برنامه درWPF یا( د سازیابلیت مقی تان، شما قdata binding) قواعد وMVVM نکته راد. البته این شکنی را میش برای چند سال پیل نمودار را کنترفت یک ابزاره مایکروسا هم بدانید کWPF ل این ابزارین حا اد. با ارائه دا توانید نمیه سازی آن بهیندی هم برایار کند. کار زیات و بسیود اس محدهید نجام د ا. سازگارسازیWPF رل مایکروسافتمودار کنت با ن

Upload: others

Post on 01-Jul-2020

43 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ ٴاؿڂٹٶ ... · WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ

WPFدر MsChartاستفاده از نمودارهای عنوان مقاله :

وتنظیم کننده : مرجع تخصصی برنامه نویسان تهیه

www.barnamenevisan.org [email protected]

کپسوله UserControl مایکروسافت را در یک در این مقاله، به شما نشان داده می شود که چگونه نمودار کنترل

تان با الگو WPF در برنامه های WPF باشد. شما می توانید از این کنترل سازگار MVVM سازی کنید که با

MVVM مقید سازی داده و (data binding) که از کنترل های داخلی استفاده نمایید که البته در یک روش مشابه

WPF استفاده می کنید.

مقدمه

توسعه داد که ASP.NET و winform همانطور که می دانید شرکت مایکروسافت کنترل نمودار را مشخصا برای

و ... . line chart، pie chart ای الزم بود از جملهمجموعه گسترده ای را به شما ارائه می داد و دارای همه استاندار ه

Technical و pyramid، bubble، stock همچنین نمودارهای مخصوصی را نیز به شما نمایش می داد مانند

indicator charts. جمله پشتیبانی از عالوه بر این ویژگی ها و قابلیت ها مجموعه جامع از ویژگی های نمودار، از

.شود ختلف، سفارشی سازی حرفه ای، برچسب ها را شامل میسری های م

پشتیبانی نمی کند. شما مجبورید که از عنصر MVVM و WPF متاسفانه، نمودار مایکروسافت مستقیما از

WindowsFormsHost برای میزبانی از نمودار کنترل مایکروسافت اگر شما واقعا می خواهید از آن استفاده کنید

را می شکنید. البته این نکته را MVVM و قواعد (data binding تان، شما قابلیت مقید سازی )یا WPF در برنامه

ارائه داد. با این حال این ابزار WPF هم بدانید که مایکروسافت یک ابزار کنترل نمودار را چند سال پیش برای

.انجام دهید محدود است و بسیار کند. کار زیادی هم برای بهینه سازی آن نمی توانید

با نمودار کنترل مایکروسافت WPF سازگارسازی

Page 2: WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ ٴاؿڂٹٶ ... · WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ

WPFدر MsChartاستفاده از نمودارهای عنوان مقاله :

وتنظیم کننده : مرجع تخصصی برنامه نویسان تهیه

www.barnamenevisan.org [email protected]

با MsChart به نام WPF در تکنولوژی UserControl در اینجا، یک نمودار کنترل مایکروسافت در داخل یک

.ایجاد می کنیم WindowsFormsHost استفاده از عنصر

<UserControl x:Class="WpfMsChart.MsChart"

"http://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns="

"http://schemas.microsoft.com/winfx/2006/xamlxmlns:x="

"bility/2006compati-http://schemas.openxmlformats.org/markupxmlns:mc="

"http://schemas.microsoft.com/expression/blend/2008xmlns:d=" xmlns:mschart="clr-namespace:System.Windows.Forms.DataVisualization.Charting;assembly=System.Windows.Forms.DataVisualization" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"> <Grid x:Name="grid1" Margin="10"> <WindowsFormsHost Background="{x:Null}"> <mschart:Chart x:Name="myChart"/> </WindowsFormsHost> </Grid> </UserControl>

بسیار ساده است. ابتدا نیاز داریم تا فضای نام و اسمبلی نمودار کنترل مایکروسافت را به فضای نام XAML این کد

XAML اضافه کنیم: System.Windows.Forms.DataVisualization. با استفاده از این فضای نام XML و

myChart می افزاییم و نام آن را WindowsFormsHost ، ما کنترل نمودار را به Ms کالسی به نام کنترل نمودار

.می گذاریم

، ما از کد Mvvm مدل و کند نمی پشتیبانی wpf در data binding از Ms از آنجایی که کنترل اصلی چارت

code-behind برای پیاده سازی این WPF MsChart UserControl استفاده می کنیم. تکه کد زیر پیاده سازی

:است که برای این کنترل استفاده شده است

using System.Windows; using System.Windows.Controls; using System.Windows.Forms.DataVisualization.Charting;

Page 3: WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ ٴاؿڂٹٶ ... · WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ

WPFدر MsChartاستفاده از نمودارهای عنوان مقاله :

وتنظیم کننده : مرجع تخصصی برنامه نویسان تهیه

www.barnamenevisan.org [email protected]

using Caliburn.Micro; using System.Collections.Specialized; namespace WpfMsChart { /// <summary> /// Interaction logic for MsChart.xaml /// </summary> public partial class MsChart : UserControl { public MsChart() { InitializeComponent(); SeriesCollection = new BindableCollection<Series>(); } public static DependencyProperty XValueTypeProperty = DependencyProperty.Register("XValueType", typeof(string), typeof(MsChart), new FrameworkPropertyMetadata("Double", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); public string XValueType { get { return (string)GetValue(XValueTypeProperty); } set { SetValue(XValueTypeProperty, value); } } public static DependencyProperty XLabelProperty = DependencyProperty.Register("XLabel", typeof(string), typeof(MsChart), new FrameworkPropertyMetadata("X Axis", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); ...... public BindableCollection<Series> SeriesCollection { get { return (BindableCollection<Series>)GetValue(SeriesCollectionProperty); } set { SetValue(SeriesCollectionProperty, value); } }

Page 4: WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ ٴاؿڂٹٶ ... · WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ

WPFدر MsChartاستفاده از نمودارهای عنوان مقاله :

وتنظیم کننده : مرجع تخصصی برنامه نویسان تهیه

www.barnamenevisan.org [email protected]

private static void OnSeriesChanged(object sender, DependencyPropertyChangedEventArgs e) { var ms = sender as MsChart; var sc = e.NewValue as BindableCollection<Series>; if (sc != null) sc.CollectionChanged += ms.sc_CollectionChanged; } private void sc_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (SeriesCollection != null) { CheckCount = 0; if (SeriesCollection.Count > 0) CheckCount = SeriesCollection.Count; } } private static DependencyProperty CheckCountProperty = DependencyProperty.Register("CheckCount", typeof(int), typeof(MsChart), new FrameworkPropertyMetadata(0, StartChart)); private int CheckCount { get { return (int)GetValue(CheckCountProperty); } set { SetValue(CheckCountProperty, value); } } private static void StartChart(object sender, DependencyPropertyChangedEventArgs e) { var ms = sender as MsChart; if (ms.CheckCount > 0) { ms.myChart.Visible = true; ms.myChart.Series.Clear(); ms.myChart.Titles.Clear(); ms.myChart.Legends.Clear(); ms.myChart.ChartAreas.Clear(); MSChartHelper.MyChart(ms.myChart, ms.SeriesCollection, ms.Title, ms.XLabel, ms.YLabel, ms.ChartBackground, ms.Y2Label); if (ms.myChart.ChartAreas.Count > 0)

Page 5: WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ ٴاؿڂٹٶ ... · WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ

WPFدر MsChartاستفاده از نمودارهای عنوان مقاله :

وتنظیم کننده : مرجع تخصصی برنامه نویسان تهیه

www.barnamenevisan.org [email protected]

ms.myChart.ChartAreas[0].Area3DStyle.Enable3D = ms.IsArea3D; ms.myChart.DataBind(); } else ms.myChart.Visible = false; } ...... } }

مان استفاده می کنیم. درواقع بصورت معمول برای تبدیل MVVM به عنوان چارچوب Caliburn.Macro اکنون از

کد دارید تا مقداری نمودارهایمان به خواص وابستگی استفاده می کنیم. در بعضی از موقعیت ها قصد خواص کنترل

اینکه مقادیر را برای خواص وابستگی تنظیم کردید. می منطقی اجرا کنید و متد های محاسباتی داشته باشید بعد از

تغییر می کند یا متد wrapper به وسیله یک متد بازگشتی اجرا کنید درست زمانی که خاصیت توانید این عملیات را

SetValue وان مثال، بعد از ساختنصدا زده می شود. به عن SeriesCollection که شامل اشیاء می شود. قطعه کد

ماقبل به شما نشان دادیم که چگونه یک متد بازگشتی پیاده سازی کنید. این خاصیت code-behind در

SeriesCollectionProperty شامل یک متد بازگشتی می شود به نام OnSeriesChanged. در داخل این متد

اضافه کنید و آن آغاز به اجرا کردن می کند درست زمانی CollectionChanged شتی، یک مدیریت رویداد بهبازگ

، یک خاصیت وابستگی دیگری وجود CollectionChanged handler تغییر کند. در داخل SeriesCollection که

باشد، ما متوجه می شویم CheckCount > 0 اگر .SeriesCollection.Count برای CheckCount دارد به نام

StartChart شامل اشیائی است و سپس متد بازگشتی آن را پیاده سازی می کنیم و آن را SeriesCollection که

در MyChart که یک نمودار به وسیله متد پیاده سازی شده به نام CheckCount نام گذاری می کنیم برای خاصیت

هستند به سادگی انواع MSChartHelper هایی که در داخل کالسمی سازد. متد MSChartHelper کالس

.متفاوتی از نمودار های از پیش تعریف شده را دارد، که در ادامه مقاله آن ها را معرفی می کنیم

کنترل نمودارتان متصل کنید. خاصیت DataSource را از طریق خاصیت وابستگی به DataSource شما می توانید

ید اگر داشته باش به شما اجازه می دهد تا به کنترل نمودار مایکروسافت بصورت مستقیم دسترسی Chart1 وابستگی

شده قرار ندارد، آن را در کالس نوع نموداری که می خواهید در میان نمودار های از پیش تعریف

MSChartHelper پیاده سازی کنید.

Helper کالس

Page 6: WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ ٴاؿڂٹٶ ... · WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ

WPFدر MsChartاستفاده از نمودارهای عنوان مقاله :

وتنظیم کننده : مرجع تخصصی برنامه نویسان تهیه

www.barnamenevisan.org [email protected]

ساختیم، که کپسوله شد در کنترل نمودار مایکروسافت )نسخه WPF رد MsChart در بخش قبل، ما یک کنترل

Windiows Form). متد StartChart در کنترل MsChart صدا می زند متد MyChart را در کالس

MSChartHelper. های برنامه تان از شما می توانید همچنین نمودار خودتان را بسازید البته مطابق با نیازمندی

های Style مزیت انجام اینکار این است که شما نیاز نیست انواع .کنترل روند که در اینجا ارائه شده است برنامه ها با

را با کد مرتبطش در یک جا قرار chart-style نمودار را بسازید هر بار که نمودار می خواهید بسازید. قرار دهید

را Chart-Style انید هربار که می خواهید می توانیدداشته باشید. شما می تو Reusable دهید برای اینکه یک قالب

پس زمینه آبی داشته باشند، شما به سادگی به راحتی تغییر دهید. برای مثال اگر شما می خواهید همه نمودار هایتان

.دیتغییر دهید و دیگر نیازی نیست تا هربار برای هر نمودار آن را تغییر ده می توانید آن را در قالبتان یک بار

using System.Collections.Generic; using System.Windows.Forms.DataVisualization.Charting; using System.Drawing; using Caliburn.Micro; namespace WpfMsChart { public static class MSChartHelper { public static void MyChart(Chart chart1, BindableCollection<Series> chartSeries, string chartTitle, string xLabel, string yLabel, ChartBackgroundColor backgroundColor, params string[] y2Label) { if (chart1.ChartAreas.Count < 1) { ChartArea area = new ChartArea();

Page 7: WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ ٴاؿڂٹٶ ... · WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ

WPFدر MsChartاستفاده از نمودارهای عنوان مقاله :

وتنظیم کننده : مرجع تخصصی برنامه نویسان تهیه

www.barnamenevisan.org [email protected]

ChartStyle(chart1, area, backgroundColor); } if (chartTitle != "") chart1.Titles.Add(chartTitle); chart1.ChartAreas[0].AxisX.Title = xLabel; chart1.ChartAreas[0].AxisY.Title = yLabel; if (y2Label.Length > 0) chart1.ChartAreas[0].AxisY2.Title = y2Label[0]; foreach (var ds in chartSeries) chart1.Series.Add(ds); if (chartSeries.Count > 1) { Legend legend = new Legend(); legend.Font = new System.Drawing.Font("Trebuchet MS", 7.0F, FontStyle.Regular); legend.BackColor = Color.Transparent; legend.AutoFitMinFontSize = 5; legend.LegendStyle = LegendStyle.Column; legend.IsDockedInsideChartArea = true;

Page 8: WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ ٴاؿڂٹٶ ... · WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ

WPFدر MsChartاستفاده از نمودارهای عنوان مقاله :

وتنظیم کننده : مرجع تخصصی برنامه نویسان تهیه

www.barnamenevisan.org [email protected]

legend.Docking = Docking.Left; legend.InsideChartArea = chart1.ChartAreas[0].Name; chart1.Legends.Add(legend); } } public static void ChartStyle(Chart chart1, ChartArea area, ChartBackgroundColor backgroundColor) { int r1 = 211; int g1 = 223; int b1 = 240; int r2 = 26; int g2 = 59; int b2 = 105; int r3 = 165; int g3 = 191; int b3 = 228; switch (backgroundColor) { case ChartBackgroundColor.Blue:

Page 9: WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ ٴاؿڂٹٶ ... · WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ

WPFدر MsChartاستفاده از نمودارهای عنوان مقاله :

وتنظیم کننده : مرجع تخصصی برنامه نویسان تهیه

www.barnamenevisan.org [email protected]

chart1.BackColor = Color.FromArgb(r1, g1, b1); chart1.BorderlineColor = Color.FromArgb(r2, g2, b2); area.BackColor = Color.FromArgb(64, r3, g3, b3); break; case ChartBackgroundColor.Green: chart1.BackColor = Color.FromArgb(g1, b1, r1); chart1.BorderlineColor = Color.FromArgb(g2, b2, r2); area.BackColor = Color.FromArgb(64, g3, b3, r3); break; case ChartBackgroundColor.Red: chart1.BackColor = Color.FromArgb(b1, r1, g1); chart1.BorderlineColor = Color.FromArgb(b2, r2, g2); area.BackColor = Color.FromArgb(64, b3, r3, g3); break; case ChartBackgroundColor.White: chart1.BackColor = Color.White; chart1.BorderlineColor = Color.White; area.BackColor = Color.White; break; }

Page 10: WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ ٴاؿڂٹٶ ... · WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ

WPFدر MsChartاستفاده از نمودارهای عنوان مقاله :

وتنظیم کننده : مرجع تخصصی برنامه نویسان تهیه

www.barnamenevisan.org [email protected]

if (backgroundColor != ChartBackgroundColor.White) { chart1.BackSecondaryColor = Color.White; chart1.BackGradientStyle = GradientStyle.TopBottom; chart1.BorderlineDashStyle = ChartDashStyle.Solid; chart1.BorderlineWidth = 2; chart1.BorderSkin.SkinStyle = BorderSkinStyle.Emboss; area.Area3DStyle.IsClustered = true; area.Area3DStyle.Perspective = 10; area.Area3DStyle.IsRightAngleAxes = false; area.Area3DStyle.WallWidth = 0; area.Area3DStyle.Inclination = 15; area.Area3DStyle.Rotation = 10; } area.AxisX.IsLabelAutoFit = false; area.AxisX.LabelStyle.Font = new Font("Trebuchet MS", 7.25F, FontStyle.Regular); //area.AxisX.LabelStyle.IsEndLabelVisible = false; area.AxisX.IntervalAutoMode = IntervalAutoMode.VariableCount; area.AxisX.LineColor = Color.FromArgb(64, 64, 64, 64); area.AxisX.MajorGrid.LineColor = Color.FromArgb(64, 64, 64, 64);

Page 11: WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ ٴاؿڂٹٶ ... · WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ

WPFدر MsChartاستفاده از نمودارهای عنوان مقاله :

وتنظیم کننده : مرجع تخصصی برنامه نویسان تهیه

www.barnamenevisan.org [email protected]

area.AxisX.IsStartedFromZero = false; area.AxisX.RoundAxisValues(); area.AxisY.IsLabelAutoFit = false; area.AxisY.LabelStyle.Font = new Font("Trebuchet MS", 7.25F, System.Drawing.FontStyle.Regular); area.AxisY.LineColor = Color.FromArgb(64, 64, 64, 64); area.AxisY.MajorGrid.LineColor = Color.FromArgb(64, 64, 64, 64); area.AxisY.IsStartedFromZero = false; area.AxisY2.IsLabelAutoFit = false; area.AxisY2.LabelStyle.Font = new Font("Trebuchet MS", 7.25F, System.Drawing.FontStyle.Regular); area.AxisY2.LineColor = Color.FromArgb(64, 64, 64, 64); area.AxisY2.MajorGrid.LineColor = Color.FromArgb(15, 15, 15, 15); area.AxisY2.IsStartedFromZero = false; area.BackSecondaryColor = System.Drawing.Color.White; area.BackGradientStyle = GradientStyle.TopBottom; area.BorderColor = Color.FromArgb(64, 64, 64, 64); area.BorderDashStyle = ChartDashStyle.Solid; area.Position.Auto = false;

Page 12: WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ ٴاؿڂٹٶ ... · WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ

WPFدر MsChartاستفاده از نمودارهای عنوان مقاله :

وتنظیم کننده : مرجع تخصصی برنامه نویسان تهیه

www.barnamenevisan.org [email protected]

area.Position.Height = 82F; area.Position.Width = 88F; area.Position.X = 3F; area.Position.Y = 10F; area.ShadowColor = Color.Transparent; chart1.ChartAreas.Add(area); chart1.Invalidate(); } public static List<System.Drawing.Color> GetColors() { List<Color> my_colors = new List<Color>(); my_colors.Add(Color.DarkBlue); my_colors.Add(Color.DarkRed); my_colors.Add(Color.DarkGreen); my_colors.Add(Color.Black); my_colors.Add(Color.DarkCyan); my_colors.Add(Color.DarkViolet); my_colors.Add(Color.DarkOrange); my_colors.Add(Color.Maroon); my_colors.Add(Color.SaddleBrown);

Page 13: WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ ٴاؿڂٹٶ ... · WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ

WPFدر MsChartاستفاده از نمودارهای عنوان مقاله :

وتنظیم کننده : مرجع تخصصی برنامه نویسان تهیه

www.barnamenevisan.org [email protected]

my_colors.Add(Color.DarkOliveGreen); return my_colors; } } public enum ChartBackgroundColor { Blue = 0, Green = 1, Red = 2, White = 3, } }

:است MSChartHelper کد زیر برای کالس

به y2Label و chart1، chartSeries، chartTitle، xLabel، yLabel، BackgroundColor یک Mychart متد

در myChart مستقیما تخصیص داده می شود به chart1 عنوان آرگومان های ورودی می گیرد. پارامتر

MsChart Control و همه پارامتر های دیگر در خواص وابستگی (dependency property) در کد پشت صحنه

MsChartControl تعریف می شوند. متد MyChart همچنین یک متد دیگر به نام ChartStyle که تعریف می ،

و BackgroundColor، Blue، Green، Red مربوط است به خواصی مانند chart-style کند از انواع متنوع

White با استفاده از ChartBackgroundColorEnum. شما می توانید به راحتی انواع دیگر رنگ های پس زمینه

تعریف شده رنگ از پیش 10خواهید تنظیم کنید. ما همچنین می توانیم بسازیم یک لیست از را همانطور که می

Page 14: WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ ٴاؿڂٹٶ ... · WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ

WPFدر MsChartاستفاده از نمودارهای عنوان مقاله :

وتنظیم کننده : مرجع تخصصی برنامه نویسان تهیه

www.barnamenevisan.org [email protected]

دن رنگ ها در سریال نمودار هایمان استفاده که ما می توانیم از آن ها برای مشخص کر GetColors توسط متد

.نماییم

WPF در MsChart ساخت نمودار ها با استفاده از کنترل

در این قسمت، ما می خواهیم از یک مثال استفاده کنیم تا به شما نشان دهیم چطور ساختن نمودارهای متفاوت با

ل. کدی که در ادامه نوشتیم برایتان یک فایلپیاده سازی می کند در بخش های قب MsChart استفاده از کنترل

XAML است که به نام MainView در اینجا نام گذاری شده است:

<Window x:Class="WpfMsChart.MainView"

"http://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns="

"http://schemas.microsoft.com/winfx/2006/xamlxmlns:x="

"http://schemas.microsoft.com/expression/blend/2008xmlns:d="

"compatibility/2006-http://schemas.openxmlformats.org/markupxmlns:mc=" xmlns:local="clr-namespace:WpfMsChart"

"http://www.caliburnproject.orgxmlns:cal=" mc:Ignorable="d"

Page 15: WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ ٴاؿڂٹٶ ... · WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ

WPFدر MsChartاستفاده از نمودارهای عنوان مقاله :

وتنظیم کننده : مرجع تخصصی برنامه نویسان تهیه

www.barnamenevisan.org [email protected]

Title="MainView" Height="300" Width="500"> <Grid Margin="10"> <Grid.ColumnDefinitions> <ColumnDefinition Width="150"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <StackPanel> <Button x:Name="BarChart" Content="Bar Chart" Width="120" Margin="0 10 0 0"/> <Button x:Name="LineChart" Content="Line Chart" Width="120" Margin="0 10 0 0"/> <Button x:Name="PieChart" Content="Pie Chart" Width="120" Margin="0 10 0 0"/> <Button x:Name="PolarChart" Content="Polar Chart" Width="120" Margin="0 10 0 0"/> </StackPanel> <Grid Grid.Column="1"> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="*"/>

Page 16: WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ ٴاؿڂٹٶ ... · WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ

WPFدر MsChartاستفاده از نمودارهای عنوان مقاله :

وتنظیم کننده : مرجع تخصصی برنامه نویسان تهیه

www.barnamenevisan.org [email protected]

<RowDefinition Height="*"/> </Grid.RowDefinitions> <local:MsChart SeriesCollection="{Binding BarSeriesCollection}" ChartBackground="Blue" Title="Bar Chart"/> <local:MsChart SeriesCollection="{Binding LineSeriesCollection}" ChartBackground="Red" Title="Line Chart" Grid.Column="1"/> <local:MsChart SeriesCollection="{Binding PieSeriesCollection}" ChartBackground="Green" Title="Pie Chart" Grid.Row="1" IsArea3D="True"/> <local:MsChart SeriesCollection="{Binding PolarSeriesCollection}" ChartBackground="White" Title="Polar Chart" XLabel="" YLabel="" Grid.Row="1" Grid.Column="1"/> </Grid> </Grid> </Window>

که می خواهیم اضافه می کنیم ما کنترل را دقیقا همانطور user control ،MsChart با استفاده از فضای نام و کالس

Windows Forms MS chart شامل MsChart ، حتی اگر کنترلXAML و انواع دیگری از شیئ را در فایل

control باشد که میزبانی شده بود در یک WindowsFormsHost. ،شما می توانید مشاهده کنید که در این مثال

در این مورد ما باید .polar charts و including bar، line ،pieما می خواهیم چهار مثال ساده از نمودار ها،

که نگه داری می کند از سریال نمودار ها و باید تعریف شود SeriesCollectionمشخص کنیم یک خاصیت کلید،

.ViewModel در

:قرار گرفته است ViewModel در اینجا چند کد مرتبط با

using System; using Caliburn.Micro;

Page 17: WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ ٴاؿڂٹٶ ... · WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ

WPFدر MsChartاستفاده از نمودارهای عنوان مقاله :

وتنظیم کننده : مرجع تخصصی برنامه نویسان تهیه

www.barnamenevisan.org [email protected]

using System.Windows.Forms.DataVisualization.Charting; namespace WpfMsChart { public class MainViewModel : PropertyChangedBase { public BindableCollection<Series> BarSeriesCollection { get; set; } public BindableCollection<Series> LineSeriesCollection { get; set; } public BindableCollection<Series> PieSeriesCollection { get; set; } public BindableCollection<Series> PolarSeriesCollection { get; set; } public MainViewModel() { BarSeriesCollection = new BindableCollection<Series>(); LineSeriesCollection = new BindableCollection<Series>(); PieSeriesCollection = new BindableCollection<Series>(); PolarSeriesCollection = new BindableCollection<Series>(); } public void BarChart() {

Page 18: WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ ٴاؿڂٹٶ ... · WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ

WPFدر MsChartاستفاده از نمودارهای عنوان مقاله :

وتنظیم کننده : مرجع تخصصی برنامه نویسان تهیه

www.barnamenevisan.org [email protected]

double[] data1 = new double[] { 32, 56, 35, 12, 35, 6, 23 }; double[] data2 = new double[] { 67, 24, 12, 8, 46, 14, 76 }; BarSeriesCollection.Clear(); Series ds = new Series(); ds.ChartType = SeriesChartType.Column; ds["DrawingStyle"] = "Cylinder"; ds.Points.DataBindY(data1); BarSeriesCollection.Add(ds); ds = new Series(); ds.ChartType = SeriesChartType.Column; ds["DrawingStyle"] = "Cylinder"; ds.Points.DataBindY(data2); BarSeriesCollection.Add(ds); } public void LineChart() { LineSeriesCollection.Clear(); Series ds = new Series(); ds.ChartType = SeriesChartType.Line;

Page 19: WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ ٴاؿڂٹٶ ... · WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ

WPFدر MsChartاستفاده از نمودارهای عنوان مقاله :

وتنظیم کننده : مرجع تخصصی برنامه نویسان تهیه

www.barnamenevisan.org [email protected]

ds.BorderDashStyle = ChartDashStyle.Solid; ds.MarkerStyle = MarkerStyle.Diamond; ds.MarkerSize = 8; ds.BorderWidth = 2; ds.Name = "Sine"; for (int i = 0; i < 70; i++) { double x = i / 5.0; double y = 1.1 * Math.Sin(x); ds.Points.AddXY(x, y); } LineSeriesCollection.Add(ds); ds = new Series(); ds.ChartType = SeriesChartType.Line; ds.BorderDashStyle = ChartDashStyle.Dash; ds.MarkerStyle = MarkerStyle.Circle; ds.MarkerSize = 8; ds.BorderWidth = 2; ds.Name = "Cosine"; for (int i = 0; i < 70; i++)

Page 20: WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ ٴاؿڂٹٶ ... · WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ

WPFدر MsChartاستفاده از نمودارهای عنوان مقاله :

وتنظیم کننده : مرجع تخصصی برنامه نویسان تهیه

www.barnamenevisan.org [email protected]

{ double x = i / 5.0; double y = 1.1 * Math.Cos(x); ds.Points.AddXY(x, y); } LineSeriesCollection.Add(ds); } public void PieChart() { PieSeriesCollection.Clear(); Random random = new Random(); Series ds = new Series(); for (int i = 0; i < 5; i++) ds.Points.AddY(random.Next(10, 50)); ds.ChartType = SeriesChartType.Pie; ds["PointWidth"] = "0.5"; ds.IsValueShownAsLabel = true; ds["BarLabelStyle"] = "Center"; ds["DrawingStyle"] = "Cylinder"; PieSeriesCollection.Add(ds); }

Page 21: WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ ٴاؿڂٹٶ ... · WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ

WPFدر MsChartاستفاده از نمودارهای عنوان مقاله :

وتنظیم کننده : مرجع تخصصی برنامه نویسان تهیه

www.barnamenevisan.org [email protected]

public void PolarChart() { PolarSeriesCollection.Clear(); Series ds = new Series(); ds.ChartType = SeriesChartType.Polar; ds.BorderWidth = 2; for (int i = 0; i < 360; i++) { double x = 1.0 * i; double y = 0.001 + Math.Abs(Math.Sin(2.0 * x * Math.PI / 180.0) * Math.Cos(2.0 * x * Math.PI / 180.0)); ds.Points.AddXY(x, y); } PolarSeriesCollection.Add(ds); } } }

polar و bar، line، pie و چهار متد تعریف کردیم. که استفاده شده اند در Series Collection در اینجا ما چهار

charts. اگر شما حتی استفاده می کردید از کنترل MSChart در Windows Forms Applications قبل از این

را در داخل هر متد ساختیم و اضافه کردیم اشیاء Series شما باید آشنا شوید با قطعه کد داخل هر متد. ما اشیاء

Page 22: WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ ٴاؿڂٹٶ ... · WPF ضز MsChart ڀاټضازٹٳٶ ظا ٺزاٟتؾا : ٻٮا٣ٲ ٴاٹٷٖ

WPFدر MsChartاستفاده از نمودارهای عنوان مقاله :

وتنظیم کننده : مرجع تخصصی برنامه نویسان تهیه

www.barnamenevisan.org [email protected]

series را به series collection های متناظر که داده در مقید شده است برای کنترل MsChart که در view

با استفاده از WPF را به داخل برنامه MSChart اضافه کنیمتعریف شده است. با کمک این روش، ما می توانیم

.MVVM الگوی

نتیجه گیری

استفاده کنید. همچنین MVVM و WPF در یک برنامه MS Chart Control در این مقاله آموختید که چگونه از

.چگونگی گسترش و توسعه این نمودار ها را هم به شما آموزش دادیم