איך בוחרים בין WinForms,‏ WPF ו-WinUI - טבלת החלטה מהשטח

· עודכן בתאריך: · · WinForms, WPF, WinUI, ‏C#, פיתוח Windows, תכנון UI

קהל היעד: מפתחים שבונים יישומי שולחן עבודה ל-Windows ב-C#‏/‏.NET, ומי שקובע את הבחירה הטכנולוגית. הנחת יסוד: משתמשים ב-‏.NET הנוכחי (לא ב-.NET Framework), ופלטפורמת היעד היא Windows בלבד. איך לקרוא: אם רוצים רק את המסקנה, קראו פרקים 1 ו-3; אם רוצים לקבוע מדיניות הארכת חיים ליישום קיים, קראו פרק 7; אם רוצים את ההכרעה האחרונה, קראו פרק 8.

כשבונים יישום שולחן עבודה ל-Windows ב-C#‏/‏.NET, מה שמסתבך בכל פעם מחדש בלי רעש הוא הבחירה בין WinForms,‏ WPF ו-WinUI.

הדבר המסוכן כאן הוא בחירה מעורפלת כמו:

  • WinUI כי הוא הכי חדש
  • WinForms כי אליו הכי רגילים
  • WPF כי הוא נראה איפשהו באמצע
הסכנה שבבחירה מעורפלתתרשים המראה שבחירה מעורפלת כמו WinUI כי הוא חדש, WinForms כי אליו רגילים, ו-WPF כי הוא נראה באמצע, מסוכנת, ושבעבודה בפועל בוחנים לפי צירים ברורים יותר.WinUI כי הוא חדשבחירה מעורפלתWinForms כי אליו רגיליםWPF כי הוא נראה באמצעבעבודה בפועל בוחנים לפי צירים ברורים

איור 1: לא “חדש, מוכר או נראה באמצע” - בוחרים לפי צירים ברורים.

בעבודה בפועל, הצירים שצריך לבחון קצת יותר ברורים:

  • פיתוח חדש, או המשך של נכס קיים
  • האם המסך מבוסס טופסי קלט, או דורש כוח ביטוי
  • האם UI מודרני ואופייני ל-Windows הוא ערך המוצר עצמו
  • איך מטפלים בהפצה, עדכון והפעלה ארגונית
  • האם הצוות שייך לתרבות ה-Designer, או לתרבות XAML‏/‏MVVM

במאמר הזה נסדר את כל זה בטבלת החלטה אחת נוחה לצפייה. לצורך המאמר, WinUI מתייחס בעיקר ל-WinUI 3 + Windows App SDK.12

בנוסף, שלושתם ייעודיים כולם ל-Windows בלבד. אם macOS‏/‏Linux גם הם בתמונה, מדובר מלכתחילה בהגדרת בעיה אחרת.341

שלושתם ייעודיים ל-Windows בלבדתרשים המראה ש-WinForms, WPF ו-WinUI כולם ייעודיים ל-Windows בלבד, ושאם macOS או Linux גם הם בתמונה, מדובר בהגדרת בעיה אחרת לגמרי.WinFormsכולם ייעודיים ל-WindowsWPFWinUImacOS / Linux - הגדרת בעיה אחרת

איור 2: שלושתם ייעודיים ל-Windows, ופלטפורמות חוצות דורשות הגדרת בעיה אחרת.

1. המסקנה קודם (במשפט אחד)

בניסוח גס אבל שימושי בעבודה בפועל, הנה זה:

  • אם יש יישום WinForms קיים גדול, קודם כול בוחנים המשך עם WinForms
  • אם יש יישום WPF קיים גדול, קודם כול בוחנים המשך עם WPF
  • לכלי פנים-ארגוני חדש בקנה מידה קטן-בינוני, שמבוסס על פקדים סטנדרטיים ומסכי קלט ורוצים לבנות מהר, WinForms עדיין די חזק35
  • ליישום עסקי חדש בקנה מידה בינוני-גדול, עם הרבה מסכים, שרוצים לנצל בו כראוי data binding,‏ style,‏ template,‏ command ו-MVVM, WPF לרוב הבחירה הבטוחה ביותר467
  • למוצר חדש ייעודי ל-Windows, שבו UI מודרני של Windows,‏ Fluent וחוויית Windows עדכנית קשורים ישירות לערך המוצר, WinUI אפשרות טובה12
  • אם רוצים רק להשתמש בפיצ’רי Windows API עדכניים, WinUI אינו הכרחי. גם WPF‏/‏WinForms יכולים לשלב פיצ’רים של Windows App SDK28910
  • לבחור על סמך הנחה של “אפשר להכניס WinUI בהדרגה בהמשך” מסוכן במקצת. סיפור המעבר ההדרגתי מלוכלך יותר ממה שנדמה1011

בקיצור, זה בערך כך:

  1. אם יש נכסים קיימים גדולים, קודם כול משמרים את אותו קו
  2. בפיתוח חדש, לבניית טפסים סטנדרטיים מהר - WinForms
  3. בפיתוח חדש, ליישום עסקי ל-Windows שגדל לאורך זמן - WPF
  4. בפיתוח חדש, כש-UI מודרני של Windows הוא עצמו דרישה - WinUI
  5. אם רוצים רק Windows App SDK, לא עוברים ישר לגמרי ל-WinUI

בחירת framework היא לא רק בחירה בטכנולוגיית UI, אלא גם בחירה של הפצה, תפעול, עלות למידה ועלות מעבר. אם קובעים את זה רק לפי “חדש / ישן”, זה חוזר בהמשך כתכנון הפצה ועלות תחזוקה.

איך מגיעים למסקנהתרשים המראה שאם יש נכסים קיימים גדולים משמרים את אותו קו, ובפיתוח חדש בוחרים WinForms לטפסים סטנדרטיים, WPF ליישום עסקי שגדל לאורך זמן, ו-WinUI כש-UI מודרני הוא דרישה.כןלא, פיתוח חדשכןלאלאכןהאם יש נכסים קיימים גדוליםמשמרים את אותו קומבוסס טפסים סטנדרטייםWinFormsUI מודרני הוא דרישהWPF - יישום עסקי ארוך טווחWinUIאם רק SDK - לא עוברים לגמרי ל-WinUI

איור 3: לפי סדר נכסים קיימים, אופי המסך ודרישת UI מודרני, המסקנה כמעט נקבעת מאליה.

מפת הידע של המאמר

המאמר מסדר איך בוחרים בין WinForms,‏ WPF ו-WinUI לפי הציר של פיתוח חדש מול המשך נכסים קיימים, והאם המסך מבוסס טפסים סטנדרטיים או דורש כוח ביטוי. הוא ממליץ על WinForms ליישום עסקי המבוסס על פקדים סטנדרטיים, על WPF ליישום עסקי בינוני-גדול שמנצל data binding ו-MVVM, ועל WinUI למוצר חדש ייעודי ל-Windows שבו Fluent וחוויית Windows עדכנית קשורים ישירות לערך המוצר. ‏WinUI הוא חלק ה-UI framework בתוך Windows App SDK, ומניח כברירת מחדל חבילת MSIX ו-package identity, בעוד Windows App SDK עצמו אפשר להוסיף גם לנכסי WPF/WinForms קיימים - ולכן מעבר מלא של ה-UI אינו הכרחי. המאמר מזהיר שמעבר הדרגתי בעזרת XAML Islands צריך להיבדק בקטן לפני שהופך לאסטרטגיה הראשית.

מפת הידע של איך בוחרים בין WinForms,‏ WPF ו-WinUIתרשים המראה את הציר שלפיו WinForms,‏ WPF ו-WinUI מתאימים לפיתוח חדש או להמשך נכסים קיימים, את ההנחה של WinUI לגבי Windows App SDK,‏ MSIX ו-package identity, את הקשר בין MVVM ל-data binding, ואת נקודת הזהירות סביב מעבר הדרגתי עם XAML Islands.משתמש במשתמש במשתמש במחייבמשתמש במשתמש במממש אתמשתמש במשתמש במחייבמחייבמחייבאינו מתיישב עםמשתמש במשתמש במחייבשימוש לא מומלץ למענה מומלץ למענה מומלץ למענה מומלץ לצריך לקדום לצריך לקדום לצריך לקדום למשתמש בWindows FormsWPFWinUI(Windows App SDK)XAMLקישור נתונים (data binding)MVVM(Model-View-ViewModel)Windows App SDKMSIXpackage identity‏packaged שמצביע על מיקום חיצוני (sparse package)unpackaged appXAML Islandsמעבר הדרגתי ל-WinUI מתוך WPF/WinForms קיימיםיישום עסקי המבוסס על פקדים סטנדרטייםיישום עסקי בינוני עד גדול עם מסכים רביםממשק מוצר מודרני חדש ייעודי ל-WindowsFluent Design System

בתרשים, קו מלא מציין קשר שמתקיים תמיד וקו מקווקו מציין קשר מותנה (תנאי ההתקיימות מפורטים בהסבר של כל קשר בעמוד המפורט). רשימת כל הקשרים (סך הכול 24, עם אסמכתה ורמת ודאות) והגדרות המושגים המרכזיים מרוכזות בעמוד המפורט של מפת הידע (ביפנית). נתונים: JSON-LD / Turtle

2. שלוש הטכנולוגיות שהמאמר מתייחס אליהן

קודם כול, נאחד קצת מינוח. הקיצורים שיחזרו לאורך המאמר מפורטים כאן מראש.

מונח פירוש בגסות
XAML eXtensible Application Markup Language שפת markup מבוססת XML לכתיבה הצהרתית של מבנה המסך. משמשת את WPF ואת WinUI
Designer Windows Forms Designer פיצ’ר ב-Visual Studio לגרירת פקדים ובניית מסך. התוצאה נשמרת כקוד בקובץ *.Designer.cs
Data Binding קישור נתונים מנגנון שמקשר בין property של המסך ל-property בצד הנתונים, כך שכשאחד משתנה השני עוקב אחריו
MVVM Model-View-ViewModel תבנית תכנון שמפרידה בין המסך (View), המצב והפקודות של המסך (ViewModel), ולוגיקת העסק והנתונים (Model). ה-View וה-ViewModel מחוברים דרך Data Binding
Fluent Fluent Design System מערכת העיצוב של Microsoft שקובעת את המראה וההתנהגות של Windows 11. WinUI מניח אותה כברירת מחדל
Windows App SDK קבוצת ספריות הפיתוח העדכנית ל-Windows, כולל WinUI. יש בה גם פיצ’רים שאינם UI, וניתן להוסיף אותה גם ליישומים קיימים של WPF‏/‏WinForms‏/‏Win32
XAML Islands מנגנון להטמעת פקדי XAML חדשים בחלק בלבד מיישום קיים של WPF‏/‏WinForms‏/‏Win32. הרחבה בסעיף 5.3.3
MSIX פורמט חבילת האפליקציה של Windows. התקנה, עדכון והסרה מטופלים על ידי מנגנון מערכת ההפעלה
package identity זהות חבילה מצב שבו Windows יכול לזהות לאיזו חבילת אפליקציה שייך התהליך. חלק מפיצ’רי Windows, כמו התראות ושיוכי קבצים, לא עובדים בלעדיו
טכנולוגיה בגסות הציר החזק
WinForms ‏UI מסורתי של .NET ל-Windows, שקל לבנות בו טפסים מהר עם ה-Designer של Visual Studio בניית מסכים מהירה, פקדים סטנדרטיים, ניצול נכסים קיימים
WPF ‏UI ייעודי ל-Windows, שקל לבנות בו UI בעל כוח ביטוי בעזרת XAML,‏ data binding,‏ style,‏ template ו-command יישום עסקי בינוני-גדול, MVVM, קלות סידור המסכים
WinUI ‏UI מודרני ונייטיבי ל-Windows, מעל Windows App SDK Fluent, חוויית Windows עדכנית, DPI גבוה, UI מוצרי מודרני

‏WinForms מתואר גם ב-Microsoft Learn כ-framework עם פקדים, גרפיקה, data binding וקלט משתמש, שקל לבנות בו אפליקציה בעזרת ה-Designer של Visual Studio בגרירה-ושחרור.3

‏WPF הוא framework‏ UI בעל כוח ביטוי גבוה, הכולל ציור וקטורי בלתי-תלוי ברזולוציה,‏ XAML,‏ data binding,‏ style‏/‏template,‏ 2D‏/‏3D ואנימציה.4

‏WinUI, חלק מ-Windows App SDK, הוא framework‏ UI עדכני ל-Windows שמניח DPI גבוה, קלט מודרני, אנימציה חלקה וחוויית Fluent.12 יש לו גם מסלול רגיל של data binding‏/‏MVVM.12

חשוב לזכור כאן ש-Windows App SDK ו-WinUI אינם אותו דבר. ‏WinUI הוא חלק ה-UI‏ framework בתוך Windows App SDK, אבל את Windows App SDK עצמו אפשר להוסיף גם ליישומים קיימים של WPF‏/‏WinForms‏/‏Win32.210

לכן,

  • להשתמש ב-WinUI
  • להשתמש בפיצ’רים של Windows App SDK

הן החלטות דומות במראה, אבל נפרדות. אם דנים בזה כשהן מעורבבות, “האם להעביר את ה-UI” ו”האם להוסיף פיצ’רים” נדונים כאותו נושא, וקשה להגיע למסקנה.

Windows App SDK ו-WinUI אינם זהיםתרשים המראה ש-WinUI הוא חלק ה-UI framework בתוך Windows App SDK, ושאת Windows App SDK עצמו אפשר להוסיף גם ל-WPF, WinForms ו-Win32, ולכן ההחלטה על WinUI וההחלטה על פיצ'רי SDK נפרדות.Windows App SDKWinUI - חלק ה-UI frameworkניתן להוסיף ל-WPF/WinForms/Win32החלטה: 'להשתמש ב-WinUI'החלטה: 'להשתמש בפיצ'רי SDK'דומות אך נפרדות

איור 4: “להשתמש ב-WinUI” ו”להשתמש בפיצ’רים של Windows App SDK” הן החלטות נפרדות.

3. טבלת החלטה אחת לצפייה

קודם כול, הטבלה הכי שימושית לעבודה בפועל.

מצב הבחירה הראשונה סיבה
שיפוץ, הארכת חיים או עדכון ל-.NET של יישום WinForms קיים המשך WinForms קל לנצל מסכים קיימים, נכסי Designer ונכסי פקדים
שיפוץ, הארכת חיים או עדכון ל-.NET של יישום WPF קיים המשך WPF קל לנצל את ה-XAML, ה-Binding, ה-MVVM ומבנה המסכים כמות שהם
פיתוח חדש, כלי פנים-ארגוני, מסך הגדרות, מסך ניהול, מבוסס טופסי קלט WinForms פקדים סטנדרטיים במרכז - עלייה מהירה
פיתוח חדש, הרבה מסכים, מצב מורכב, רוצים style/template/MVVM WPF קל להפריד אחריות בין מסכים ולסדר את ה-UI
פיתוח חדש, UI מודרני ואופייני ל-Windows הוא עצמו הדרישה WinUI קל להתקרב ל-Fluent ולחוויית Windows עדכנית
להישאר עם WPF/WinForms קיימים ולהשתמש ב-Toast/Windowing/App Lifecycle וכדומה ה-framework הנוכחי + Windows App SDK לרוב אין צורך במעבר מלא של ה-UI כדי לקבל פיצ’רי Windows עדכניים
תלות כבדה ב-COM/ActiveX/פקדי צד שלישי ישנים קרוב ל-framework הקיים עלות מעבר התלות כבדה עוד לפני עניין ה-UI
מושפעים חזק משיקולי הפצה, עדכון והפעלה ארגונית לתת עדיפות ל-WPF/WinForms, ו-WinUI לבדוק תכנון הפצה מוקדם ב-WinUI צריך לבחון מוקדם את הנחות Windows App SDK/packaging
רוצים חוצה-פלטפורמות בעתיד לשקול מחדש כולל אפשרויות מעבר לשלושתם שלושתם ייעודיים ל-Windows בלבד

הטבלה הזו כמעט מספיקה, אבל נשארות שתי נקודות שקשה להחליט לגביהן.

  1. ביישום עסקי חדש ל-Windows, לאיזה מבין WinForms ו-WPF להתקרב
  2. כשיש WPF‏/‏WinForms קיימים, האם כדאי לעבור ל-WinUI

שתי הנקודות האלה קל יותר להכריע בהן תוך התבוננות בטבלת ההשוואה שבהמשך.

שתי הנקודות שנשארות אחרי טבלת ההחלטהתרשים המראה שגם עם טבלת החלטה אחת נשארות שתי שאלות - האם ליישום עסקי חדש להתקרב ל-WinForms או WPF, והאם לעבור ל-WinUI כשיש נכסים קיימים - וששתיהן נבחנות בטבלת ההשוואה הבאה.טבלת ההחלטהWinForms או WPF ליישום חדשהאם לעבור ל-WinUI כשיש נכסים קיימיםבוחנים בטבלת ההשוואה

איור 5: שתי הנקודות שנשארות אחרי הטבלה נבחנות בטבלת ההשוואה שבהמשך.

4. טבלת השוואה לפי היבטים

זו לא טבלת עליונות רשמית, אלא השוואה מוטה מאוד לעבודה בפועל.

היבט WinForms WPF WinUI
בניית טופס קלט קטן במהירות
כלי פנים-ארגוני שמבוסס פקדים סטנדרטיים △〜○
התאמה ל-data binding‏/‏MVVM ○〜◎
‏style‏/‏template וכוח ביטוי של המסך
קרבה לנכסי שולחן עבודה קיימים ב-Windows
אופי Windows מודרני
הארכת חיים ושיפוץ הדרגתי של מסכים קיימים
רוצים רק להוסיף פיצ’רי Windows App SDK
קלות תכנון ההפצה/עדכון/תפעול △〜○
בניית “UI מוצרי חדש וייעודי ל-Windows שגדל לאורך זמן”

הטריק בקריאה הוא לא מה הכי חזק, אלא מה הכי מעט מחכך.

לדוגמה, עבור:

  • כלי הגדרות פנים-ארגוני
  • מסך הגדרות מכשיר
  • רשימה, פירוט, חיפוש, הגדרות, כפתורים
  • יציבות תפעולית ומהירות שיפוץ חשובים יותר מהמראה

‏WinForms עדיין הגיוני לגמרי.

לעומת זאת, עבור:

  • הרבה מסכים
  • הרבה החלפות מצב תצוגה
  • רוצים להפריד בין View ללוגיקה
  • רוצים לקשר שינויי נתונים ל-UI בטבעיות
  • רוצים לשלוט ב-UI דרך style/template

‏WPF עובד היטב.67

ולבסוף, עבור:

  • רוצים להניח מראה אופייני ל-Windows 11
  • רוצים לנצל את Fluent כראוי
  • רוצים להניח DPI גבוה, מגע, ו-API חלונות מודרני
  • פיתוח חדש שבו הרושם של ה-UI כמוצר ייעודי ל-Windows חשוב

‏WinUI טבעי.12

בוחרים לפי כמות החיכוך הנמוכה ביותרתרשים המראה שהקריטריון הוא לא מה הכי חזק אלא מה הכי מעט מחכך, וש-WinForms טבעי לכלי פנים-ארגוני מבוסס פקדים, WPF להרבה מסכים עם MVVM, ו-WinUI כש-Fluent וחוויית Windows עדכנית הם הבסיס.מה הכי מעט מחכךכלי ארגוני - פקדים סטנדרטייםהרבה מסכים - רוצים MVVMFluent - חוויית Windows עדכניתWinFormsWPFWinUI

איור 6: לא “מה הכי חזק” אלא “מה הכי מעט מחכך” - כך מחלקים בין השלושה.

4.1 לראות את “הפער בכוח הביטוי” בקוד מינימלי

השורה “התאמה ל-data binding‏/‏MVVM” בטבלה למעלה קשה לתפוס במילים בלבד. לכן נציג זה לצד זה, בקוד מינימלי, מה משתנה כשכותבים את אותו מסך ב-WinForms וב-WPF.

נבנה מסך עם “תיבת טקסט אחת וכפתור שמירה אחד” בלבד.

WinForms: ה-Designer מייצר *.Designer.cs, וב-event handler שולפים את הערך מהמסך.

// MainForm.Designer.cs — הצד שמייצר ה-Designer. לא כותבים כאן ידנית
private System.Windows.Forms.TextBox nameTextBox;
private System.Windows.Forms.Button saveButton;

private void InitializeComponent()
{
    this.nameTextBox = new System.Windows.Forms.TextBox();
    this.saveButton = new System.Windows.Forms.Button();
    this.SuspendLayout();

    this.nameTextBox.Location = new System.Drawing.Point(12, 12);
    this.nameTextBox.Size = new System.Drawing.Size(200, 23);

    this.saveButton.Location = new System.Drawing.Point(218, 12);
    this.saveButton.Size = new System.Drawing.Size(75, 23);
    this.saveButton.Text = "保存";
    this.saveButton.Click += new System.EventHandler(this.SaveButton_Click);

    this.Controls.Add(this.nameTextBox);
    this.Controls.Add(this.saveButton);
    this.ResumeLayout(false);
}
// MainForm.cs — הצד שכותבים ידנית
public partial class MainForm : Form
{
    private readonly EditorService _service;

    public MainForm(EditorService service)
    {
        _service = service;
        InitializeComponent();
    }

    private void SaveButton_Click(object sender, EventArgs e)
    {
        // שולפים את הערך ישירות מהפקד של המסך ומעבירים אותו
        _service.Save(this.nameTextBox.Text);
    }
}

WPF: ב-XAML כותבים רק “עם מה זה מחובר”, וה-Binding מטפל בהכנסה ובהוצאה של הערך.

<!-- MainWindow.xaml -->
<Window x:Class="MyApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="編集" Width="360" Height="120">
    <StackPanel Orientation="Horizontal" Margin="12">
        <TextBox Width="200"
                 Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" />
        <Button Width="75" Margin="6,0,0,0" Content="保存"
                Command="{Binding SaveCommand}" />
    </StackPanel>
</Window>
// MainWindow.xaml.cs — אם שוכחים להעביר DataContext, ה-Binding לא עושה כלום
public partial class MainWindow : Window
{
    public MainWindow(EditorService service)
    {
        InitializeComponent();
        this.DataContext = new MainViewModel(service);
    }
}
// MainViewModel.cs — הצד שלא מכיר את המסך. אפשר לכתוב כאן גם unit test
public sealed class MainViewModel : INotifyPropertyChanged
{
    private readonly EditorService _service;
    private string _name = string.Empty;

    public MainViewModel(EditorService service)
    {
        _service = service;
        SaveCommand = new RelayCommand(() => _service.Save(Name));
    }

    public string Name
    {
        get => _name;
        set
        {
            if (_name == value) return;
            _name = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Name)));
        }
    }

    public ICommand SaveCommand { get; }

    public event PropertyChangedEventHandler PropertyChanged;
}

RelayCommand הוא class קטן שמממש ICommand, נמצא גם בספריות כמו CommunityToolkit.Mvvm, וגם אפשר לכתוב אותו בעצמכם בכ-20 שורות.

אם סופרים רק שורות, ל-WPF יש יותר. ההבדל האמיתי מתחיל מכאן.

  WinForms WPF
היכן שולפים ערך מהמסך קוראים ישירות nameTextBox.Text בתוך ה-event handler ‏property בשם Name. לא נוגעים ב-View
בדיקת יחידה לפעולת השמירה צריך להקים Form אפשר ליצור MainViewModel ישירות עם new ולקרוא לו
הצגת אותו שדה קלט במסך נוסף ממקמים מחדש את הפקד, וכותבים מחדש גם את ה-handler מציבים View אחר על אותו ViewModel
אחידות מראה בכל המסכים מיישרים כל property של כל פקד בנפרד ‏Style‏/‏Template במקום אחד

אם יש 3 מסכים, WinForms מהיר יותר; אם יש 30 מסכים, WPF קליל יותר - זו המשמעות המעשית של ההבדל.

ההבדל בזרימת הערךתרשים המראה שב-WinForms ה-event handler שולף ערך ישירות מהפקד ומעביר לשירות, ואילו ב-WPF ה-Binding מחבר בין ה-View ל-ViewModel, וה-ViewModel שלא מכיר את המסך קורא לשירות.WPFWinFormsBindingXAML של ה-ViewViewModelקורא לשירותevent handlerפקד ב-Viewקורא ישירות לשירות3 מסכים - מהיר30 מסכים - עדיין קליל

איור 7: ב-WinForms שולפים ערך ישירות, וב-WPF ה-Binding מעביר את התפקיד ל-ViewModel.

5. לאיזה סוג פרויקט כל אחד מתאים

5.1 WinForms

‏WinForms נוטה לזכות בזלזול לא הוגן, אבל בנקודה אחת - בניית מסכים עסקיים מהירה, מבוססת פקדים סטנדרטיים - הוא עדיין לא זניח.35

הוא מתאים במיוחד לפרויקטים כמו:

  • כלי הגדרות פנים-ארגוני
  • מסכי הגדרות למכשירים, מכשירי מדידה וכלי ניטור
  • מסכי ניהול, מסכי חיפוש, רשימה + פירוט
  • פרויקטים עם נכסי WinForms קיימים גדולים
  • צוותים עם תרבות חזקה של בניית מסכים ב-Designer

היתרון של WinForms הוא שאפשר להגיע למסך קרוב למוצר מוגמר בקצב סביר, בלי להביא אידיאולוגיה מסובכת. טופס, כפתור, תווית, תיבת טקסט, data grid. אם זו זירת המשחק, WinForms מסוגל להתחרות היטב.

עם זאת, החולשות ברורות:

  • רוצים אחידות מראה גדולה בכל המסכים
  • רוצים לשלוט ב-UI דרך style ו-template
  • רוצים לטפל בשינויי מצב מורכבים בעיקר דרך data binding
  • רוצים להפריד יפה את הלוגיקה של המסך

בנקודות האלה, WPF או WinUI פשוטים יותר.

בבניית יישום גדול עם WinForms, בלי תשומת לב זה בקלות הופך לג’ונגל של event handlers. לכן, אם בוחרים ב-WinForms, כדאי לקבוע מראש לפחות:

  • לשמור על אחריות קטנה לכל מסך
  • להפריד ביחידות UserControl
  • להיות מודעים לגבול מקביל ל-Presenter‏/‏ViewModel
  • לא לכתוב לוגיקה עסקית ישירות בתוך אירועי המסך
להימנע מג'ונגל event handlersתרשים המראה שיישום WinForms גדול הופך בקלות לג'ונגל של event handlers, ולכן כדאי לקבוע מראש לשמור על אחריות קטנה למסך, להפריד ביחידות UserControl, ולהיות מודעים לגבול Presenter/ViewModel.יישום WinForms גדולהופך בקלות לג'ונגל handlersלשמור אחריות קטנה למסךלהפריד ביחידות UserControlלהיות מודעים לגבוללא לכתוב לוגיקה עסקית באירועי מסך

איור 8: יישום WinForms גדול נשאר שקט אם קובעים מראש כללי הפרדת אחריות.

עוד דבר חשוב מאוד בעבודה בפועל: גם אם רוצים להשתמש ב-Windows App SDK, אין צורך לזרוק את WinForms. גם רשמית קיים מסלול להוסיף פיצ’רי Windows App SDK ליישום WinForms קיים.910

כלומר, אפשר לבחור ב-WinForms כך ש-

  • ה-UI נשאר כמות שהוא
  • רק פיצ’רי Windows הדרושים מתמדרנים

וזה נקודת נחיתה ריאלית.

לתמדרן בלי לזרוק את WinFormsתרשים המראה שהרצון להשתמש ב-Windows App SDK אינו מחייב לזרוק את WinForms, ושיש נקודת נחיתה ריאלית שבה ה-UI נשאר כמות שהוא ורק הפיצ'רים הדרושים מתמדרנים.רוצים Windows App SDKאין צורך לזרוק WinFormsה-UI נשאר כמות שהואמתמדרנים רק הפיצ'רים הדרושיםנקודת נחיתה ריאלית

איור 9: אפשר לשמר את ה-UI של WinForms ולתמדרן רק את הפיצ’רים הדרושים של Windows.

5.2 WPF

‏WPF, כשמסתכלים עליו כ-UI‏‏ ‏.NET לשולחן העבודה של Windows, הוא הליבה המאוזנת ביותר.4

היתרונות ברורים:

  • אפשר לכתוב מסך הצהרתית ב-XAML
  • ‏Data Binding חזק
  • אפשר להשתמש ב-Style‏/‏Template
  • אפשר להשתמש ב-Command
  • קל להפריד בין View ללוגיקה
  • קל לסדר מסכים בקנה מידה בינוני-גדול

גם בתיעוד הרשמי של WPF, data binding מתואר כפיצ’ר מרכזי, וה-command מסודר כמנגנון שמפריד בין קלט ללוגיקת הביצוע.67

לכן, הוא מתאים לפרויקטים כמו:

  • יישום עסקי עם הרבה מסכים
  • הרבה תצוגות רשימה, פירוט, עריכה, חיפוש ומצב
  • יישום Windows שכמה אנשים מתחזקים לאורך זמן
  • רוצים להפריד בין View ללוגיקה
  • רוצים להפריד מראש בין אחריות המראה לאחריות ההתנהגות, לקראת שיפוצים עתידיים
  • ‏WinForms נראה כמו שיהפוך למסך כבד מהר

כשמתלבטים ביישום עסקי חדש ייעודי ל-Windows, ‏WPF עדיין המועמד הראשון הבטוח. לפסול אותו כי “הוא ישן” זה קצת גס.

המועמד הראשון הבטוח ליישום עסקי חדשתרשים המראה שביישום עסקי בינוני-גדול ל-Windows עם הרבה מסכים, שרוצים להפריד View מלוגיקה ומתוחזק לאורך זמן על ידי כמה אנשים, WPF עדיין המועמד הראשון הבטוח.יישום עסקי עם הרבה מסכיםWPF - המועמד הראשון הבטוחרוצים להפריד View מלוגיקהתחזוקה ארוכת טווח על ידי כמה אנשיםלפסול כי 'ישן' זה גס

איור 10: ביישום עסקי חדש עם הרבה מסכים ותחזוקה ארוכת טווח, WPF עדיין הבחירה הבטוחה.

ולמעשה, כש-

  • יש נכסי WPF קיימים
  • יש ידע קיים ב-XAML‏/‏MVVM
  • לא ‏Fluent הוא הראשון בעדיפות
  • אבל רוצים לתכנן UI יפה יותר מ-WinForms

‏WPF לרוב הבחירה ההגיונית ביותר.

כמובן שגם ל-WPF יש מוזרויות:

  • ‏XAML מסובך מדי הופך לקשה לקריאה
  • יותר מדי פקדים או תבניות מותאמות אישית מכבידים על התחזוקה
  • מדיניות “לפתור הכול עם Binding” יכולה להקשות דווקא על מעקב אחר זרימת העיבוד

הבעיות האלה קיימות, אבל זה לא ש-WPF רע - זה יותר שכלי בעל כוח ביטוי, אם משתמשים בו ברשלנות, גם התגובה שלו חזקה יותר.

גם ב-WPF אפשר להוסיף חלק מהפיצ’רים של Windows App SDK. כלומר, יש דרך לתמדרן פיצ’רי Windows בזמן שנשארים עם WPF.810

לכן, לרוב, בעבודה בפועל מנצחת הגישה של

  • להתקרב ל-‏.NET הנוכחי עם WPF
  • להוסיף רק את פיצ’רי Windows הדרושים דרך Windows App SDK
  • לסדר מחדש את המבנה החל מהפיצ’רים הגדולים החדשים

יותר מ-

  • לזרוק את כל ה-WPF ולעבור לגמרי ל-WinUI
הדרגתיות מנצחת מעבר מלאתרשים המראה שבמקום לזרוק את WPF ולעבור לגמרי ל-WinUI, עדיף להתקרב ל-.NET הנוכחי, להוסיף רק פיצ'רים דרושים דרך Windows App SDK, ולסדר מחדש החל מהפיצ'רים הגדולים החדשים.WPF מתקרב ל-.NET הנוכחימוסיפים רק פיצ'רים דרושים דרך SDKמסדרים מחדש מהפיצ'רים הגדולים החדשיםמנצח לרוב מעל מעבר מלא

איור 11: במקום מעבר מלא, להתקרב ל-‏.NET הנוכחי ולהוסיף פיצ’רים בהדרגה - זו הדרך שמנצחת יותר.

5.3 WinUI

‏WinUI הוא הבחירה המודרנית העיקרית לבניית יישום חדש ייעודי ל-Windows.12

באופן רשמי הוא ממוקם כך:

  • מותאם לחומרה ולקלט העדכניים ביותר
  • ‏DPI גבוה
  • אנימציה חלקה
  • חלק מ-Windows App SDK

1

לכן הוא מתאים לפרויקטים כמו:

  • מוצר חדש ייעודי ל-Windows
  • הרושם או החוויה של ה-UI עצמם חשובים
  • רוצים לנצל את Fluent בטבעיות
  • רוצים להתקרב למצב הנוכחי של Windows 11
  • רוצים להניח API חלונות חדש וחוויית Windows עדכנית

פרויקט שיש בו סיבה אמיתית לבחור ב-WinUI הוא לרוב לא פרויקט של “המראה חדש”, אלא של “רוצים לשלב את חוויית ה-Windows הנוכחית במוצר”.

איך מזהים סיבה אמיתית לבחור ב-WinUIתרשים המראה שפרויקט עם סיבה אמיתית לבחור ב-WinUI הוא לא "המראה חדש" אלא "רוצים לשלב את חוויית ה-Windows הנוכחית במוצר" - מוצר חדש ייעודי ל-Windows שבו הרושם של ה-UI חשוב.פרויקט עם סיבה אמיתית ל-WinUIלא 'המראה חדש'אלא 'חוויית Windows הנוכחית במוצר'מוצר חדש ייעודי ל-Windows, הרושם חשוב

איור 12: הסיבה האמיתית לבחור ב-WinUI היא לא “חדש” אלא “לשלב את חוויית Windows הנוכחית”.

מצד שני, יש גם נקודות זהירות.

5.3.1 WinUI הוא לא “סתם WPF חדש”

מכיוון שהוא משתמש ב-XAML הוא נראה קרוב, אבל -

  • ה-API הבסיסי
  • סביבת הפקדים
  • מבנה הפרויקט
  • הגישה ל-deploy‏/‏packaging
  • היחס ל-Windows App SDK

שונים.

כלומר, קצת מסוכן לחשוב עליו כתחליף קליל ל-WPF.

WinUI אינו סתם WPF חדשתרשים המראה שהשימוש המשותף ב-XAML גורם ל-WinUI להיראות קרוב ל-WPF, אך ה-API הבסיסי, הפקדים, מבנה הפרויקט, ה-packaging והיחס ל-Windows App SDK שונים, ומסוכן לראות בו תחליף קליל.שימוש משותף ב-XAMLאבל הרבה שונהAPI בסיסי ופקדיםמבנה ו-packagingהיחס ל-SDKמסוכן לראות בו תחליף קליל

איור 13: למרות ה-XAML המשותף, WinUI אינו תחליף קליל ל-WPF.

5.3.2 בבחירת WinUI, נושא ההפצה קופץ קדימה

ליישום WinUI 3, packaged הוא ברירת המחדל. מצד שני, Windows App SDK עצמו מטפל גם ב-packaged וגם ב-unpackaged.13142

כאן חשוב להחליט מוקדם על:

  • איך מפיצים
  • איך מכניסים את ה-runtime
  • האם דרוש package identity
  • הפצה פנים-ארגונית, Store,‏ MSIX, או מסלול EXE‏/‏MSI קיים

אבל “להחליט מוקדם” בלבד לא אומר מה בדיוק לבדוק, אז הנה תוכן הבדיקה.

קודם כול, יש שני צירים לקבוע.1315

  • packaging: האם לאפליקציה יש package identity
  • runtime: להשתמש ב-Windows App SDK כ-framework-dependent, או לצרף אותו כ-self-contained
שני הצירים שקובעים קודםתרשים המראה שבתכנון ההפצה של WinUI קובעים קודם שני צירים - ציר ה-packaging, האם לאפליקציה package identity, וציר ה-runtime, האם Windows App SDK כ-framework-dependent או self-contained.תכנון ההפצהציר ה-packagingציר ה-runtimeהאם יש package identityframework-dependent או self-contained

איור 14: בתכנון ההפצה קובעים קודם שני צירים - packaging ו-runtime.

יש שלוש אפשרויות בצד ה-packaging.13

מודל package identity מתקין מתאים ל-
‏packaged‏ (MSIX) יש ‏MSIX מחליף את המתקין פיתוח חדש, פרסום ב-Store, הפצה ארגונית כמו Intune
‏packaged שמצביע על מיקום חיצוני (sparse package) יש משתמשים במתקין הקיים כמות שהוא ‏Win32‏/‏WPF‏/‏WinForms קיימים עם מתקין עצמאי
‏unpackaged אין ‏MSI‏/‏EXE‏/‏xcopy כלי פנים-ארגוני, Win32 מסורתי בהפצה רחבה

אחר כך, קובעים אם דרוש package identity מצד הפיצ’רים. פיצ’רים שרשמית מוגדר עבורם “לא עובד בלי package identity” הם, לדוגמה, אלה:13

  • ‏background task
  • התראות push‏ (WNS)
  • ‏share target
  • הרחבת תפריט הקשר של Explorer
  • שיוך סוגי קבצים וסכימות URI
  • ‏startup task
  • ‏App Service
  • ‏Windows AI API

סדר הבדיקה הבא מעשי בעבודה בפועל.

  1. לצאת מהדרישות. האם מתוכננים לשמש פיצ’רים מהרשימה למעלה? אם אפילו אחד, נדרש הצד ה-packaged.
  2. לבדוק אם אפשר לוותר על המתקין הקיים. אם לא רוצים לוותר, התשובה היא לא מעבר מלא ל-MSIX אלא packaged שמצביע על מיקום חיצוני. פריסת הבינארי הקיימת ומנגנון העדכון נשארים כמות שהם, ומוסיפים רק את ה-identity.13
  3. לבדוק בזמן ריצה. ניתן לקבוע אם לתהליך הרץ יש identity באמצעות GetCurrentPackageFullName. אם אין identity, מוחזר APPMODEL_ERROR_NO_PACKAGE. להפך, אם קוראים ל-Windows API ומקבלים E_ILLEGAL_METHOD_CALL או APPMODEL_ERROR_NO_PACKAGE, זה סימן שנתקעים בדרישת package identity.13
  4. לבדוק בצד המכשיר. אפשר לרשום את החבילות המותקנות באמצעות Get-AppxPackage ב-PowerShell.
  5. לבסוף, לקבוע את ה-runtime. אם רוצים להפיץ ב-xcopy או zip - self-contained; אם יוצאים ל-Store - framework-dependent הוא המסלול המוגדר כברירת מחדל.15

גם ב-WinForms‏/‏WPF ההפצה חשובה, אבל ב-WinUI זה נוטה לקפוץ קדימה. ליישום WinUI 3 חדש packaged הוא ברירת המחדל, ולכן אם לא קובעים כלום, זה עולה אוטומטית על מסלול MSIX.13 זה המקום המעט מסובך בעולם הזה - חשבתם שהחלטתם על UI, אבל בפועל החלטתם על אסטרטגיית הפצה.

הליך בדיקת package identityתרשים המראה חמישה שלבים - לצאת מהדרישות, לבדוק אם אפשר לוותר על המתקין הקיים, לבדוק בזמן ריצה, לבדוק בצד המכשיר, ולבסוף לקבוע את ה-runtime.1. לצאת מהדרישות2. לבדוק אם אפשר לוותר על המתקין3. לבדוק בזמן ריצה4. לבדוק בצד המכשיר5. לקבוע את ה-runtimeאם לא רוצים לוותר - packaged למיקום חיצוניקביעה לפי GetCurrentPackageFullName

איור 15: את הצורך ב-package identity בודקים לפי דרישות, מתקין, זמן ריצה ומכשיר.

5.3.3 “לערבב WinUI בהדרגה לתוך WPF/WinForms קיימים” - קודם מנסים

כאן קל שהציפיות מתנפחות. אבל גם ב-FAQ‏ של Microsoft כתוב שברוח הדברים, אלא אם ה-UI framework מוכן לעבור מעבר מלא, לרוב אי אפשר להשתמש ב-WinUI. גם סביב XAML Islands, בעוד התיעוד הרשמי מציג מסלול הטמעה ליישומי שולחן עבודה קיימים, הערות השחרור של Windows App SDK 1.4 אומרות שנכון לעכשיו הבדיקה מתמקדת בעיקר ביישומי C++, ואין רכיבי wrapper נוחים ל-WPF‏/‏WinForms.1011

כלומר,

  • “נראה שאפשר מעבר הדרגתי”
  • “נראה שאפשר למלא בהדרגה”

הם רעיונות מושכים, אבל עדיף לבדוק קטן קודם, לפני שהופכים אותם לאסטרטגיה הראשית של הפרויקט.

‏WinUI הוא הבחירה ההגיונית ביותר כאשר -

  • מתחילים מחדש
  • בונים חוויה כמוצר ייעודי ל-Windows

לעומת זאת, כפתרון קליטה למעבר מלא מ-WPF‏/‏WinForms קיימים, דרושים סיבה ובדיקה.

לבדוק לפני שהופכים לאסטרטגיה ראשיתתרשים המראה שהרעיון לערבב WinUI בהדרגה מושך, אך ה-FAQ מניח מעבר מלא, ואין רכיבי wrapper נוחים ל-WPF ו-WinForms, ולכן בודקים קטן לפני שהופכים את זה לאסטרטגיה הראשית.רוצים לערבב WinUI בהדרגהרעיון מושךה-FAQ מניח מעבר מלאאין wrapper נוח ל-WPF/WinFormsבודקים קטן לפני אסטרטגיה ראשית

איור 16: “לערבב WinUI בהדרגה” - בודקים קטן לפני שזה הופך לאסטרטגיה הראשית.

6. טעויות שיקול דעת נפוצות

6.1 “כי הוא הכי חדש - WinUI”

זה מובן, אבל מסוכן למדי.

עדיף לבחון סיבה לבחירת טכנולוגיה חדשה לפי האם יש ערך שאי אפשר להשיג בלי הטכנולוגיה הזו.

  • האם חוויית Windows מודרנית היא ערך המוצר
  • רוצים לנצל את Fluent בטבעיות
  • זה מוצר חדש
  • אפשר לקבל את הנחות ההפצה/תפעול

אם התשובה כאן “כן”, WinUI אפשרות טובה. לעומת זאת, אם זה רק “נראה שיש לו עתיד”, ההסבר לעלות חלש.

לא "כי הוא חדש" אלא לפי ערךתרשים המראה שסיבה לבחירת טכנולוגיה חדשה צריכה להיבחן לפי ערך שאי אפשר להשיג בלעדיה, ואם התשובה כן WinUI אפשרות טובה, ואם רק "נראה שיש עתיד" ההסבר לעלות חלש.כןרק 'נראה שיש עתיד'סיבה לבחירת טכנולוגיה חדשהיש ערך שלא ניתן בלעדיהWinUI אפשרות טובהההסבר לעלות חלש

איור 17: לא “כי הוא הכי חדש” - בוחרים לפי ערך שאי אפשר להשיג בלי הטכנולוגיה.

6.2 “רוצים Windows App SDK, אז חייבים WinUI”

קל לטעות כאן, אבל זה לא נכון.

את Windows App SDK אפשר להוסיף גם ל-WPF‏/‏WinForms קיימים. גם ב-FAQ הרשמי מוסבר שיישומי WPF‏/‏MFC‏/‏WinForms יכולים להשתמש ב-API‏-ים של Windows App SDK שאינם קשורים ל-WinUI.1089

לדוגמה, פיצ’רים כמו

  • ‏App Lifecycle
  • ‏Windowing
  • ‏Toast Notifications

אפשר לפעמים לשלב תוך שמירה על ה-UI הנוכחי.10

6.3 “WPF/WinForms כבר גמורים”

גם כאן עדיף שלא לפסול בקלות.

גם WinForms וגם WPF ממשיכים לקבל תיעוד ומסלולי הגירה על גבי ‏.NET‏ הנוכחי, ומטופלים רשמית כ-UI פעיל של שולחן העבודה ב-Windows.34

כמדד לתחזוקה ארוכת טווח, האם ממשיכים להיכנס פיצ’רים חדשים הוא אינדיקטור ברור יותר מ”האם התיעוד עדיין קיים”. מנקודת מבט זו, המצב של שלושתם נראה כך:

  פעילות אחרונה איך לקרוא
WPF ב-.NET 9 נוסף ערכת נושא Fluent ל-Windows 11, ואפשר להחליף light/dark/system דרך property בשם ThemeMode. יש גם תמיכה בצבע ההדגשה (accent color) של Windows16 הנימוק “המראה ישן אז WinUI” נחלש לעומת קודם
WinForms ב-.NET 9 נכנסה תמיכה זמנית ב-dark mode, שאפשר להחליף דרך Application.SetColorMode. עם זאת, זהו פיצ’ר ניסיוני, ותמיכה רשמית מתוכננת ל-.NET 10. גם ה-API-ים לתמיכה אסינכרונית התרבו17 נכנסים פיצ’רים חדשים, אבל מעורבים בהם כאלה עם דגל ניסיוני
WinUI / Windows App SDK ממשיך להתעדכן במחזור שחרור עצמאי, נפרד מ-.NET18 העדכונים פעילים, אבל מכיוון שצריך לעקוב אחריהם בנפרד מגרסת .NET, נוסף פריט אחד לתוכנית התחזוקה

כלומר, מנקודת מבט של תחזוקה ארוכת טווח, אפשר לקרוא את זה כך:

  • ‏WPF ו-WinForms אינם “קפואים ונטושים” - הם מקבלים פיצ’רים בכל שחרור שנתי של .NET. עם זאת, לחלק מהפיצ’רים המרכזיים של WinForms יש שלב ניסיוני, אז צריך לבדוק את תזמון האימוץ.
  • בבחירת WinUI, מנהלים בנפרד את תאריך התמיכה של .NET ואת תאריך התמיכה של Windows App SDK. בפרויקטים ארוכי טווח, זה משפיע בלי רעש.
  • לא משנה מה בוחרים, אין ערובה ל”עובד ללא שינויים גם בעוד 10 שנים”, אז עדיף לקבוע מראש עד איזו גרסה עוקבים.
איך קוראים תחזוקה ארוכת טווחתרשים המראה ש-WPF ו-WinForms מקבלים פיצ'רים עם כל שחרור שנתי של .NET, ושבבחירת WinUI מנהלים בנפרד את תאריכי התמיכה של .NET ושל Windows App SDK, ולכן קובעים מראש עד איזו גרסה עוקבים.WPF / WinFormsפיצ'רים נכנסים עם שחרור .NETWinUIמנהלים בנפרד תאריכי תמיכה SDKקובעים מראש עד איזו גרסה עוקבים

איור 18: בתחזוקה ארוכת טווח בודקים מה מוביל את העדכונים, וקובעים מראש עד לאן עוקבים.

במיוחד ביישומים עסקיים, לרוב

  • נכסים קיימים
  • פקדי צד שלישי
  • מספר המסכים
  • דוחות והדפסה
  • חיבור למכשירים
  • הליכי הפצה

שוקלים יותר מחדשנות ה-UI‏ framework.

6.4 “אם כבר, כתיבה מחדש מלאה”

כתיבה מחדש מלאה קרובה יותר להחלטה עסקית מאשר לבחירה טכנולוגית.

אם יש יישום קיים, הדברים שכדאי לבדוק ראשונים הם אלה:

  1. מה באמת מטריד
  2. האם זו בעיית UI, או בעיית ארכיטקטורה
  3. האם ה-DLL/COM/OCX התלויים, הדוחות וההפצה הם באמת הנטל האמיתי
  4. האם אפשר לפתור את הבעיה בלי לשנות את כל ה-UI

כתיבה מחדש ל-UI מרשימה, אבל גם העלות שלה מרשימה. ומעל לכך, גם אם המראה מתחדש, המורכבות הסובבת נשארת לרוב כמות שהיא.

ארבע שאלות לפני כתיבה מחדש מלאהתרשים המראה שכתיבה מחדש מלאה קרובה להחלטה עסקית, ולכן בודקים קודם מה באמת מטריד, האם זו בעיית UI או ארכיטקטורה, האם התלות וההפצה הם הנטל האמיתי, והאם אפשר לפתור בלי לשנות את כל ה-UI.1. מה באמת מטריד2. UI או ארכיטקטורה3. תלות והפצה - הנטל האמיתי?4. אפשר לפתור בלי לשנות UI?גם לכתיבה מחדש עלות מרשימה

איור 19: לפני כתיבה מחדש מלאה, בודקים בארבע שאלות מה באמת מטריד.

6.5 “אחר כך אפשר לפתור עם XAML Islands”

אפשר להבין את הציפייה הזו. אבל בטוח יותר לא להתייחס אליה כסירת הצלה מלכתחילה.1011

לפני מעבר הדרגתי, כדאי לבדוק קטן קודם:

  • אילו פקדים רוצים להטמיע
  • מה קורה עם focus, קלט, DPI ותמה
  • האם תצורת ה-host הזו יציבה בפועל
בודקים XAML Islands קטן מראשתרשים המראה שבמעבר הדרגתי בודקים מראש קטן אילו פקדים רוצים להטמיע, מה קורה עם focus, קלט, DPI ותמה, והאם תצורת ה-host יציבה, ולא מתייחסים לזה כסירת הצלה מלכתחילה.הציפייה 'אחר כך יסתדר'אילו פקדים להטמיעfocus, קלט, DPI, תמההאם תצורת ה-host יציבהבודקים קטן מראש

איור 20: את XAML Islands בודקים קטן מראש, ולא מתייחסים אליו כסירת הצלה.

7. נקודת המבט כשמניחים יישום קיים

כאן, הקיים חשוב יותר מהחדש.

7.1 אם יש WinForms קיים

קודם, לפני שקופצים ישר ל-WinUI, בודקים את אלה:

  • אפשר להתקרב ל-.NET הנוכחי
  • דרוש מעבר ל-64bit
  • אפשר לסדר async/await, טיפול בחריגות, הגדרות ולוגים
  • אפשר להעלות תחזוקתיות דרך פיצול מסכים או המרה ל-UserControl
  • אפשר להוסיף רק את פיצ’רי Windows הדרושים דרך Windows App SDK

לא נדיר שמה שנראה כבעיית WinForms הוא בפועל רק

  • ערבוב בין המסך ללוגיקה
  • גבולות thread רשלניים
  • אחריות דחוסה של הגדרות/קבצים/COM/DB

במקרה כזה, גם מעבר ל-WinUI רק ישאיר את הבעיה עם שם אחר.

הבעיה נשארת עם שם אחרתרשים המראה שמה שנראה כבעיית WinForms הוא לרוב בעיית מבנה - ערבוב מסך ולוגיקה, גבולות thread רשלניים, אחריות דחוסה - ובמקרה כזה גם מעבר ל-WinUI ישאיר את הבעיה עם שם אחר.נראה כבעיית WinFormsבפועל בעיית מבנהערבוב מסך ולוגיקהגבולות thread רשלנייםאחריות דחוסהמעבר ל-WinUI - נשאר עם שם אחר

איור 21: בעיה שנראית כבעיית UI היא לרוב בעיית מבנה, ונשארת גם אחרי החלפת framework.

7.2 אם יש WPF קיים

קל לנצל את הנכסים הקיימים ב-WPF.

  • נכסי XAML
  • ‏Binding
  • ‏Style‏/‏Template
  • ‏Command
  • ‏MVVM

הסיבה לזרוק את אלה צריכה להיות ברורה למדי.

לדוגמה, אם -

  • רוצים לחדש לגמרי את ה-UI של המוצר
  • רוצים ש-Fluent יהיה הציר המרכזי
  • מוציאים מודול חדש כמוצר נפרד
  • רוצים להתקרב לחוויה חדשה כמוצר ייעודי ל-Windows

זו סיבה לשקול WinUI. אבל רק “כי WPF ישן” - זה חלש.

7.3 מה שבאמת כבד הוא לרוב לא ה-UI

בעבודה בפועל, מה שקשה לרוב מפתיע הוא אלה:

  • ‏ActiveX‏/‏OCX
  • ‏COM interop
  • דוחות עצמאיים
  • הדפסה
  • שילוב עם Excel‏/‏Office
  • ‏DLL נייטיבי
  • קונפליקט 32bit‏/‏64bit
  • מתקין, הרשאות, עדכון, חתימה

אם מזלזלים כאן, גם ניקוי ה-UI בלבד לא יקל על הפרויקט כולו.

לכן, במעבר יישום קיים, עדיף לא רק להסתכל על ה-UI‏ framework, אלא לעשות מלאי לכל גבול תלות.

עושים מלאי לכל גבול תלותתרשים המראה שבעבודה בפועל מה שכבד הוא לרוב ActiveX או COM, דוחות והדפסה, DLL נייטיבי, מתקין ועדכון - לא ה-UI - ולכן עושים קודם מלאי לכל גבול תלות.ActiveX / COM interopמה שכבד באמת - לא ה-UIדוחות, הדפסה, שילוב Officeמתקין, הרשאות, עדכון, חתימהקודם עושים מלאי לכל גבול תלותניקוי ה-UI בלבד לא מקל

איור 22: מה שבאמת כבד במעבר הוא לרוב תלות מחוץ ל-UI, ולכן עושים מלאי קודם.

8. חמש השאלות האחרונות למי שמתלבט

אם עדיין מתלבטים, עונים על חמש השאלות האלה בסדר.

8.1 האם הנכסים הקיימים גדולים

  • גדולים → משמרים בעיקרון את אותו קו
  • קטנים / אין → עוברים לבחירה חדשה

8.2 האם “חוויית Windows מודרנית” הכרחית ליישום הזה

  • הכרחית → WinUI אפשרות טובה
  • לא כל כך → בודקים אם WPF‏/‏WinForms מספיקים

8.3 האם המסך מבוסס טפסים סטנדרטיים, או דורש כוח ביטוי בסגנון XAML

  • מבוסס טפסים סטנדרטיים → WinForms
  • ‏style/template/Binding/MVVM חשובים → WPF

8.4 רוצים חידוש מלא של ה-UI, או הוספת פיצ’רי Windows

  • חידוש מלא של ה-UI → שוקלים WinUI
  • רק הוספת פיצ’רים → בודקים קודם WPF‏/‏WinForms הנוכחיים + Windows App SDK

8.5 האם אפשר להסביר מראש איך מטפלים בהפצה/עדכון/תפעול

  • עדיין מעורפל → ב-WinUI ממלאים מוקדם את פרטי ה-packaging/deployment
  • רוצים להסתמך חזק על התפעול הקיים → לרוב WPF‏/‏WinForms פחות מחככים
זרימת חמש השאלות האחרונותתרשים המראה שעונים בסדר על האם הנכסים גדולים, האם חוויה מודרנית הכרחית, האם המסך מבוסס טפסים או דורש כוח ביטוי, וכך מצמצמים את האפשרויות.גדוליםקטנים / איןהכרחיתלא כל כךכןכוח ביטוי חשובהאם הנכסים הקיימים גדוליםמשמרים את אותו קוחוויה מודרנית הכרחיתWinUI אפשרות טובהמבוסס טפסים סטנדרטייםWinFormsWPFאם רק פיצ'רים - קודם SDKממלאים מוקדם packaging והפצה

איור 23: עונים בסדר על נכסים קיימים, חוויה ואופי המסך, ומצמצמים את האפשרויות.

חמש השאלות האלה מצמצמות משמעותית. לסיכום גס:

  • טופס פנים-ארגוני שבונים מהר → WinForms
  • יישום עסקי ל-Windows שגדל לאורך זמן → WPF
  • UI מוצרי מודרני חדש ל-Windows → WinUI
  • מנצלים את הקיים ומתמדרנים רק בפיצ’רי Windows → ה-framework הנוכחי + Windows App SDK

9. סיכום

הבחירה בין WinForms,‏ WPF ו-WinUI היא לא משחק של לסדר לפי חדשנות ולקחת את הימני ביותר.

ארבעת הדברים שכדאי לבדוק ראשונים:

  1. איפה נמצאים הנכסים הקיימים
  2. האם המסך מבוסס טפסים, או מבוסס כוח ביטוי
  3. האם UI מודרני ואופייני ל-Windows הוא דרישת מוצר
  4. איך מנהלים הפצה/עדכון/תפעול

אם רואים את ארבעתם, המדיניות כמעט נקבעת.

ארבע השאלות המסכמותתרשים המראה שאם רואים את הנכסים הקיימים, אופי המסך, דרישת UI מודרני, והפצה ותפעול, המדיניות כמעט נקבעת.נכסים קיימיםהמדיניות כמעט נקבעתאופי המסךדרישת UI מודרניהפצה ותפעול

איור 24: אם רואים את ארבע השאלות, מדיניות בחירת ה-framework כמעט נקבעת.

  • אם יש WinForms קיים גדול - קודם כול המשך עם WinForms
  • אם יש WPF קיים גדול - קודם כול המשך עם WPF
  • בפיתוח חדש מבוסס טפסים סטנדרטיים - WinForms
  • בפיתוח חדש של יישום עסקי בינוני-גדול ל-Windows - WPF
  • בפיתוח חדש שבו חוויית Windows מודרנית היא עצמה הדרישה - WinUI
  • אם רוצים רק Windows App SDK - לא עוברים ישר לגמרי ל-WinUI

שלושת הדברים שהכי כדאי להימנע מהם:

  • לזרוק כי זה ישן
  • לבחור כי זה חדש
  • להתחיל מתוך “יסתדר בהמשך”

שולחן העבודה של Windows הוא עולם שבו נכסים, הפצה, תפעול ותלות שוקלים יותר מהמראה. לכן, גם בבחירה עצמה, להסתכל על מעט חיכוך ולא על ברק, זה לרוב הדרך שמנצחת.

10. מקורות

  1. Microsoft Learn, “WinUI 3 - Windows apps” / Microsoft Learn, “Modernize your desktop apps for Windows”  2 3 4 5 6 7

  2. Microsoft Learn, “Windows App SDK”  2 3 4 5 6 7 8

  3. Microsoft Learn, “Windows フォームとは - Windows Forms”  2 3 4 5

  4. Microsoft Learn, “Windows Presentation Foundation とは - WPF”  2 3 4 5

  5. Microsoft Learn, “What is Windows Forms Designer?”  2

  6. Microsoft Learn, “Data binding overview - WPF”  2 3

  7. Microsoft Learn, “Commanding Overview - WPF”  2 3

  8. Microsoft Learn, “WPF アプリでWindows App SDKを使用する”  2 3

  9. Microsoft Learn, “Use the Windows App SDK in a Windows Forms (WinForms) app”  2 3

  10. Microsoft Learn, “Windows 開発者向け FAQ”  2 3 4 5 6 7 8 9

  11. Microsoft Learn, “Windows App SDK 1.4 release notes” / Microsoft Learn, “Windows App SDK”  2 3

  12. Microsoft Learn, “Windows data binding and MVVM” 

  13. Microsoft Learn, “Packaging overview - Windows apps” / Microsoft Learn, “Grant package identity by packaging with external location”  2 3 4 5 6 7

  14. Microsoft Learn, “Quick start: Set up your environment and create a WinUI 3 project” 

  15. Microsoft Learn, “Package and deploy Windows apps overview”  2

  16. Microsoft Learn, “What’s new in WPF for .NET 9” 

  17. Microsoft Learn, “What’s new in WinForms for .NET 9” 

  18. Microsoft Learn, “Windows App SDK release channels” 

מאמרים עדכניים עם אותן תגיות, להעמקה בנושאים קרובים.

העמודים האלה ממקמים את הנושא בהקשר רחב יותר של שירותים והחלטות.

המאמר קשור ישירות לשירותים הבאים.

שאלות נפוצות

שאלות נפוצות בפניות בנושא המאמר.

‏מה ההבדל בין WinUI 3 ל-WPF?
שניהם משתמשים ב-XAML, אבל WinUI הוא לא 'סתם WPF חדש'. ה-API הבסיסי, סביבת הפקדים, מבנה הפרויקט, הגישה לפריסה (deploy)/packaging, והיחס ל-Windows App SDK - כל אלה שונים. WPF הוא framework‏ UI המבוסס על ציור וקטורי בלתי-תלוי ברזולוציה, data binding, style/template ו-command, מיועד ליישומים עסקיים בינוניים עד גדולים. WinUI, כחלק מ-Windows App SDK, הוא framework‏ UI מודרני שמניח Fluent, DPI גבוה וחוויית Windows עדכנית. מסוכן לראות בו תחליף קליל ל-WPF.
‏באיזה משלושת - WinForms,‏ WPF או WinUI - לבחור בפיתוח חדש?
התשובה תלויה באופי המסך ובדרישות המוצר. אם רוצים לבנות מהר כלי פנים-ארגוני קטן עד בינוני שמבוסס על פקדים סטנדרטיים וטפסי קלט, WinForms עדיין די חזק. אם מדובר ביישום עסקי בינוני עד גדול עם מסכים רבים, שרוצים לנצל בו כראוי data binding,‏ style,‏ template ו-MVVM, WPF לרוב הבחירה הבטוחה ביותר. עבור מוצר חדש ייעודי ל-Windows שבו Fluent וחוויית Windows מודרנית קשורים ישירות לערך המוצר, WinUI אפשרות טובה. כשיש נכסים קיימים גדולים, קודם כול בוחנים המשך של אותו קו.
‏האם WPF ו-WinForms כבר מיושנים?
עדיף שלא לפסול אותם בקלות. גם WinForms וגם WPF ממשיכים לקבל תיעוד ומסלולי הגירה על גבי ‏.NET‏ הנוכחי, ומטופלים רשמית כ-UI פעיל של שולחן העבודה ב-Windows. במיוחד ביישומים עסקיים, נכסים קיימים, פקדי צד שלישי, דוחות והדפסה, חיבור למכשירים והליכי הפצה שקולים לרוב יותר מחדשנות ה-framework‏ ה-UI. גם בפיתוח חדש, לא נדיר ש-WinForms או WPF הם הבחירה עם הכי מעט חיכוך.
‏האם צריך לעבור ל-WinUI כדי להשתמש בפיצ'רים העדכניים של Windows?
לא. ‏Windows App SDK ו-WinUI אינם אותו דבר - WinUI הוא חלק ה-UI‏ framework בתוך Windows App SDK. את Windows App SDK עצמו אפשר להוסיף גם ליישומים קיימים של WPF‏/‏WinForms‏/‏Win32, ופיצ'רים כמו App Lifecycle,‏ Windowing ו-Toast Notifications אפשר לעיתים לשלב תוך שמירה על ה-UI הנוכחי. כלומר, יש דרך לשמור על WPF‏/‏WinForms הקיימים ולמדרן רק את הפיצ'רים הדרושים של Windows, ומעבר מלא ב-UI אינו הכרחי.

פרופיל הכותב

עמוד היכרות עם כותב המאמר.

Go Komura

מנהל KomuraSoft LLC

מתמחה בפיתוח תוכנה עבור Windows, ייעוץ טכני וחקירת תקלות, בעיקר בפרויקטים עם מערכות קיימות ובאגים שקשה לשחזר.

קישורים ציבוריים

חזרה לבלוג