การเปลี่ยนจาก Windows Forms เป็น WPF


113

เป็นเวลานานแล้วที่ฉันติดอยู่กับการพัฒนา Windows Forms (เริ่มต้นด้วย VB6 และดำเนินต่อไปจนถึง C # .NET 4.5) และฉันได้บรรลุขีด จำกัด ของสิ่งที่ Windows Forms สามารถทำได้แล้วทั้งที่ใช้. NET และเทคนิคพิเศษด้วย Native Code

ฉันพยายามเรียนรู้ WPF และ XAML แล้ว แต่ฉันติดอยู่ที่นักออกแบบคนใหม่ของ WPF ดูเหมือนยากมากที่จะใช้เมื่อเทียบกับตัวออกแบบ Windows Forms

ฉันต้องการทราบว่ามีทางเลือกอื่นสำหรับนักออกแบบ WPF ของ. NET ที่เหมาะกับนักพัฒนา Windows Forms หรือไม่?


7
ฉันมักจะไม่ใช้นักออกแบบบันทึกเพื่อตรวจสอบว่าเค้าโครงโดยรวมเป็นอย่างที่ฉันคาดหวัง ในท้ายที่สุดฉันเขียนทุกอย่างด้วยมือใน XAML และ / หรือใช้ Blend เมื่อจำเป็น - แม้ว่าฉันจะไม่ใช่นักออกแบบ แต่ก็แทบจะไม่เคยเกิดขึ้นเลย
Patryk Ćwiek

คุณสามารถใช้ Expression ผสมผสานได้ แต่ฉันไม่คิดว่ามันจะง่ายกว่านี้จริงๆสำหรับนักออกแบบมากกว่า IMO ของนักพัฒนา ปกติฉันแค่ปิดการแสดงตัวอย่างและใช้งาน xml
BlackICE

5
ใช้งานไม่ยากคุณก็ไม่ชิน อุปสรรคที่ใหญ่ที่สุดในการเอาชนะคือการเปลี่ยนกระบวนทัศน์ระหว่างเทคโนโลยีทั้งสอง รับหนังสือดีๆบน XAML เมื่อคุณคุ้นเคยกับ XAML แล้วคุณจะไม่ใช้ตัวออกแบบอีกต่อไป - คุณจะพิมพ์ XAML โดยตรง
slugster

3
@slugster ฉันสงสัยเกี่ยวกับเรื่องนั้น สิ่งเดียวกันเกิดขึ้นกับ HTML ... ฉันเคยสร้าง UI ด้วย dreamweaver และตอนนี้ฉันเขียนโค้ด HTML ด้วยมือ
Matthew Layton

คำตอบ:


175

ฉันชอบเขียนบล็อกเกี่ยวกับบทความเริ่มต้นสำหรับ WPF และมีบางส่วนที่อาจช่วยคุณได้:

เพื่อสรุปความแตกต่างที่ใหญ่ที่สุดระหว่าง Winforms และ WPF คือใน WPF ชั้นข้อมูลของคุณ (ไฟล์ DataContext ) คือแอปพลิเคชันของคุณในขณะที่ใน Winforms เลเยอร์ UI ของคุณคือแอปพลิเคชันของคุณ

หากต้องการดูอีกวิธีหนึ่งด้วย WPF แอปพลิเคชันของคุณประกอบด้วยวัตถุที่คุณสร้างและคุณใช้เทมเพลตและวัตถุ UI อื่น ๆ เพื่อบอก WPF ว่าจะวาดส่วนประกอบแอปพลิเคชันของคุณอย่างไร

ตรงข้ามกับ WinForms ที่คุณสร้างแอปพลิเคชันของคุณจากออบเจ็กต์ UI จากนั้นให้ข้อมูลที่จำเป็น

ด้วยเหตุนี้นักออกแบบจึงไม่ได้ใช้งานมากนักเนื่องจากส่วนประกอบแอปพลิเคชันของคุณได้รับการออกแบบในโค้ดและผู้ออกแบบจำเป็นต้องวาดอินเทอร์เฟซที่ใช้งานง่ายซึ่งสะท้อนถึงคลาสข้อมูลของคุณ (โดยทั่วไปModelsและViewModels)

และโดยส่วนตัวแล้วฉันชอบพิมพ์ XAML ทั้งหมดด้วยมือเนื่องจากมันเร็วกว่าและไม่ทำให้ยุ่งมากเท่าที่นักออกแบบ WPF ลาก / วางแม้ว่าฉันจะใช้ Designer ในบางครั้งเพื่อดูตัวอย่าง UI ของฉัน ชอบ.

ดังนั้นสำหรับคำตอบของคุณเกี่ยวกับว่ามีนักออกแบบ WPF คนอื่นที่เหมาะกับนักพัฒนา WinForms หรือไม่ฉันขอแนะนำว่าแทนที่จะมองหานักออกแบบคนอื่นให้ดูที่จะเรียนรู้วิธีใช้ WPF ในแบบที่ควรจะใช้แทน การใช้ WPF เหมือนกับ WinForms หมายความว่าคุณพลาดสิ่งที่ทำให้มันยอดเยี่ยมมาก :)


14
เห็นด้วยอย่างยิ่งกับ @Rachel การตระหนักที่สำคัญที่สุดเมื่อเข้ามาใน WPF คือการเข้าใจว่าUI ไม่ใช่ข้อมูลและดำเนินการตามนั้น
Federico Berasategui

2
@Rachel - เพียงเพื่อเล่นผู้สนับสนุนของปีศาจ: เริ่มต้นด้วย UI (ปุ่มใดกล่องข้อความ ฯลฯ จะปรากฏในหน้าต่าง) ช่วยเน้นแอปพลิเคชันในสิ่งที่คุณต้องการทำ ส่วนที่เหลือเป็นเพียงรายละเอียดการใช้งานของวิธีที่คุณต้องการทำ
Asaf

3
@HighCore ดูที่stackoverflow.com/questions/982978/mvvm-for-winformsและคุณจะต้องยอมรับว่า Winforms เป็นเพียงส่วนประกอบ View / UI ซึ่งวัตถุทางธุรกิจสามารถผูกติดกับการควบคุมของผู้ใช้ โอเค: WPF เหมาะสำหรับ MVVM มากกว่า แต่อย่างไรก็ตาม Winforms ยังสามารถทำงานในรูปแบบการออกแบบดังกล่าวได้ และตามที่ Rachel กล่าวว่า "นั่นคือสิ่งที่ตรงกันข้ามกับ WinForms ที่คุณสร้างแอปพลิเคชันของคุณจากออบเจ็กต์ UI จากนั้นให้ข้อมูลที่จำเป็น" มันไม่จริงสำหรับแม้ว่า ฉันมักจะคิดว่าอย่างน้อย Data และ View ข้อมูลและ Winforms / WPF / HTML อะไรก็ได้
Bernoulli IT

2
สนับสนุนการเชื่อมโยงฐานข้อมูลอย่างน้อยในระดับการป้อน / แก้ไขข้อมูล และ 99.9999999% ของนักพัฒนาเหล่านั้นก็จะทำผิดพลาดใน WPF ที่ฉันสงสัย แต่ขอให้เราจบการสนทนานี้ WPF มีประสิทธิภาพมากขึ้น / เหมาะสำหรับ MVVM และแยกความกังวลออกจากกัน แต่ฉันคิดว่าคุณและ Rachel ผลัก Winforms ในมุมลบ โดยเฉพาะอย่างยิ่งเมื่อคุณใช้คำที่คุณใช้อยู่
เรื่อย ๆ

3
@YoupTube คุณพูดถูก Winforms รองรับการผูกข้อมูลและเป็นไปได้ที่จะสร้างการผูกแบบกำหนดเองของคุณเองสำหรับกรณีที่ระบบการผูกเริ่มต้นไม่ทำงานด้วย ฉันเขียนคำตอบนี้และบทความบล็อกของฉันโดยคำนึงถึงผู้เริ่มต้นและโดยทั่วไปแล้วผู้เริ่มต้นจะคิดในแง่ของส่วนประกอบ UI ไม่ใช่วัตถุข้อมูล นอกจากนี้การผูกใน WinForms ไม่ได้มีอยู่ในสถานะเสมอไปนักพัฒนาจำนวนมากที่เติบโตมากับ WinForms หรือผู้ที่คุ้นเคยกับเทคโนโลยีอื่น ๆ ที่ไม่ใช้การผูกมักจะไม่ระบุความแตกต่างที่สำคัญนี้เมื่อเปลี่ยน สู่สถาปัตยกรรมที่มีขอบเขต :)
Rachel

9

แม้ว่าบางคนจะไม่เห็นด้วย แต่ฉันก็ยินดีที่จะไม่ใช้ตัวออกแบบ VS อย่างน้อยก็ไม่ต้องสร้างอินเทอร์เฟซ หากคุณอาจต้องการสร้างความประทับใจแรกให้กับการติดตั้งโดยไม่ต้องเริ่มต้นแอปพลิเคชันคุณควรเป็นผู้ดูที่ดีอย่างน้อยตราบใดที่ไม่มีการใช้สิ่งที่ซับซ้อนเช่นStylesและTemplatesใช้ แต่ IMHO ผลการลากและวางควรใช้เป็นตัวต้นแบบเท่านั้นดังนั้นจึงถูกทิ้งหลังจากไม่จำเป็นอีกต่อไป

นี่คือเหตุผลบางประการที่สำคัญสำหรับฉันที่จะไม่ใช้มัน

  1. ตัวออกแบบ VS กำลังทำงานกับระยะขอบแก้ไขและการจัดแนว (ซึ่งโดยปกติไม่จำเป็นหากคุณใช้การควบคุมเค้าโครง) หมายความว่าคุณต้องสัมผัสตัวควบคุมหลาย ๆ ส่วนหากข้อกำหนดมีการเปลี่ยนแปลง หากคุณอยู่ใน XAML และกลไก WPF คุณสามารถสร้างแอปพลิเคชันที่สามารถแก้ไขได้โดยใช้ความพยายามเพียงเล็กน้อยเกี่ยวกับรูปลักษณ์

  2. เนื่องจากผู้ออกแบบกำลังสร้าง xaml องค์ประกอบจึงไม่เหมาะสมและ UI อาจทำงานได้ไม่ดี ฉันไม่ได้วัดมันเป็นแค่ความรู้สึก

ทางเลือกที่ดีกว่ามากคือ MS Blendแม้ว่าการเริ่มต้นจะเป็นอย่างอื่น แต่ก็ทำได้ง่าย ผลการลากและวางนั้นดีกว่ามากซึ่งเป็นผลมาจากตัวออกแบบ VS
แต่เป็นเครื่องมือที่มีประสิทธิภาพมากซึ่งช่วยให้คุณใช้องค์ประกอบที่มีประสิทธิภาพเพื่อสร้าง UI ที่ทันสมัย ฉันขอแนะนำให้ไปเยี่ยมชมอย่างน้อยเวิร์กช็อปสั้น ๆ เพื่อรับทราบถึงโอกาส

กลับไปที่คำถามของคุณ IMHO และผมคิดว่าหลายคนยอมรับรับตัวเองเป็นหนังสือที่ดีเช่นWPF Unleashedและต่อมาถ้าคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับรายละเอียด, WPF Pro มีคุณสมบัติมากมายที่แตกต่างWinformsจาก คุณจะไม่รู้จักพวกเขาโดยใช้นักออกแบบใด ๆ ฉันคิดว่านั่นเป็นแนวทางที่ดีที่สุด

โปรดพิจารณาด้วยว่ามีเฟรมเวิร์กและไลบรารีมากมาย (เช่นMVVM light , WPFToolkit ) ซึ่งกำลังแก้ปัญหาทั่วไปอยู่แล้ว ดังนั้นจึงไม่จำเป็นต้องสร้างล้อใหม่


9

ฉันรู้ว่านี่เป็นคำถามเก่า แต่เพื่อประโยชน์ของคนอื่นที่มองเรื่องนี้ฉันคิดว่าฉันควรจะปรับสมดุลสักหน่อย - อ่านคำตอบอื่น ๆ ฉันรู้สึกว่าบางส่วนของ 'ไม่ใช้ตัวออกแบบ' 'ความรู้สึกมาจากการใช้ไม่ถูกต้อง บทแนะนำนี้ค่อนข้างดีที่จะช่วยให้คุณดำเนินการต่อและตอบข้อวิพากษ์วิจารณ์บางส่วนในโพสต์อื่น ๆ

ตัวอย่างเช่นคุณสามารถเปลี่ยนจากเค้าโครงที่ใช้ระยะขอบเหมือน Winforms ซึ่งเป็นค่าเริ่มต้นเมื่อคุณวางการควบคุมเป็นรูปแบบ WPF-ish เพิ่มเติมโดยคลิกขวาและเลือก 'รีเซ็ตเค้าโครง'

วิดีโอนี้ครอบคลุมเนื้อหาที่คล้ายกัน

ฉันยังคงชอบนักออกแบบ VS2010 ในด้านความสมดุล - VS2013 ดูเหมือนจะมีปัญหาเล็กน้อยเมื่อลากและวางลงบน TabItems ** (ซึ่งโครงการปัจจุบันของฉันใช้มาก) - แต่มุมมองโครงร่างเอกสาร VS2013 ช่วยให้คุณย้ายสิ่งต่างๆไปรอบ ๆ ในมุมมองนั้นด้วย ซึ่งอาจเป็นบวกจริง

อย่างไรก็ตามเพื่อให้ได้ประโยชน์สูงสุดจาก WPF และ xaml คุณต้องมีความคล่องแคล่วพอสมควรทั้งในมุมมองนักออกแบบและมุมมอง xaml และสลับไปมาระหว่างกัน หากคุณไม่สนใจนักออกแบบคุณกำลังพลาดสิ่งที่สามารถช่วยคุณได้มาก

** แก้ไข - แม้ว่าสิ่งนี้จะได้รับการปรับปรุงในอัปเดต 3 สำหรับ VS 2013 และในตัวอย่าง VS14 จนถึงปัจจุบันฉันยังคงมีพฤติกรรมแปลก ๆ อยู่ตลอดเวลา


7

ก่อนอื่นใน WPF (XAML) ใน Visual Studio deisgner คุณควรใช้โค้ด xaml เพื่อสร้าง UI ของคุณและอย่าลากและวางที่คุณควบคุม! คุณต้องรักษารหัสของคุณให้สะอาด คุณสามารถใช้ Expression Blend เพื่อช่วยคุณได้โดยเน้นกราฟิกมากขึ้นด้วยการลากและวาง แต่ไม่ฟรี

ไม่ใช่ช่วงการเรียนรู้ที่ยิ่งใหญ่ แต่ฉันคิดว่าคุณควรเรียนรู้วิธีทำ xaml ด้วยมือแทนที่จะค้นหาทางเลือกอื่น


1
การลาก n-drop ไม่เป็นอันตรายแม้ว่าคุณจะชอบพิมพ์ แต่ก็ใช้ได้เช่นกัน การพิมพ์ด้วยตนเองไม่ใช่กุญแจสำคัญสำหรับ WPF
เดวิด

3
เมื่อคุณลากและวางใน WPF ฉันเห็นว่าบ่อยครั้งคุณมีระยะขอบมากถึง -1200 และสิ่งต่างๆเช่นนั้นไม่สมเหตุสมผลเลย ... ฉันทำด้วยมือมาโดยตลอดจะดีกว่าอย่างแน่นอน
mlemay

1
นี่คือนอกหัวข้อ ตรวจสอบให้แน่ใจว่าปัญหาของคุณเป็นเรื่องธรรมดาสำหรับทุกคนไม่ใช่ตัวคุณเองเท่านั้น นอกจากนี้คุณไม่สามารถพูดได้ว่าการลาก n-drop นั้นไม่ดีหากคุณมีปัญหา การพึ่งพานักออกแบบยังคงเป็นสิ่งที่จำเป็นและบางครั้งก็เป็นที่ชื่นชอบคุณอาจเห็นว่าสิ่งนี้เป็นเรื่องจริงหากคุณรู้ว่าทั้งนักออกแบบและนักพัฒนาสามารถแสดงออกอย่างไร
เดวิด

1
ใช่ถ้าคุณใช้การผสมผสานการแสดงออกโอเคคุณทำได้ แต่ฉันกำลังพูดอยู่ในสตูดิโอภาพ ...
mlemay

12
ฉันคิดว่าการให้คำแนะนำผู้ที่มาจาก Forms และการเริ่ม WPF เพื่อไม่ใช้ตัวออกแบบนั้นเป็นความคิดที่แย่มาก วิธีที่เร็วที่สุดในการทำความเข้าใจ XAML คือการใช้การลากและวางจากนั้นสังเกตโค้ด
Ucodia

7

ฉันเคยผ่านขั้นตอนนี้เหมือนที่คุณทำ หลังจากนั้นฉันก็สอนทุกคนใน บริษัท WPF ของฉัน มีบทเรียนสำคัญสองสามบทเรียนที่ฉันได้เรียนรู้และทุกคนที่ฉันรู้จักที่ทำงานกับ WPF

  1. หากคุณกำลังทำงานกับส่วนควบคุม UI ในโค้ดข้างหลัง .... แสดงว่าคุณทำผิด คุณไม่จำเป็นต้องจัดการกับส่วนควบคุม UI ในโค้ดที่อยู่เบื้องหลัง
  2. คุณไม่จำเป็นต้องใช้นักพัฒนาภาพในการคลิก คุณมีประสิทธิผลมากขึ้นโดยจัดการกับ XAML เท่านั้น ใช้ Copy / Paste อย่าวางใจในความสามารถในการพิมพ์ของคุณ จะช่วยประหยัดอาการปวดหัวได้มาก
  3. คิดว่า XAML เป็นเพียงหน้าต่างที่ซ่อนข้อมูล ในโค้ดด้านหลังคุณกำลังเปลี่ยนข้อมูล ใน XAML คุณกำลังกำหนดว่า UI จะตีความข้อมูลอย่างไร
  4. คอนเวอร์เตอร์น่าทึ่งมาก ทันทีที่คุณได้รับตัวแปลงจำนวนที่สำคัญผลผลิตของคุณจะพุ่งสูงขึ้นอย่างรวดเร็ว พวกเขาจะรับหน้าที่เป็นผู้ควบคุมเหตุการณ์จำนวนมหาศาลที่ซ่อนหรือปรับขนาดหรือสิ่งที่เคยเกี่ยวกับ UI

ทำให้การพัฒนา UI เป็นเรื่องสนุก โดยเฉพาะอย่างยิ่งเมื่อคุณพบว่ามันชอบเล่นกับกระบวนการ Asyc อย่างไร มันทำให้ปวดหัวมากมายที่เกิดจาก Winforms

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.