ورود

View Full Version : ده برتری WPF به Win Forms



MortezaGity
چهارشنبه 08 مهر 1394, 04:50 صبح
به عنوان اولین برتری از مجموعه برتری های WPF (http://provid.ir/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-telerik-radcontrols-wpf/)نسبت به Windows Form Application ها باید بگوییم که ساخت برنامه های WPF (http://provid.ir/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-%d8%ac%d8%a7%d9%85%d8%b9-mvvm-%d8%af%d8%b1-wpf/)نستباً سریع تر است. البته این سرعت به شرط آن است که به راحتی بتوانید با XAML کار کنید و در واقع آن را به خوبی فرا گرفته باشید.
برای ساخت فرم های یک برنامه در پلت فرم Windows Forms باید کنترل ها را از جعبه ابزار به روی فرم قرار دهید و سپس پروپرتی های آن ها را تغییر دهید:


135586
135587
در حالی که برای ساخت یک فرم زیبا در پلت فرم WPF (http://provid.ir/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-%d8%ac%d8%a7%d9%85%d8%b9-mvvm-%d8%af%d8%b1-wpf/)کافی است شروع به تایپ کردن XAML کنید. به علاوه، به راحتی می توان کدهای XAML خود را کپی / پیست کنید که این موضوع خود سرعت کار کردن بالا می برد.

135588
شاید یکی دیگر از موضوع هایی که برای اعمال این سرعت در ساخت برنامه های WPF (http://provid.ir/%d8%a8%d8%b3%d8%aa%d9%87-%db%8c-%d8%ac%d8%a7%d9%85%d8%b9-%d8%a2%d9%85%d9%88%d8%b2%d8%b4-wpf-%d8%af%d8%b1-%d9%88%db%8c%da%98%d9%88%d8%a7%d9%84-%d8%a7%d8%b3%d8%aa%d8%a7%d8%af%db%8c%d9%88-2010/)به آن نیاز داشته باشید، تایپ ده انگشتی است. بنابراین، اگر از آن دسته از دوستانی هستند که فقط با دو انگشت تایپ می کنند، لطفاً فکری به حال خود کنید!

SabaSabouhi
چهارشنبه 08 مهر 1394, 07:44 صبح
سلام
با تشکر از دوست خوبمون MortezaGity یک ویژگی دوست داشتنی دیگه از WPF رو بهش اشاره می‌کنم.
بر خلاف Windows Forms و شبیه به پروژه‌های مبتنی بر وب در WPF امکان تولید style و استفاده از اون در تمام پروژه هست.
مثلاً یه style برای دکمه‌های دور گرد تولید می‌کنی و با قرار دادن اون در App.xaml تمام دکمه‌های پروژه دور گرد می‌شن.

صبا صبوحی

سیدسبحان
چهارشنبه 08 مهر 1394, 07:56 صبح
سلام
با تشکر از دوست خوبمون MortezaGity یک ویژگی دوست داشتنی دیگه از WPF رو بهش اشاره می‌کنم.
بر خلاف Windows Forms و شبیه به پروژه‌های مبتنی بر وب در WPF امکان تولید style و استفاده از اون در تمام پروژه هست.
مثلاً یه style برای دکمه‌های دور گرد تولید می‌کنی و با قرار دادن اون در App.xaml تمام دکمه‌های پروژه دور گرد می‌شن.

صبا صبوحی

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

SabaSabouhi
چهارشنبه 08 مهر 1394, 12:32 عصر
سلام
یه ویژگی دوست داشتنی WPF امکان binding بسیار قدرتمندی هست که داره، به ویژه این که شما می‌تونی دو ماهیت کاملاً متفاوت با
جنسیت‌های متفاوت رو با یک Converter که می‌نویسی به هم ارتباط بدی.
مثلاً شما می‌تونی یک دکمه داشته باشی که با کوچیک و بزرگ شدن پنجره، رنگش عوض بشه. در حالی که ظاهراً این دو ماهیت یعنی
ابعاد پنجره و رنگ زمینه‌ی دکمه‌ی شما هیچ ارتباط منطقی نمی‌تونن با هم داشته باشن.
در ضمن این binding می‌تونه به صورت‌های فقط یک بار، یک‌طرفه، دو طرفه یا یک‌طرفه به سمت مبداً باشه.
انجام عمل binding بسته به میل برنامه نویس به صورت دستی، هنگام خروج از کنترل و یا بروز هر تغییر در خاصیت‌ها انجام بشه.

این binding به حدی راحت، قدرتمند و دوست داشتنی هست که اگه کسی تجربه‌اش کنه دیگه خیلی براش سخت می‌شه Winform کار کنه.

صبا صبوحی

elec60
پنج شنبه 09 مهر 1394, 10:50 صبح
دو مورد خيلي دوست داشتني و كاربردي هم DependencyProperty ها و RoutedEventها هستن.
كه خاصيت AutomaticPropertyChangedNotification مربوط به DP ها خيلي بدرد ميخوره (مخصوصا تو بايندينگ)
و همين طور Routing Strategy مربوط به RoutedEvents كه سه حالت داره:
١- Bubbling
اگه كنترلي يك ايونت با اين نوع استراژي پياده سازي كنه اين ايونت از خود كنترل شروع به بالا رفتن ميكنه(مثل حباب) و Logical Tree رو طي ميكنه و نهايتا به آخرين كنترل (Ancestor و يا همون والد يا جد) ميرسه. حالا هر جايي خواستين ميتونين ايونت رو هندل كنين تا بالاتر نره. مثلا اگه Window داشته باشين كه توش يه Canvas باشه و توي Canvas هم يه TextBlock و ايونت كليك TextBlock رو پياده سازي كنين با Fire شدن اين رويداد علاوه بر خود كنترل، Canvas و Window هم ميبينن اين ايونت رو.

٢-Tunneling
برعكس مورد اول هست و اول كنترل تو بالاترين سطح Logical Tree ميبينتش. اين ايونتها با اسم Preview شروع ميشن. يجاهايي خيلي بدردم خوردن...

٣- Direct
كه دقيقا همون استراتژي سابق دات نت تو Winform هست

elec60
پنج شنبه 09 مهر 1394, 11:05 صبح
يه مورد ديگه كه خيلي بكارم اومده MultiBinding هست

مثلا خاصيت IsEnabled يك Button رو به خاصيت Text چند تا تكست باكس و خاصيت SelectedIndex چند تا ComboBox بايند ميكنيم تا اگه تمام تكست باكسها Text نداشتن و تمامي ComboBoxها آيتم انتخاب شده نداشتن دكمه غيرفعال باشه تا يوزر نتونه كليك كنه. به عبارتي اگه حداقل يه تكست باكس و حداقل يه كمبوباكس خالي باشه دكمه غيرفعال باشه.
براي MultiBinding بايد از Converter اي كه IMultiValueConverter رو پياده سازي كرده استفاده كرد

elec60
پنج شنبه 09 مهر 1394, 11:09 صبح
مورد بعدي كه بكارم اومده AttachedProperty هست.
براي مثال كنترل TextBlock رو اگه داخل يه Grid بزارين چند تا خاصيت بهش اتچ ميشه مثل Grid.Row و Grid.RowSpan
كه نوشتن Custom AttachedProperty امكان پذيره

SabaSabouhi
یک شنبه 12 مهر 1394, 16:09 عصر
سلام
از دوست خوبم elec60 سپاس‌گزارم که با پست‌های خوبش این تاپیک رو گرم کرد. و از دوست خوب دیگمون MortezaGity هم خواهش می‌کنم
این کار خوبی رو که شروع کرده ادامه بده و ما رو تنها نگداره.

یه چیز خیلی جالب دیگه که تو WPF نسبت به WinForm وجود داره اینه که ما می‌تونیم از یه کنترل موجود ارث بگیریم، اما ظاهرش رو ارث نگیریم
و ظاهر کار رو کاملاً باز نویسی کنیم. برای این کار باید یه Custom Control ایجاد کنیم که از کنترل مورد نظرمون ارث بگیره و تو static initializer
این رو اعلام کنیم:


static MyControl(){
DefaultStyleKeyProperty.OverrideMetadata( typeof ( MyControl ), new FrameworkPropertyMetadata( typeof ( MyControl )));
}

بعد توی General.XAML که توی فولدر Themes قرار داره، ساختار جدید کنترل رو معرفی می‌کنیم.

به همین راحتی ظاهر یک کنترل موجود رو بدون هیچ کد نویسی تبدیل به ظاهر دلخواه خودمون می‌کنیم.

صبا صبوحی

elec60
یک شنبه 12 مهر 1394, 20:54 عصر
مورد بعدي اينه كه WPF از DirectX استفاده ميكنه و محاسبات گرافيكي به صورت برداري انجام ميشه كه مزيت بزرگي نسبت به محاسبات پيكسلي محسوب ميشه. براي مثال وقتي يك شي گرافيكي ساخته بشه و بعد زوم انجام بشه در محاسبات برداري Interpolation انجام نميشه و شكل نهايي دچار افت كيفيت نميشه اما در محاسبات پيكسلي با زوم كردن، پيكسلهاي غايب با استفاده از درونيابي تخمين زده ميشن(Bilinear, Bicubic, etc) كه باعث افت كيفيت ميشه

بعلاوه WPF براي محاسبات گرافيكي از GPU به جاي CPU استفاده ميكنه

elec60
یک شنبه 12 مهر 1394, 21:12 عصر
مورد بعدي خاصيت Resolution Independent بودن WPF هست. تو WPF اگه مثلا خاصيت Width يك Button رو ٦٠ بزارين اين عدد برابر تعداد پيكسل نيست، بلكه اين عدد در ١/٩٦ و بعد در DPI سيستم ضرب ميشه. مثلا اگه DPI برابر ٩٦ باشه ٦٠ در ١/٩٦ و در ٩٦ ضرب ميشه و حاصل ميشه ٦٠
ممكنه مسخره به نظر بياد اما اصلا اين طور نيست! تصور كنين يه مانيتور بزرگ 55 اينچ داريم و DPI برابر 120 باشه، در اين صورت عدد ٦٠ در ١/٩٦ و سپس در ١٢٠ ضرب ميشه و Width كه ٦٠ واحد بود مقدار واقعيش بزرگتر از ٦٠ پيكسل ميشه و اين باعث ميشه اندازه Button تو مانيتور بزرگ كوچيك بنظر نياد و تشابه هندسي برقرار بشه. اما تو Winforms اگه اندازه برابر ٦٠ باشه اين ٦٠ تعداد پيكسل هست و اگه مانيتور بزرگ بشه Button مورد نظر خيلي كوچك بنظر مياد