PDA

View Full Version : حرفه ای: تبدیل WinForm به WPF مرجع کامل



کاظم فلاحی خواه
چهارشنبه 09 مرداد 1392, 15:54 عصر
در آغاز از مدیران تالار می خوام گیر ندن به مضوع تالار چون که هم مربوط به تالار سی شارپ هم وی بی دات نت و هم وی پی اف هست اما من توی این تالار گذاشتم تا دوستان کلا از وین فرم دل بکنن .

http://mahapps.com/MahApps.Metro/images/animatedtabcontrol.gif

سلام بر تمامی دوستان عزیز ، با توجه به تجاربی که در زمینه تبدیل WinForm به WPF دارم راه های زیر رو بهتون پیشنهاد می کنم برای اینکه پروژه تون رو بدون کد نویسی دوباره در همون حالت تعریف پروژه ی وین فرم اجزای اون یعنی فرم ها رو به بصورت WPF در آرید که هیچ فرقی با در پروژه ی ایجاد شده با خود WPF نکنه ، مراحل زیر را به ترتیب دنبال کنید ;

نکات آغازین
<ویژوال استادیو 2012/2010><نت فریم وورک 4 یا 4.5><آخر کار پروژه برای دانلود گذاشته شده><قسمت جالبش اینجاست که استایل مترو روی ویندوز ایکس پی هم اجرا میشه>

1-برای اونایی که پروژه خود رو با VB.NET WinForm ایجاد کرده اند ابتدا Designer فرم مورد نظر رو در سایت زیر وارد کنید و انرو تبدیل به سی شارپ کنید بعدا متوجه خواهید شد
http://converter.telerik.com

بعد از اینکه سورس Designer فرم مورد نظر تبدیل به C#‎‎‎‎‎‎‎‎‎‎‎‎‎.NET شد اونرو کپی و در ابزار تبدیل وین فرم به WPF سایت زیر وارد کنید
http://www.win2wpf.com

بعد از اینکه کد های Designer وین فرم تبدیل به XAML شدند به مراحل زیر توجه کنید :

این نمونه ی فرم پروژه ی ایجاد شده است

http://ritfile.com/up1/fda49710cc.png

در اولین مرحله نیاز به یک WPF User Control هست مانند شکل زیر ایجاد می کنیم :

http://ritfile.com/up1/986ff16ec9.png

بعد ، کد های XAML تبدیل شده رو در XAML یوزر کنترل وی پی اف Paste می کنیم تا به شکل زیر در آید

http://ritfile.com/up1/2a506308ad.png

حالا می خوام بطور سفارشی ظاهر WPF رو تبدیل به سبک مترو کنم دوستان عزیز اینجا ما باید از ابزار
NuGet Tool استفاده کنیم برای نصب یه بسته اضافی بنام MahApps.Metro ، به تصاویر زیر نگاه کنید

http://ritfile.com/up1/5a711ef8ec.png

توجه کنید که برای یافتن سریع بسته ی مورد نظر MahApps.Metro را جستجو کنید .
روی دکمه ی Install کلیک می کنیم تا بسته نصب شود

http://ritfile.com/up1/25ea21a56d.png

http://ritfile.com/up1/c7c3601ae3.png

برای اینکه فایل یوزر کنترل WPF از سبک مترو استفاده کنه و همچنین از UcserControl تبدیل به Window بشه کد زیر رو از


<UserControl x:Class="MyWinFormApp.UserControl1"
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"

تبدیل بشه به


<controls:MetroWindow x:Class="MyWinFormApp.UserControl1"
xmlns:controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps. Metro"
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"

فراموش کنید تگ خروجی رو از


</UserControl>
تبدیل به


</controls:MetroWindow>
کنید

یه چیز دیگه برای سی شارپ


</controls:MetroWindow>
برای وی بی دات نت بصورت زیر


</Controls:MetroWindow>
باشه

دوستان عزیز سی شارپی توجه فرمایند که باید کد فایل سی شارپ (xaml.cs) رو

از

public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}
}
به

public partial class UserControl1
{
public UserControl1()
{
InitializeComponent();
}
}
تبدیل بشه ;

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

You Must Add a Refrence to assembly ...

http://ritfile.com/up1/53004ba247.png

برای رفع این ارور به تصاویر زیر نگاه کنید ;

http://ritfile.com/up1/cc10fc3d70.png

http://ritfile.com/up1/15f9d7c1fa.png

برای اینکه WinForm رو فراموش کنیم و حالا از WPF زیبا استفاده کنیم کدهای زیر رو در فایل Program.cs
تغییر بدید ;


C#‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎‎

static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
Application.Run(new Form1());
}
به

static void Main()
{
UserControl1 uc1 = new UserControl1();
uc1.ShowDialog();
}

برای VB.NET باید Propertis پروژه رو باز کرد و گزینه ی Enable Application Fremework رو از تیک بردارید

http://ritfile.com/up1/99eac43465.png

بعد یه ماژول به نام Program ایجاد کنید و کد های زیر رو داخلش قرار بدید

''' <summary>
''' The main entry point for the application.
''' </summary>
Sub Main()
'Application.EnableVisualStyles()
'Application.SetCompatibleTextRenderingDefault(Fal se)
'Application.Run(New Form1())

Dim uc1 As UserControl1 = New UserControl1
uc1.ShowDialog()

End Sub

دوباره Propertis پروژه رو باز کنید و حالا در قسمت Startup object گزینه ی Sub Main رو انتخاب کنید

http://ritfile.com/up1/b9dc994317.png

برنامه رو بشکل Start Without Debugging اجرا کنید پنجره ی وی پی اف بصورت زیر نمایش داده می شود

http://ritfile.com/up1/d185586af5.png

ناراحت نشید این سبک پیش فرضش هست برای حل مشکل کد های زیر رو قبل از تگ آغازین <Grid>
اضافه کنید فقط توجه داشته باشید برای وی بی دات نت باید controls بصورت Controls باشد


<controls:MetroWindow.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colours.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</controls:MetroWindow.Resources>

http://ritfile.com/up1/64cf059e39.png

حالا پنجره ای شبیه شکل زیر نمایش داده می شه

http://ritfile.com/up1/92b31e90ea.png

برای اینکه پنجره ی وی پی اف به خوبی نمایش داده بشه کد های XAML زیر را از فایل UserControl پاک کنید


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"
رو به کد های زیر


Height="300" Width="300"
تغییر بدید

اما یک اشکال البته در پروژه های وی بی دات نت ، اگر شما خواستید Target framework پروژه تون رو از 4 به 4.5 یا بالعکس تبدیل کنید هنگام کامپایل خطا می ده خیلی راحت می تونید رفع اشکال کنید برای حل این مشکل به قسمت References پروژه برید و دو رفرنس MahApps.Metro و System.Windows.Interactivity رو حذف کنید و دوباره و اینبار با توجه به نسخه فریم وورک رفرنس های مورد نظر را وارد کنید که در مسیر پروژه ی مورد نظر هستند با راست کلیک روی Solution پروژه و انتخاب
Open Folder In File Explorer پوشه راه حل پروژه باز میشه بعد به مسیر زیر برید

نت فریم وورک 4


packages\MahApps.Metro.0.10.1.1\lib\net40

نت فریم وورک 4.5


packages\MahApps.Metro.0.10.1.1\lib\net45

اما نکاتی برای دوستانی که پروژه های سنگین با فرم های زیاد دارند و همچنین اونایی که در پروژه شون از کامپوننت های مختلف استفاده می کنند باید توجه داشته باشند که ابتدا پروژه شون به فرم اصلی یا همون اجرایی پروژه رو بهش متمرکز شوند و اون رو بصورت دستی ازش مانند وی پی اف بسازند و نکنه این کار اشتباه رو کنند و بیان کل فرم ها رو به وی پی اف تبدیل کنند این کار اشتباهه باید برنامه ریزی کنند مثلا در هر نسخه ی برنامه یک فرم تبدیل به وی پی اف بشه بعد از اینکه همه ی فرم ها مثلا بعد از مثلا دو ماه تبدیل به وی پی اف شد حالا می تونند یه پروژه ی خالی وی پی اف بسازند و فرم های وی پی اف رو داخلش کپی کنند بعد با زدن گزینه ی Show Hidden Files و انتخاب همه ی فایل ها و راست کلیک روی آنها و انتخاب گزینه ی InClude In Project به طور کلی پروژه شون تبدیل به وی پی اف بشه .

نکته ی شماره 2 خیلی مهم : برای ایجاد فرم های دیگر بصورت وی پی اف توجه داشته باشید که دو نوع برخورد با این فرم های وجود داره

ابتدا متغیر فرم 2 رو در فایل Program تعریف می کنیم

Module Program
''' <summary>
''' The main entry point for the application.
''' </summary>
Friend uc2 As New UserControl2()
Sub Main()
'Application.EnableVisualStyles()
'Application.SetCompatibleTextRenderingDefault(Fal se)
'Application.Run(New Form1())

Dim uc1 As UserControl1 = New UserControl1
uc1.ShowDialog()

End Sub
End Module


دو حالت برای باز کردن فرم داریم

1-اول اینکه ما بخواییم بصورت Show. بازشون کنیم برای همین به کد های زیر دقت کنید

برای باز کردن برنامه از فرم 1 بصورت Show

Private Sub Button_Click_1(sender As Object, e As Windows.RoutedEventArgs)
'باز کردن فرم 2
uc2.Show()
End Sub
وقتی که فرم شماره 2 بطور کامل خارج شد


Private Sub UserControl2_Closed_1(sender As Object, e As EventArgs)
'وقتی از فرم 2 بطور کامل خارج شدیم
uc2 = New UserControl2
End Sub


2. حالت باز کردن فرم بصورت ShowDialog

برای باز کردن برنامه از فرم 1 بصورت ShowDialog

Private Sub Button_Click_1(sender As Object, e As Windows.RoutedEventArgs)
'باز کردن فرم 2
uc2.ShowDialog()
End Sub
رخ داد خارج شدن فرم شماره ی 2

Private Sub UserControl2_Closing_1(sender As Object, e As System.ComponentModel.CancelEventArgs)
'هنگام خارج شدن فرم 2
e.Cancel = True
Me.Hide()
End Sub


نکته ی شماره 3 : دوستانی که در پروژه شون اگه می خوان از وین فرم نیز استفاده کنند مطمئنن باید دو خط کد زیر رو در ماژول Program داشته باشند

Application.EnableVisualStyles()
Application.SetCompatibleTextRenderingDefault(Fals e)
مثال

Module Program
''' <summary>
''' The main entry point for the application.
''' </summary>
Friend uc2 As New UserControl2()
Sub Main()
Application.EnableVisualStyles()
Application.SetCompatibleTextRenderingDefault(Fals e)
'Application.Run(New Form1())

Dim uc1 As UserControl1 = New UserControl1
uc1.ShowDialog()

End Sub
End Module
حالا برای ایجاد دکمه های گوناگون و انواع کنترل ها به سایت زیر برید :

http://ritfile.com/up1/2e63ee0fde.png

http://mahapps.com/MahApps.Metro/

دانلود پروژه
108239
108240

اگه سؤالی داشتید در خدمتیم . تشکر یادتون نره .

کاظم فلاحی خواه
چهارشنبه 09 مرداد 1392, 18:26 عصر
برای اضافه کردن اسپلش اسکرین دو راه وجود دارد

اول : اگه فرم پنجره وین فرم باشه

Module Program

Dim splashTimer As Timer

Sub Main()
Application.EnableVisualStyles()
Application.SetCompatibleTextRenderingDefault(Fals e)

splashTimer = New Timer()
AddHandler splashTimer.Tick, AddressOf TimerTick
splashTimer.Interval = 7000
splashTimer.Start()

SplashScreenForm.ShowDialog()

Dim uc1 As UserControl1 = New UserControl1
uc1.ShowDialog()

End Sub

Private Sub TimerTick(sender As Object, e As EventArgs)
splashTimer.Stop()
SplashScreenLoad.Close()
End Sub

End Module



دوم : اگه پنجره ی WPF رو برای اسپلش اسکرین در نظر بگیریم

Module Program

Dim splashTimer As Timer

Sub Main()
Application.EnableVisualStyles()
Application.SetCompatibleTextRenderingDefault(Fals e)

splashTimer = New Timer()
AddHandler splashTimer.Tick, AddressOf TimerTick
splashTimer.Interval = 7000
splashTimer.Start()

Dim splash As New SplashScreenForm
splash.ShowDialog()

Dim uc1 As UserControl1 = New UserControl1
uc1.ShowDialog()

End Sub

Private Sub TimerTick(sender As Object, e As EventArgs)
splashTimer.Stop()
SplashScreenLoad.Close()
End Sub

End Module

barnamenevisjavan
چهارشنبه 09 مرداد 1392, 22:57 عصر
ببخشید ولی این که تبدیل win به wpf نیستش
شما از ابزار mahapps.metro استفاده کردی که خیلی راحت میشه ظاهر فرم رو تغییر داد
اینم آموزش گام بگامش
http://mahapps.com/MahApps.Metro/

کاظم فلاحی خواه
پنج شنبه 10 مرداد 1392, 05:21 صبح
ببخشید ولی این که تبدیل win به wpf نیستش
شما از ابزار mahapps.metro استفاده کردی که خیلی راحت میشه ظاهر فرم رو تغییر داد
اینم آموزش گام بگامش
http://mahapps.com/MahApps.Metro/

یکمی هم از مغزت استفاده کنی می فهمی من چطور مطالب رو نوشتم شما اصلا مطالب رو به طور کامل خوندید من توی پروژه ای که با وین فرم ایجاد می شه از پنجره ی wpf استفاده کردم تمامی این مطالبی که نوشتم حاصل چند ماه بررسی در تبدیل پروژه های وین فرم به وی پی اف هسته خب برو خودت توی پروژه ی وین فرم یه یوزر کنترل وی پی اف ایجاد کن اونوقت تگ های آغازین و پایانی رو Window یا هر کامپوننت دیگری رو بذاری اینجاست مشکلات پی مشکلات می یان به نظرم تو آدم خیلی ساده انگاری هستی چون مطلبی رو می بینی به عمقش پی نمی بری اینو به عنوان دوستی یکسالمون بهت گفتم تا هر چیزی پست و پایین نبینی ، بخاطر مطالبم ناراحت نشی مهدی جان ; اما

شما از ابزار mahapps.metro استفاده کردی
خب وقتی که پروژه تبدیل به وی پی اف شد می شه از هر ابزاری استفاده کرد مثل :
http://wpftoolkit.codeplex.com
http://mui.codeplex.com
http://wpfthemes.codeplex.com
http://wpfextendeddatagrid.codeplex.com
http://wpfchromium.codeplex.com
http://modernuicharts.codeplex.com

کاظم فلاحی خواه
پنج شنبه 10 مرداد 1392, 09:34 صبح
بدلیل وجود مشکل تایپ کردن (بطور کلی رخ ندادن رویداد KeyPress هنگام فشردن دکمه های صفحه کلید) در پنجره های وی پی اف هنگام باز شدن از WinForm (بصورت Show) راه حل زیر رو بهتون پیشنهاد می دم ;

کد زیر رو به ماژول Program قبل از اجرای فرم اصلی برنامه اضافه کنید



System.Windows.Forms.Integration.ElementHost.Enabl eModelessKeyboardInterop(form2)'کد اضافه شده

در کد بالا مشاهده می کنیم فرم 2 درون پرانتز قرار گرفته پس خیالتان راحت باشه ازین به بعد هر وقت فرم 2 رو باز کنید امکان استفاده از صفحه کلید امکان پذیر میشه


Module Program

Dim splashTimer As Timer
Friend form2 As New UC2
Sub Main()
Application.EnableVisualStyles()
Application.SetCompatibleTextRenderingDefault(Fals e)

splashTimer = New Timer()
AddHandler splashTimer.Tick, AddressOf TimerTick
splashTimer.Interval = 7000
splashTimer.Start()

SplashScreenForm.ShowDialog()

Dim uc1 As UserControl1 = New UserControl1
'==========================================
System.Windows.Forms.Integration.ElementHost.Enabl eModelessKeyboardInterop(form2)'کد اضافه شده
'==========================================
uc1.ShowDialog()

End Sub

Private Sub TimerTick(sender As Object, e As EventArgs)
splashTimer.Stop()
SplashScreenLoad.Close()
End Sub

End Module

ali.rk
یک شنبه 13 مرداد 1392, 10:26 صبح
خط
uc1.ShowDialog()
ارور می ده چی کیار کنم ؟ :'|

کاظم فلاحی خواه
یک شنبه 13 مرداد 1392, 13:55 عصر
میشه سورس پروژه ات رو بفرستی تا بررسی کنم و خطا هاش رو بر طرف کنم،اگه پروژه رو نمی خوای در اختیار دیگران قرار بدی توضیحات کاملی رو بده تا بگم مشکل از کجایه .

ali.rk
یک شنبه 13 مرداد 1392, 16:38 عصر
مشکلم حل شد sry