41
ن مقاله : عنواد نمودار خطی دریجا اWPF وتنظیم کننده :یه تهویسان مرجع تخصصی برنامه نwww.barnamenevisan.org [email protected] د نمودار خطی دریجا و مرحله به مرحله برای ا آموزش کاملین مقاله یک اWPF شان می نینهد، همچن را ارائه می د دیگرشن هایه در اپلیکییل کرد ک تبدنت کامپون توان آن را به یک که چگونه می دهیمWPF الگوی باMVVM نیز باشدده مجدستفادبل ا قا. WPF می کند،ا فراهمکی واحد رک پلت فرم گرافی ی که به شماجازه ا میهد د به راحتی انواع رابط هایبری کار(user interface) یم به می خواهینجا. در ا کنیدیجاد نت خود ا را در اپلیکیشن داتکیء گرافیشیا و ات مرحله به مرحله صور)نتکامپون(یجاد کنترل ا نمودار خطی درWPF وزش دهیم را آم. زم است این کنترل نمودار نیز رفتاری شبیهلمان ا های ساخته شده درWPF عنیشد: این یشته با دا بتواند درXAML وده؛ محدیجاد شود ا داده ها برایProperty ها درViewModel وMVVM تعریف سازگار الگوی شده باشد؛ سازگار باMVVM باشد. درینجا ا می خواهیم با توضیحیستم سصاتی مخت یک نمودار دو بعدی که درWPF ر خطی ساده در یک نموداه می توانیم که چگونشان دهیم. و بعد نه شده شروع کنستفاد ام ها ساخت،یست این س در نهل نمودار خطی کنتر توان یک که چگونه می دهیمشان می ایت نیجاد ا کرد و چ گونه می توان این کنترل نمودار را در اپلیکیشنWPF الگوی باMVVM د کرده مجدستفاد ا.

WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

را ارائه می دهد، همچنین نشان می WPF این مقاله یک آموزش کامل و مرحله به مرحله برای ایجاد نمودار خطی در

نیز MVVM با الگوی WPF دهیم که چگونه می توان آن را به یک کامپوننت تبدیل کرد که در اپلیکیشن های دیگر

.قابل استفاده مجدد باشد

WPF ،های رابط انواع راحتی به دهد می اجازه شما به که یک پلت فرم گرافیکی واحد را فراهم می کند

و اشیاء گرافیکی را در اپلیکیشن دات نت خود ایجاد کنید. در اینجا می خواهیم به (user interface)کاربری

.را آموزش دهیم WPF در خطی نمودار ایجاد کنترل)کامپوننت(صورت مرحله به مرحله

بتواند داشته باشد: این یعنیWPF در شده ساخته های المان شبیه رفتاری نیز نمودار کنترل این الزم است

سازگار تعریف MVVM و ViewModel ها در Property برای ها داده ایجاد شود؛ محدوده XAML در

دو نمودار یک مختصاتی سیستم توضیح با خواهیم می اینجا در باشد. MVVM شده باشد؛ سازگار با الگوی

استفاده شده شروع کنیم. و بعد نشان دهیم که چگونه می توان یک نمودار خطی ساده در WPF در که بعدی

گونهچ و کرد ایجاد ایت نشان می دهیم که چگونه می توان یک کنترل نمودار خطینه در این سیستم ها ساخت،

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

Page 2: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

سیستم مختصاتی نمودارهای دو بعدی

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

دنیای در کیگرافی اشیاء واحد از مستقل باید این اپلیکیشن همانطور که در اکثر اپلیکیشن های نمودار انجام شده،

این سیستم مختصاتی سفارشی را نشان می 1آن باید از پایین به باال اشاره کند، . شکل Y محور و باشد واقعی

:دهد

که در دنیای واقعی در یک ناحیه ارائه شده است X-Y مختصات سیستم همان ما کنید می همانطور که مشاهده

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

ایجاد کنید. هر متد اندازه داده مورد نیاز نسبت ArrangeOverride و MeasureOverride نویسی متدهای

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

Page 3: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

سفارشی می باشد. ولی ما به جای ایجاد یک کنترل پنل سفارشی در اینجا می خواهیم این سیستم مختصاتی را با

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

.سیستم مختصاتی نمودار دو بعدی سفارشی ساخت توان می چگونه دهد می نشان که کنیم می

نمودارهای خطی ساده

از دو مقدار برای نمایش هر نقطه داده استفاده می کند. این نوع از نمودار برای توضیح روابط X-Y نمودار خطی

ع ر جوامبین داده ها بسیار مفید است و اغلب در تجزیه و تحلیل های آماری داده ها در اپلیکیشن های بزرگ د

.علمی، ریاضیات، مهندسی و امور مالی و همچنین در زندگی روزمره مورد استفاده قرار می گیرد

Visual Studio 2013 ، پروژه یک را باز کرده WPF را آن نام و کنید ایجاد جدید WpfChart .قرار دهید

وارد جزئیات چگونه استفاده استفاده خواهیم کرد ولی MVVM به عنوان فریم ورک Caliburn.Micro ما از

قرار دهید. SimpleChartView به پروژه اضافه کنید و نام آن را UserControl نمی شویم. یک آن کردن از

:نوشته شده و برای ایجاد یک نموار خطی می باشد XAML قطعه کد زیر در

<Grid ClipToBounds="True" cal:Message.Attach="[Event SizeChanged]=

[Action AddChart($this.ActualWidth, $this.ActualHeight)];

[Event Loaded]=[Action AddChart($this.ActualWidth, $this.ActualHeight)]">

<Polyline Points="{Binding SolidLinePoints}" Stroke="Black" StrokeThickness="2"/>

<Polyline Points="{Binding DashLinePoints}" Stroke="Black"

StrokeThickness="2" StrokeDashArray="4,3"/>

</Grid>

محدود شده است و به PointCollection اضافه می کنیم که به دو شیئ Grid به Polylines در اینجا ما دو

ممکن است متوجه شده باشید که ما از می باشند. DashLinePoints و SolidLinePoints ترتیب

به متدهای تعریف شده در View در UI برای اتصال رویدادهای Caliburn.Microمکانیسم

ViewModel استفاده کرده ایم. در اینجا ما از Property با نام Message.Attach برای اتصال به

داشته ViewModel را در AddChart تا متداستفاده کرده ایم Grid’s Loaded و SizeChangedرویدادهای

Page 4: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

ارسال کنیم. این اکشن AddChart را به متد ActualWidth و ActualHeigh های Property باشیم و

رسیمت و ها نقطه از ای مجموعه شدن ایجاد دوبار در آن نتیجه و کند می را کنترل Grid بارگذاری یا تغییر اندازه

.داده می شودمجدد نمودار در صفحه نشان

قرار دهید. کد زیر برای این SimpleChartViewModel یک کالس جدید به پروژه اضافه کرده و نام آن را

:کالس در نظر گرفته می شود

using System;

using Caliburn.Micro;

using System.Collections.ObjectModel;

using System.ComponentModel.Composition;

using System.Collections.Generic;

using System.Windows;

using System.Windows.Media;

using System.Windows.Controls;

namespace WpfChart

{

[Export(typeof(IScreen)), PartCreationPolicy(CreationPolicy.NonShared)]

public class SimpleChartViewModel : Screen

{

[ImportingConstructor]

public SimpleChartViewModel()

{

DisplayName = "01. Simple Line";

}

Page 5: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

private double chartWidth = 300;

private double chartHeight = 300;

private double xmin = 0;

private double xmax = 6.5;

private double ymin = -1.1;

private double ymax = 1.1;

private PointCollection solidLinePoints;

public PointCollection SolidLinePoints

{

get { return solidLinePoints; }

set

{

solidLinePoints = value;

NotifyOfPropertyChange(() => SolidLinePoints);

}

}

private PointCollection dashLinePoints;

public PointCollection DashLinePoints

{

get { return dashLinePoints; }

set

Page 6: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

{

dashLinePoints = value;

NotifyOfPropertyChange(() => DashLinePoints);

}

}

public void AddChart(double width, double height)

{

chartWidth = width;

chartHeight = height;

SolidLinePoints = new PointCollection();

DashLinePoints = new PointCollection();

double x = 0;

double y = 0;

double z = 0;

for (int i = 0; i < 70; i++)

{

x = i / 5.0;

y = Math.Sin(x);

z = Math.Cos(x);

DashLinePoints.Add(NormalizePoint(new Point(x, z)));

SolidLinePoints.Add(NormalizePoint(new Point(x, y)));

}

Page 7: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

}

public Point NormalizePoint(Point pt)

{

var res = new Point();

res.X = (pt.X - xmin) * chartWidth / (xmax - xmin);

res.Y = chartHeight - (pt.Y - ymin) * chartHeight / (ymax - ymin);

return res;

}

}

}

Chart Style نمودار خطی با

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

.ایجاد کرد ViewModel و View استاندارد و با یک جدایی کامل بین MVVM الگوی

)شیئ گرا( بیشتر و گسترش ساده آن برای اضافه object-oriented به همین منظور برای برنامه نمودار به شکل

می باشند. LineSeries و ChartStyle کردن ویژگی های جدید، باید دو کالس جدید ایجاد کنیم: که

و غیره را دارد. dashداده ها و استایل های خطی شامل رنگ خط، ضخامت، LineSeries کالس

عالئم و نشانه ، عنوان )خطوط راهنما(، gridlines شامل layout با تمام اطالعات مرتبط ChartStyle کالس

کنترل تعدادی داینامیک صورت به که داریم نیاز منظور همین به و برچسب ها را برای محورها را دارد. ها

می خواهیم ViewModelسخت است. بنابراین ما یک XAML ایجاد کنیم اما ایجاد این کنترلها در View روی

را به صورت داینامیک کنترل کند. این ممکن است View بوده و View که قادر به دستیابی به

های اپلیکیشن توان می هم هنوز روش این با که دهیم می نشان را نقض کند ولی ما در ادامه MVVM قوانین

.های نمودار ایجاد کرد user control سازگار در زمان تبدیل نمودار به MVVMرنمودا

Page 8: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

LineSeries کالس

قرار دهید.یک کالس جدید به ChartModel یک پوشه جدید به پروژه اضافه کرده و نام آن را

:قرار دهید. کد زیر مربوط به این کالس است LineSeriesرااضافه کرده و نام آن ChartModel فولدر

using System;

using System.Windows.Media;

using System.Windows.Shapes;

using Caliburn.Micro;

using System.Windows;

namespace WpfChart.ChartModel

{

public class LineSeries : PropertyChangedBase

{

public LineSeries()

{

LinePoints = new BindableCollection<Point>();

}

public BindableCollection<Point> LinePoints { get; set; }

private Brush lineColor = Brushes.Black;

public Brush LineColor

{

get { return lineColor; }

set { lineColor = value; }

Page 9: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

}

private double lineThickness = 1;

public double LineThickness

{

get { return lineThickness; }

set { lineThickness = value; }

}

public LinePatternEnum LinePattern { get; set; }

private string seriesName = "Default";

public string SeriesName

{

get { return seriesName; }

set { seriesName = value; }

}

private DoubleCollection lineDashPattern;

public DoubleCollection LineDashPattern

{

get { return lineDashPattern; }

set

{

lineDashPattern = value;

NotifyOfPropertyChange(() => LineDashPattern);

Page 10: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

}

}

public void SetLinePattern()

{

switch (LinePattern)

{

case LinePatternEnum.Dash:

LineDashPattern = new DoubleCollection() { 4, 3 };

break;

case LinePatternEnum.Dot:

LineDashPattern = new DoubleCollection() { 1, 2 };

break;

case LinePatternEnum.DashDot:

LineDashPattern = new DoubleCollection() { 4, 2, 1, 2 };

break;

}

}

}

public enum LinePatternEnum

{

Solid = 1,

Dash = 2,

Dot = 3,

Page 11: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

DashDot = 4,

}

}

برای LinePoints یک که کند می ایجاد )مجموعه نقطه( point collection شیئاین کالس یک

LineSeries ندک می تعریف خطی شیئ برای معین شده نامیده می شود. سپس این کالس یک استایل خطی

زمان ایجاد SeriesName خصوصیت. باشد می سری نام و خط الگوی ضخامت، ، خط رنگ شامل که

با enumeration نمودار مورد استفاده قرار می گیرد. الگوی خط توسط یکبرای legend یک

، Solid، Dash شامل الگوی خطی تعریف شده است که 4تعریف می شود که LinePatternEnumنام

.می باشد DashDot و Dot و

ایجاد الگوی خطی از طریق ایجاد می کنیم. در اینجا نیازی به SetLinePattern ما یک الگوی خطی از طریق متد

هم نیست زیرا این تنظیمات به طور پیش solid نیست. نیازی به ایجاد الگوی خطی SetLinePattern متد

را با استفاده از dottedیا dashed وجود دارند. همچنین الگوی خطی Polyline فرض در شیئ

.ایجاد می کنیم Polyline در StrokeDashArray خصوصیت

ChartStyle کالس

اضافه می کنیم. کد زیر مربوط به این کالس ChartModel به فولدر ChartStyle یک کالس جدید دیگر با نام

:است

using Caliburn.Micro;

using System;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Media;

using System.Windows.Shapes;

Page 12: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

namespace WpfChart.ChartModel

{

public class ChartStyle

{

private double xmin = 0;

private double xmax = 6.5;

private double ymin = -1.1;

private double ymax = 1.1;

private string title = "Title";

private string xLabel = "X Axis";

private string yLabel = "Y Axis";

private bool isXGrid = true;

private bool isYGrid = true;

private Brush gridlineColor = Brushes.LightGray;

private double xTick = 1;

private double yTick = 0.5;

private LinePatternEnum gridlinePattern;

private double leftOffset = 20;

private double bottomOffset = 15;

private double rightOffset = 10;

private Line gridline = new Line();

public Canvas TextCanvas { get; set; }

public Canvas ChartCanvas { get; set; }

public double Xmin

Page 13: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

{

get { return xmin; }

set { xmin = value; }

}

... ...

... ...

public void AddChartStyle(TextBlock tbTitle, TextBlock tbXLabel, TextBlock tbYLabel)

{

Point pt = new Point();

Line tick = new Line();

double offset = 0;

double dx, dy;

TextBlock tb = new TextBlock();

// determine right offset:

tb.Text = Xmax.ToString();

tb.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));

Size size = tb.DesiredSize;

rightOffset = 5;

// Determine left offset:

Page 14: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

for (dy = Ymin; dy <= Ymax; dy += YTick)

{

pt = NormalizePoint(new Point(Xmin, dy));

tb = new TextBlock();

tb.Text = dy.ToString();

tb.TextAlignment = TextAlignment.Right;

tb.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));

size = tb.DesiredSize;

if (offset < size.Width)

offset = size.Width;

}

leftOffset = offset + 5;

Canvas.SetLeft(ChartCanvas, leftOffset);

Canvas.SetBottom(ChartCanvas, bottomOffset);

ChartCanvas.Width = Math.Abs(TextCanvas.Width - leftOffset - rightOffset);

ChartCanvas.Height = Math.Abs(TextCanvas.Height - bottomOffset - size.Height / 2);

... ...

... ...

}

public Point NormalizePoint(Point pt)

{

if (Double.IsNaN(ChartCanvas.Width) || ChartCanvas.Width <= 0)

ChartCanvas.Width = 270;

Page 15: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

if (Double.IsNaN(ChartCanvas.Height) || ChartCanvas.Height <= 0)

ChartCanvas.Height = 250;

Point result = new Point();

result.X = (pt.X - Xmin) * ChartCanvas.Width / (Xmax - Xmin);

result.Y = ChartCanvas.Height - (pt.Y - Ymin) * ChartCanvas.Height / (Ymax - Ymin);

return result;

}

public void SetLines(BindableCollection<LineSeries> dc)

{

if (dc.Count <= 0)

return;

int i = 0;

foreach (var ds in dc)

{

PointCollection pts = new PointCollection();

if (ds.SeriesName == "Default")

ds.SeriesName = "LineSeries" + i.ToString();

ds.SetLinePattern();

for (int j = 0; j < ds.LinePoints.Count; j++)

{

var pt = NormalizePoint(ds.LinePoints[j]);

pts.Add(pt);

Page 16: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

}

Polyline line = new Polyline();

line.Points = pts;

line.Stroke = ds.LineColor;

line.StrokeThickness = ds.LineThickness;

line.StrokeDashArray = ds.LineDashPattern;

ChartCanvas.Children.Add(line);

i++;

}

}

}

}

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

را به عنوان خصوصیت عمومی ,Canvas control, ChartCanvas ضمیمه شده ببینید. توجه داشته باشید که ما

.تعریف کرده ایم

ظاهر شود. همانطور ViewModel در مدل یا Canvas اجازه نمی دهد که کنترل MVVM معموال فریم ورک

.ستا داینامیک صورت به کنترلها کردن اضافه قبال توضیح داده شد، هدف ما از انجام این کار ایجاد امکان که

نمودار و و ظاهر آن استفاده (layout)در اینجا ما فیلدهای عضو بیشتری اضافه می کنیم که برای دستکاری طرح

را درک کنید. توجه (name)از این نام Property می کنیم. شما می توانید به راحتی می توانید معنای هر فیلد و

برای TextCanvas دیگری اضافه می کنیم.که TextCanvas و Canvas داشته باشید که ما خصوصیت

نمودار خود را ChartCanvas که حالی در شود، می استفاده )برچسب نشانه ها( tick mark labels نگهداری

.نگه میدارد

Page 17: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

)خطوط راهنما( درنمودار استفاده می gridlines زیر را برای تعریف (member)های عضوعالوه بر این ما فیلد

:کنیم

private bool isXGrid = true;

private bool isYGrid = true;

private Brush gridlineColor = Brushes.LightGray;

private LinePatternEnum gridlinePattern;

ها ایجاد می کند. gridline های مربوط به آنها انعطاف بیشتری در ظاهر Property این فیلدها و

انتخاب کنید که dash به شما اجازه می دهد استایل های متنوعی برای GridlinePattern خصوصیت

ها را با استفاده از gridline می باشد. شما می توانید رنگ dash-dot و solid، dash، dot شامل

IsYGrid و IsXGrid به صورت bool تغییر دهید. عالوه بر این ما دو خصوصیت GridlineColor خصوصیت

.افقی یا عمودی را فعال یا غیر فعال کنید gridlines تعریف می کنیم که به شما اجازه می دهد

Chart Style ایجاد نمودارهای خطی با

برای ایجاد یک نمودار خطی با خطوط باال ChartStyle و LineSeries حاال می توانیم از دو کالس

استفاده (tick marks) و عالئم تیک (title)، عنوان(axis labels)، برچسب های محورها(gridlines)راهنما

قرار دهید. در اینجا کد مربوط ChartView جدید به پروژه اضافه کرده و نام آن را UserControl کنیم. یک

:نشان داده شده است View برای XAML به این قطعه کد در

Page 18: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

<Grid Margin="10">

<Grid.ColumnDefinitions>

<ColumnDefinition Width="Auto"/>

<ColumnDefinition Width="*"/>

</Grid.ColumnDefinitions>

در سلولهای مختلف از از Y و X محورهای برای را ها برچسب و ایم داده قرار در اینجا، یک عنوان

می chartCanvas و textCanvas در نظر گرفته ایم و دو کنترل بومی نیز تعریف کرده ایم: که Grid کنترل

ه بندی مجدد می باشد زیرا که خصوصیات عرض و انداز قابلیت یک کنترل بومی برای textCanvas .باشند

از ما محدود شده است. chartGrid’s ActualWidth و ActualHeight ارتفاع آن به خصوصیات

برای نگهداری برچسب های عالمت تیک مدیریت می کند؛ chartCanvas به عنوان والد textCanvasلکنتر

.نمودار خود را مدیریت می کند chartCanvas کنترل

دهیم که کد آن به صورت زیر قرار می ChartViewModel یک کالس جدید به پروژه اضافه کرده و نام آن را

:است

using System;

using Caliburn.Micro;

using System.Collections.ObjectModel;

using System.ComponentModel.Composition;

using System.Windows.Documents;

using System.Collections.Generic;

using System.Windows;

using System.Windows.Media;

using System.Windows.Controls;

using WpfChart.ChartModel;

Page 19: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

namespace WpfChart

{

[Export(typeof(IScreen)), PartCreationPolicy(CreationPolicy.NonShared)]

public class ChartViewModel :Screen

{

[ImportingConstructor]

public ChartViewModel()

{

DisplayName = "02. Chart";

}

private ChartView view;

private ChartStyle cs;

private void SetChartStyle()

{

view = this.GetView() as ChartView;

view.chartCanvas.Children.Clear();

view.textCanvas.Children.RemoveRange(1, view.textCanvas.Children.Count - 1);

cs = new ChartStyle();

cs.ChartCanvas = view.chartCanvas;

cs.TextCanvas = view.textCanvas;

cs.Title = "Sine and Cosine Chart";

cs.Xmin = 0;

cs.Xmax = 7;

Page 20: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

cs.Ymin = -1.5;

cs.Ymax = 1.5;

cs.YTick = 0.5;

cs.GridlinePattern = LinePatternEnum.Dot;

cs.GridlineColor = Brushes.Green;

cs.AddChartStyle(view.tbTitle, view.tbXLabel, view.tbYLabel);

}

public void AddChart()

{

SetChartStyle();

BindableCollection<LineSeries> dc = new BindableCollection<LineSeries>();

var ds = new LineSeries();

ds.LineColor = Brushes.Blue;

ds.LineThickness = 2;

ds.LinePattern = LinePatternEnum.Solid;

for (int i = 0; i < 50; i++)

{

double x = i / 5.0;

double y = Math.Sin(x);

ds.LinePoints.Add(new Point(x, y));

}

dc.Add(ds);

Page 21: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

ds = new LineSeries();

ds.LineColor = Brushes.Red;

ds.LineThickness = 2;

ds.LinePattern = LinePatternEnum.Dash;

ds.SetLinePattern();

for (int i = 0; i < 50; i++)

{

double x = i / 5.0;

double y = Math.Cos(x);

ds.LinePoints.Add(new Point(x, y));

}

dc.Add(ds);

cs.SetLines(dc);

}

}

}

دسترسی داریم داشته View به View model طریق از توجه ویژه ای نسبت به اینکه چگونه

کند که به ما اجازه می دهد به راحتی را ارائه می GetView یک متد با نام Caliburn.Micro .باشید

نیاز به دسترسی به کنترل ChartStyle دسترسی داشته باشیم. همانطور که قبال بحث شد، کالس View به

ایجاد شده است. بنابراین در View دارد که در chartCanvas و textCanvas های

:داریمبا استفاده از کد زیر دسترسی View به SetChartStyle متد

view = this.GetView() as ChartView;

view.chartCanvas.Children.Clear();

Page 22: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

view.textCanvas.Children.RemoveRange(1, view.textCanvas.Children.Count - 1);

cs = new ChartStyle();

cs.ChartCanvas = view.chartCanvas;

cs.TextCanvas = view.textCanvas;

پنجره که زمانی در چارت دوباره ترسیم منظور به می گیریم. GetView را از متد View شیئابتدا

chartCanvas را فراخوانی کنیم.اما textCanvas فرزند های المان تمام باید شده است، resize اپلیکیشن

تبدس باال کد در شده( شده پررنگ)بولد کد توسط را پاک می کند که chartCanvas تمام کنترل های فرزند

خود را ChartCanvas و TextCanvas های Property ایجاد کرده و ChartStyle شیئ یک سپس. آید می

.مربوطه تنظیم می کنیم View برای کنترل های

ها title ، tick mark ها، gridline که را فراخوانی می کنیم SetChartStyle متد ابتدا ، AddChart در متد

برچسب های محورها را تنظیم می کند. بقیه کد شبیه به کدی است در مثال قبلی استفاده کردیم. شکل زیر و

، خطوط title، labels نتایج اجرای این اپلیکیشن را نشان می دهد. شما می توانید مشاهده کنید که نمودار امکانات

.ایجاد کرده اید WPF ودار خطی درراهنما، عالئم و تیک را دارد. تا اینجا شما با موفقیت یک نم

Page 23: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

کنترل های نمودار خطی

سازی پیاده داشت وجود مستقیم طور به ما نمودار برنامه در که هایی کالس همه در بخش های قبلی، ما کد

برنامه ردیگ برای را کد همین بخواهید اگر اما. کند می کار خوبی به روش این ساده اپلیکیشن یک برای. کردیم

userابزار قدرتمند، wpf ورک دات نت و فریم. است فایده بی و اثر بی روش این کنید استفاده نت دات های

control را برای حل این مشکل ارائه داده است. user control های سفارشی در WPF فقط شبیه دکمه های

.بوندو دات نت فراهم شده WPF هایی هستند که از قبل با text box ساده یا

متعدد یا کدهای (windows)به طور معمول کنترل ها یا کامپوننت هایی که طراحی می کنید در پنجره های

برای های سفارشی شده می تواند مقداری از کد را که باید user controlماژوالر مورد استفاده قرار می گیرد. این

ودتانخ اپلیکشن در کد کردن کپی برای دلیلی هیچ. دهد می کاهش کنید، ایجاد برنامه در سازی پیاده تغییر

ینا بنابراین ها را از دست می دهید. و متوجه اشتباهاتتان در کدنویسی نمی شوید، bug کار این با که چرا نیست

در کدهای منبع کنترل user control ر یک تمرین برنامه نویسی خوب جهت ایجاد قابلیت های خاص برایکا

.می تواند کپی کردن کد را کاهش داده و کد را ماژوالر کندها می باشد که

سفارشی user control در این بخش می خواهیم به شما نشان دهیم که چگونه می توان نمودارهای خطی را در

استفاده کرد. ما تالش MVVM خود با استایل WPF اپلیکیشن در را کنترل یک قرار دهیم و چگونه می توان

در دسترس XAML ایجاد کرده و آن را برایWPF مربوط به first-class که کنترل نمودار را درخواهیم کرد

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

ضروری WPF های سرویس از پشتیبانی گرفتن منظور به را ، استایل ها، و انیمیشنdata binding مانند نمودار

.تعریف کنیم

. است آسان ایم، نوشته را آنها قبل این برای ایجاد یک کنترل نمودار خطی بر اساس نمودارهای خطی که ما از

نمودار بسیار شبیه مدل استفاده شده برای اپلیکیشن توسعه یافته user control برای یافته توسعه مدل

.است WPF در

را انتخاب کنید. شما می Add | New Project راست کلیک کرده و user control ا نامب Solution بر روی

ها انتخاب کرده و نام آن template جدید از WPF برای user control توانید یک کتابخانه

ایجاد XAML یک فایل Visual Studio 2013 قرار دهید. زمانی که این کار را انجام دهید، ChartControl را

Page 24: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

کرده و یک کالس سفارشی مربوط برای مدیریت مقداردهی اولیه و مدیریت رویدادهای کد ایجاد می کند.این

در UserControl1.xaml ایجاد می کند. بر روی UserControl1 پیش فرض با نام user control کار یک

solution explorerراست کلیک کرده و Rename را بهرا انتخاب کرده و نام آن LineChart .تغییر دهید

برای این کنترل تغییر code behind در هر دو فایلLineChart را به UserControl1 همچنین شما باید نام

قرار دهید . دو کالس موجود از فولدر ChartModel را آن نام و کرده اضافه دهید. یک فولدر جدید در کنترل

ChartModel از پروژه ChartModel از پروژه جاری را اضافه کرده و فضای نام آن را به

ChartControl برای تمام کالس ها در فولدر ChartModel از فولدر جاری تغییر دهید. برای جلوگیری از

:تغییر دهید ChartStyleControl وLineSeriesControl سردرگمی، باید نام های این دو کالس را به

<UserControl x:Class="ChartControl.LineChart"

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"

mc:Ignorable="d"

d:DesignHeight="300" d:DesignWidth="300">

<Grid Margin="10">

<Grid.ColumnDefinitions>

<ColumnDefinition Width="Auto"/>

<ColumnDefinition Width="*"/>

</Grid.ColumnDefinitions>

Page 25: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

استفاده برای پیاده سازی کنترل نمودار code-behind شما ممکن است توجه کرده باشید که ما داریم از کد

برای مدیریت رویدادهایی Caliburn.Micro به مربوط Message.Attach متد از ما می کنیم به خاطر اینکه

داریم. user control استفاده نمی کنیم. در واقع ما دو گزینه برای ایجاد یک کتابخانه SizeChanged مانند

وانیمت می ری مورد استفاده قرار گرفته باشد،اگر کنترل نموداری که طراحی کرده ایم تنها در اپلیکیشن جا

های جداگانه View model ایجاد کنیم. در این مورد ما باید MVVM با استفاده از روش user control یک

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

را در این کنترل از طریق View modelیها کنترل و داشت خواهد کنترل را در آنوالد این View بنابراین

ParentVM.UserControlVM متصل خواهد کرد و UserControlVM و user control ما از دیگر اتصاالت

.مراقبت خواهند کرد

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

بر اساس خواص وابستگی ایجاد کرد. control template خود را با استفاده از پیاده سازی user control باید

-code یا خواص وابستگی MVVM از ایم گرفته تصمیم در اینجا باید به یک نکته مهم اشاره کنیم که

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

.ما نیست user control کنندگان

در اینجا می خواهیم نشان دهیم که چگونه می توان یک کنترل نمودار بر اساس خواص

ایجاد کنیم. این خواص code-behind پیاده سازی شده در کد (dependency properties)وابستگی

است ارائه می WPF ه برای اتصال داده ها در زمانی که شیئ منبع المانی ازوابستگی یک روش ساد

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

صله به روز در شیئ مورد نظر را بالفا Property یافته دارد. به عنوان یک نتیجه تغییر مقدار خواص وابستگی ،

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

.INotifyPropertyChanged رفیساینت یک مانند میافتد، اتفاق

تعریف ویژگی های وابستگی

کنترل نمودار خطی را در معرض پیاده سازی می کنیم که (public interface)در ادامه ما یک رابط عمومی

ها، متدها و رویدادهایی که مصرف Property جهان بیرون قرار می دهد. به عبارت دیگر زمان آن است که

.کنیم ایجاد را دارد احتیاج کننده کامپوننت نمودار ما

Page 26: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

قرار خارج جهان معرض در را ChartStyleControl کالس در ها Property بیشتر بخواهیم ممکن است

امکان صورت در کنیم می تالش زمان همان در. ها برچسب و عنوان محورها، محدودیت مثال عنوان به دهیم

.کنیم ایجاد اصلی خطی نمودار پروژه در کوچکی تغییرات

اضافه Property مرحله اول برای ایجاد خواص وابستگی، یک فیلد استاتیک برای آن تعریف می کنیم، که با کلمه

:اضافه کنید code-behind شده به انتهای نام خواص تعریف می شود. کد زیر را به فایل

using System;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Media;

using System.Windows.Shapes;

using Caliburn.Micro;

using System.Collections.Specialized;

namespace ChartControl

{

public partial class LineChart : UserControl

{

private ChartStyleControl cs;

public LineChart()

{

InitializeComponent();

Page 27: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

this.cs = new ChartStyleControl();

this.cs.TextCanvas = textCanvas;

this.cs.ChartCanvas = chartCanvas;

}

private void chartGrid_SizeChanged(object sender, SizeChangedEventArgs e)

{

ResizeLineChart();

}

private void SetLineChart()

{

cs.Xmin = this.Xmin;

cs.Xmax = this.Xmax;

cs.Ymin = this.Ymin;

cs.Ymax = this.Ymax;

cs.XTick = this.XTick;

cs.YTick = this.YTick;

cs.XLabel = this.XLabel;

cs.YLabel = this.YLabel;

cs.Title = this.Title;

cs.IsXGrid = this.IsXGrid;

cs.IsYGrid = this.IsYGrid;

cs.GridlineColor = this.GridlineColor;

cs.GridlinePattern = this.GridlinePattern;

Page 28: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

ResizeLineChart();

}

private void ResizeLineChart()

{

chartCanvas.Children.Clear();

textCanvas.Children.RemoveRange(1, textCanvas.Children.Count - 1);

cs.AddChartStyle(tbTitle, tbXLabel, tbYLabel);

if (DataCollection != null)

{

if (DataCollection.Count > 0)

{

cs.SetLines(DataCollection);

}

}

}

public static DependencyProperty XminProperty =

DependencyProperty.Register("Xmin", typeof(double), typeof(LineChart),

new FrameworkPropertyMetadata(0.0,

FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

public double Xmin

Page 29: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

{

get { return (double)GetValue(XminProperty); }

set { SetValue(XminProperty, value); }

}

......

......

public static readonly DependencyProperty DataCollectionProperty =

DependencyProperty.Register("DataCollection",

typeof(BindableCollection<LineSeriesControl>), typeof(LineChart),

new FrameworkPropertyMetadata(null,

FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,

OnDataChanged));

public BindableCollection<LineSeriesControl> DataCollection

{

get { return (BindableCollection<LineSeriesControl>)GetValue(DataCollectionProperty); }

set { SetValue(DataCollectionProperty, value); }

}

private static void OnDataChanged(object sender, DependencyPropertyChangedEventArgs e)

{

var lc = sender as LineChart;

var dc = e.NewValue as BindableCollection<LineSeriesControl>;

Page 30: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

if (dc != null)

dc.CollectionChanged += lc.dc_CollectionChanged;

}

private void dc_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)

{

if (DataCollection != null)

{

CheckCount = 0;

if (DataCollection.Count > 0)

CheckCount = DataCollection.Count;

}

}

public static DependencyProperty CheckCountProperty =

DependencyProperty.Register("CheckCount", typeof(int), typeof(LineChart),

new FrameworkPropertyMetadata(0,

FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,

new PropertyChangedCallback(OnStartChart)));

public int CheckCount

{

get { return (int)GetValue(CheckCountProperty); }

set { SetValue(CheckCountProperty, value); }

}

Page 31: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

private static void OnStartChart(DependencyObject sender,

DependencyPropertyChangedEventArgs e)

{

(sender as LineChart).SetLineChart();

}

}

}

در اینجا فقط می خواهیم به شما نشان دهیم که چگونه خواص وابستگی را ایجاد کنید و کدهای تکراری را برای

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

با تکنیک های جدیدی WPF .را تعریف می کنیم Xmin برای وابستگی خواص چگونه ما که کنید توجه کنید.

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

رجیستر برای wrapper را فراخوانی می کند. در اینجا ما از کالس DepedencyObject یک wrapper کالس

داخل آن باشد و Property در سیستم خواص استفاده می کنیم تا شیئ شاملXamin وابستگی خواص کردن

نباید شامل property wrapper کنیم. معموال set یا get را Property می توانیم به راحتی مقدار

از GetValue و SetValue ای باشد زیرا ممکن است به طور مستقیم و با استفاده از متدهای logic هرنوع

.تنظیم و بازیابی شود DependencyObject کالس پایه

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

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

مستقیم فراخوانی می شود راه اندازی می شود. برای مثال، بعد از SetValue یا wrapper طریق

می باشد، می خواهیم کنترل نمودار را برای LineSeriesControl که شامل شیئ DataCollection ایجاد

-code فایل در شده پررنگ کد ایجاد کنیم. LineSeriesControl نمودار خطی مربوط به طور اتوماتیک برای

behind متد یک توان می قبلی نشان می دهد که چگونه callback را پیاده سازی

می باشد. در داخل این OnDataChanged با نام callback یک متد شامل DataCollectionProperty .کرد

اضافه می کنیم و این زمانی CollectionChanged برای خصوصیت handler یک رویداد callback متد

یک خواص وابستگی CollectionChanged handler تغییر کند راه اندازی می شود. در DataCollectionکه

Page 32: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

< CheckCount فراخوانی می کنیم. اگر DataCollection را در CheckCount و دیگر تنظیم می کنیم

می باشد و به همین LineSeriesشامل اشیاء DataCollection باشد می فهمیم که 0

برای پیاده سازی می کنیم که OnStartChart دیگری با نام callback دمت خاطر

.می باشد SetLineChart متد فراخوانی با خطی نمودار در CheckCountتخصوصی

های عمومی را در کالس property ما SetLineChart توجه داشته باشید که داخل متد

ChartStyleControl برای خواص وابستگی مربوط به کنترل نمودار تنظیم کرده ایم. به این ترتیب هر زمان

نیز متعاقبا ChartStyleو Legend کالس هایتغییر کند خواص LineChart که خواص وابستگی در کالس

.تغییر خواهد کرد

به کنترل نمودار خطی اضافه می کنیم chartGrid_SizeChanged event handler در اینجا ما همچنین یک

شود به روز رسانی می شود. حاال می توانیم resize نمودار کنترل تنظیم می کند که هر زمان handler این

.(کنیم Build)،بسازیم Buildکنترل را توسط راست کلیک بر روی نام پروژه و انتخابکتابخانه

استفاده از کنترل نمودار

در آن تا اینجای کار ما یک کنترل نمودار خطی ایجاد شده داریم که می توانیم به راحتی از

نیاز داریم فضای نام دات WPF خود استفاده کنیم. برای استفاده از این کنترل در اپلیکیشن WpfChart پروژه

:را به صورت شکل زیر مونتاژ کنیم XML کنیم و فضای نام map نت را

xmlns:local="clr-namespace:ChartControl;assembly=ChartControl"

:کنیم map را نام فضای که داریم نیاز اگر کنترل نمودار در همان اپلیکیشن ما قرا گرفته باشد فقط

xmlns:local="clr-namespace:ChartControl

Page 33: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

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

.را اضافه کرده اید XAML همانطور که دیگر انواع شیئ فایل

ایجاد یک نمودار خطی ساده

استفاده کنیم. در WPF نمودار برای ایجاد یک نمودار خطی درحاال نشان خواهیم داد که چگونه از کنترل

را انتخاب کنید تا Add References راست کلیک کرده و References، بر رویWpfChart پروژه

را از پنل سمت Projects کلیک کرده و سپس Solution ظاهر شود. بر روی Reference Manager پنجره

کلیک کنید OK کنید. بر روی highlight را ChartControl چپ این پنجره انتخاب کرده و

به پروژه جاری اضافه شود. به این ترتیب شما می توانید از این کنترل در ChartControlتا

جدید به UserControl شبیه به المان های ساخته شده در آن استفاده کنید. یک WPF اپلیکیشن

برای XAMLقرار دهید. در اینجا فایل ChartControlView اضافه کرده و نام آن را WpfChart پروژه

:به صورت زیر است View این

<UserControl x:Class="WpfChart.ChartControlView"

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:ChartControl;assembly=ChartControl"

mc:Ignorable="d"

d:DesignHeight="300" d:DesignWidth="500">

<Grid>

<Grid.ColumnDefinitions>

<ColumnDefinition Width="*"/>

<ColumnDefinition Width="150"/>

</Grid.ColumnDefinitions>

Page 34: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

ایجاد کرده بودید، WPF در اینجا به سادگی یک کنترل نمودار خطی دقیقا مثل آنچه که برای دیگر انواع المان

سادگی به و کنیم می مشخص را Property GridlinePattern ایجاد می کنید. توجه کنید که چگونه ما

تعریف شده استفاده می کنیم. این بسیار ساده LinePatternEnum که در Solid, Dash, Dot, DashDot از

می باشد که شما نیاز به تعیین نوع مسیر کامل به منظور تعریف الگوی code-behind تر از استفاده

رل جهت کنت WPF دارید. همچنین می توانید دیگر خصوصیت های استاندارد برای المان های gridlinesخطی

می باشد. BackGround و CanvasLeft ، CanvasTop نمودار را مشخص کنید که مانند عرض، ارتفاع،

های استاندارد اجازه می دهند کنترل را قرا داده و اندازه کنترل را تنظیم کنید یا رنگ پس زمینه Property این

.کنترل را انتخاب کنید

قرا ر می دهیم. در ChartControlViewModel و نام آن را حاال یک کالس جدید به پروژه اضافه می کنیم

:اینجا کد کالس به صورت زیر نشان داده شده است

using System;

using Caliburn.Micro;

using System.Collections.ObjectModel;

using System.ComponentModel.Composition;

using System.Windows;

using System.Windows.Media;

using ChartControl;

namespace WpfChart

{

[Export(typeof(IScreen)), PartCreationPolicy(CreationPolicy.NonShared)]

public class ChartControlViewModel : Screen

{

[ImportingConstructor]

public ChartControlViewModel()

Page 35: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

{

DisplayName = "03. Chart Control";

DataCollection = new BindableCollection<LineSeriesControl>();

}

public BindableCollection<LineSeriesControl> DataCollection{get;set;}

public void AddChart()

{

DataCollection.Clear();

LineSeriesControl ds = new LineSeriesControl();

ds.LineColor = Brushes.Blue;

ds.LineThickness = 2;

ds.SeriesName = "Sine";

ds.LinePattern = LinePatternEnum.Solid;

for (int i = 0; i < 50; i++)

{

double x = i / 5.0;

double y = Math.Sin(x);

ds.LinePoints.Add(new Point(x, y));

}

DataCollection.Add(ds);

ds = new LineSeriesControl();

Page 36: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

ds.LineColor = Brushes.Red;

ds.LineThickness = 2;

ds.SeriesName = "Cosine";

ds.LinePattern = LinePatternEnum.Dash;

for (int i = 0; i < 50; i++)

{

double x = i / 5.0;

double y = Math.Cos(x);

ds.LinePoints.Add(new Point(x, y));

}

DataCollection.Add(ds);

}

}

}

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

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

ز ااستاندارد در اپلیکیشن استفاده کنیم، حتی از طریق ایجاد کنترل نمودار با استفاده MVVM توانید از الگوی

View را در DataCollectionدر اینجا ما فقط خصوصیت . Code behind خواص وابستگی و روش

Model تعریف کردیم) نیازی به پیاده سازی رابط INotifyCollectionChanged برای

تصل وجود دارد( و این را به کنترل نمودار م interface نداریم زیرا به صورت ساخته شده در اینcollection این

محدود Caliburn.Micro با نامگذاری View نیز به دکمه در View Model در AddChart می کند. متد

ایجاد کردیم که مطابق با نیازمندی های View Model و View است. به این ترتیب ما یک جداسازی کامل بین

.می باشد MVVM الگوی

Page 37: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

ی که در شکل زیر نشان داده شده را می دهد. شما می نتیجه ا Chart اجرای این مثال و کلیک بر روی دکمه

.توانید نمودار را تغییر اندازه دهید تا ببینید که چگونه نمودار به طور خودکار آپدیت می شود

ایجاد چندین نمودار خطی

کنید. اجازه ایجاد WPF با استفاده از کنترل نمودار خطی می توانید به آسانی نمودارهای متعددی در یک پنجره

قرار دهیم.یک کنترل MultiChartView جدید به پروژه اضافه کنیم ونام آن را UserControl دهید یک

Page 38: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

از استفاده با تواند می که کنید اضافه گرید سلول 4 هر برای نمودار کنترل یک و کرده ایجاد گرید دو به دو

:زیر انجام شود XAML فایل

<UserControl x:Class="WpfChart.MultiChartView"

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:cal="http://www.caliburnproject.org"

xmlns:local="clr-namespace:ChartControl;assembly=ChartControl"

mc:Ignorable="d"

d:DesignHeight="600" d:DesignWidth="600">

<Grid cal:Message.Attach="[Event Loaded]=[Action AddChart]">

<Grid.ColumnDefinitions>

<ColumnDefinition/>

<ColumnDefinition/>

</Grid.ColumnDefinitions>

نام دارد. برای سادگی Chart1, Chart2, Chart3, Chart4 کنترل نمودرا خطی ایجاد می کنیم که 4در اینجا ما

یک نمودار هر برای کنیم. اماکار در این مثال توابع داده ای مشابه روی نمودار رسم می

مودارن هر روی را متفاوتی ریاضی توابع توانیم می عمل در. کنیم می تنظیم متفاوت GridlineColor خصوصیت

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

دهید. کد قرار MultiChartViewModel اضافه کرده و نام آن را ViewModels یک کالس جدید به فولدر

:این کالس به صورت زیر است

using System;

Page 39: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

using Caliburn.Micro;

using System.Collections.ObjectModel;

using System.ComponentModel.Composition;

using System.Windows;

using System.Windows.Media;

using System.Windows.Controls;

using ChartControl;

namespace WpfChart

{

[Export(typeof(IScreen)), PartCreationPolicy(CreationPolicy.NonShared)]

public class MultiChartViewModel : Screen

{

private readonly IEventAggregator _events;

[ImportingConstructor]

public MultiChartViewModel()

{

this._events = events;

DisplayName = "02. Multiple Charts";

DataCollection = new BindableCollection<LineSeriesControl>();

}

public BindableCollection<LineSeriesControl> DataCollection { get; set; }

public void AddChart()

Page 40: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

{

DataCollection.Clear();

LineSeriesControl ds = new LineSeriesControl();

ds.LineColor = Brushes.Blue;

ds.LineThickness = 2;

ds.SeriesName = "Sine";

ds.LinePattern = LinePatternEnum.Solid;

for (int i = 0; i < 50; i++)

{

double x = i / 5.0;

double y = Math.Sin(x);

ds.LinePoints.Add(new Point(x, y));

}

DataCollection.Add(ds);

ds = new LineSeriesControl();

ds.LineColor = Brushes.Red;

ds.LineThickness = 2;

ds.SeriesName = "Cosine";

ds.LinePattern = LinePatternEnum.Dash;

for (int i = 0; i < 50; i++)

{

double x = i / 5.0;

double y = Math.Cos(x);

Page 41: WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب یصصzت ... · WPF ر یطخ راومن اجیا : هلاقم ناونع ناسیون همانرب

WPFایجاد نمودار خطی در عنوان مقاله :

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

www.barnamenevisan.org [email protected]

ds.LinePoints.Add(new Point(x, y));

}

DataCollection.Add(ds);

}

}

}

کنترل 4مشابه مثال قبلی است که در آن یک نمودار خطی تکی ایجاد کرده بودید. در اینجا View Model این

می WPF مشابه متصل می شود. مانند بقیه المانهای ساخته شده در DataCollectionهای نمودار خطی به شیئ

.تکی قرار دهید WPF اپلیکیشن یک در نیاز، اساس توانید بسیاری از کنترل های نمودار را بر

.شکل زیر نتایج اجرای این مثال را نشان می دهد