דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. תבנית ברעיון של MVVM עבור VSTO XML RIBBON?

תבנית ברעיון של MVVM עבור VSTO XML RIBBON?

מתוזמן נעוץ נעול הועבר תכנות
7 פוסטים 2 כותבים 561 צפיות 2 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • pcinfogmachP
    pcinfogmachP
    pcinfogmach
    כתב ב נערך לאחרונה על ידי pcinfogmach
    #1

    לאחרונה יצא לי לעבוד על פרויקט עם הרבה לחצנים בסרגל הכלים של וורד. אמרתי לעצמי שזה לא שפוי ואני חייב לעשות סדר בבלאגן באמצעות חלוקה למשהו כמו-MVVM (Model-View-ViewModel).

    מכיון שה-ribbon xml לא באמת נותן גישה לאוסף של הפקדים חשבתי על הרעיון הבא:

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

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

    להלן דוגמאות עבור button1 ו-button2.

    בתוך ה-callbacks יש להוסיף את הקודים הבאים:

    private ButtonInvoker buttonInvoker;
    
    public Ribbon()
    {
        buttonInvoker = new ButtonInvoker();
    }
    
    
    
    public void button_Click(Office.IRibbonControl control)
    {
        buttonInvoker.InvokeButtonMethod(control.Id);
    }
    

    במקום ליצור מתודה ייחודית לכל כפתור ב-XML, כל כפתור יקרא לאותה מתודה. הנה דוגמה ל-XML:

    xml
    
    <?xml version="1.0" encoding="UTF-8"?>
    <customUI onLoad="Ribbon_Load" xmlns="http://schemas.microsoft.com/office/2006/01/customui">
        <ribbon>
            <tabs>
                <tab id="tab1" label="Label">
                    <group id="MyCustomGroup" label="My Custom Group">
                        <button id="button1" label="Button 1" onAction="button_Click"/>
                        <button id="button2" label="Button 2" onAction="button_Click"/>
                    </group>
                </tab>
            </tabs>
        </ribbon>
    </customUI>
    

    כעת, נוסיף את מחלקת ה-ButtonInvoker שתטפל בלחצנים:

    public class ButtonInvoker
    {
        public void InvokeButtonMethod(string methodName)
        {
            try
            {
                MethodInfo method = this.GetType().GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance);
                if (method != null)
                {
                    method.Invoke(this, null);
                }
                else
                {
                    MessageBox.Show($"No method found for button ID: {methodName}");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"Error invoking method for button ID: {methodName}. Error: {ex.Message}");
            }
        }
    
        private void button1()
        {
            MessageBox.Show("Button 1 clicked");
        }
    
        private void button2()
        {
            MessageBox.Show("Button 2 clicked");
        }
    }
    

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

    גמ"ח מידע מחשבים ואופיס

    תגובה 1 תגובה אחרונה
    0
    • dovidD
      dovidD
      dovid
      ניהול
      כתב ב נערך לאחרונה על ידי dovid
      #2

      אני לא מסכים עם הכיוון.
      אתה עושה ככה:
      א. כותב id שונה בכל כפתור, שערכו כשם מתודה שאתה רוצה שטפל בו
      ב. במטפל הכלל (button_Click) אתה משתמש עם שיקוף לאתר את המתודה ששמה כשם הid.

      זה זהה לגמרי לכתיבה ישירה של המתודה הרצויה בonAction למעט שאתה מרויח שהמתודות יכולות לשבת בקובץ נפרד (שאם זה כדבריך מגיע כבר עם תמיכה בMVVM אז אמור להיות כן אפשרי).

      • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
      • בכל נושא אפשר ליצור קשר dovid@tchumim.com
      pcinfogmachP תגובה 1 תגובה אחרונה
      2
      • dovidD dovid

        אני לא מסכים עם הכיוון.
        אתה עושה ככה:
        א. כותב id שונה בכל כפתור, שערכו כשם מתודה שאתה רוצה שטפל בו
        ב. במטפל הכלל (button_Click) אתה משתמש עם שיקוף לאתר את המתודה ששמה כשם הid.

        זה זהה לגמרי לכתיבה ישירה של המתודה הרצויה בonAction למעט שאתה מרויח שהמתודות יכולות לשבת בקובץ נפרד (שאם זה כדבריך מגיע כבר עם תמיכה בMVVM אז אמור להיות כן אפשרי).

        pcinfogmachP
        pcinfogmachP
        pcinfogmach
        כתב ב נערך לאחרונה על ידי pcinfogmach
        #3

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

        גמ"ח מידע מחשבים ואופיס

        תגובה 1 תגובה אחרונה
        0
        • dovidD
          dovidD
          dovid
          ניהול
          כתב ב נערך לאחרונה על ידי
          #4

          לא אמרתי שלא עשית כמו שצריך,
          אני אמרתי שאני לא רואה ייתרון לעניין הסדר,
          ייתכן שלא הבנתי.

          • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
          • בכל נושא אפשר ליצור קשר dovid@tchumim.com
          pcinfogmachP תגובה 1 תגובה אחרונה
          0
          • dovidD dovid

            לא אמרתי שלא עשית כמו שצריך,
            אני אמרתי שאני לא רואה ייתרון לעניין הסדר,
            ייתכן שלא הבנתי.

            pcinfogmachP
            pcinfogmachP
            pcinfogmach
            כתב ב נערך לאחרונה על ידי
            #5

            @dovid
            אה
            הייתרון לעניין הסדר הוא העובדה שאני מפריד את המתודות של ה-פעולות משאר המתודות שלא נוגעות לפעולות אלא ל-view
            כאשר יש מאות לחצנים זה מאוד משמעותי

            גמ"ח מידע מחשבים ואופיס

            תגובה 1 תגובה אחרונה
            1
            • dovidD
              dovidD
              dovid
              ניהול
              כתב ב נערך לאחרונה על ידי
              #6

              @pcinfogmach צריך להפריד בצורה אחרת, זה קשה לדון בזה על גבי הפורום.
              אבל הפתרון שהבאת יפה.

              • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
              • בכל נושא אפשר ליצור קשר dovid@tchumim.com
              pcinfogmachP תגובה 1 תגובה אחרונה
              0
              • dovidD dovid

                @pcinfogmach צריך להפריד בצורה אחרת, זה קשה לדון בזה על גבי הפורום.
                אבל הפתרון שהבאת יפה.

                pcinfogmachP
                pcinfogmachP
                pcinfogmach
                כתב ב נערך לאחרונה על ידי pcinfogmach
                #7

                @dovid
                ייתכן שהיה פה בלבול בין xaml ל-ribbon xml
                לא יודע אם המושג MVVM כמות שהוא באמת שייך ליישום ב-ribbon xml
                אולי צריך פה מבנה אחר אני לא בקי מספיק במבני תוכנה כדי לדעת מה המבנה הנכון פה

                גמ"ח מידע מחשבים ואופיס

                תגובה 1 תגובה אחרונה
                0

                שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.

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

                בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗

                הרשמה התחברות
                תגובה
                • תגובה כנושא
                התחברו כדי לפרסם תגובה
                • מהישן לחדש
                • מהחדש לישן
                • הכי הרבה הצבעות


                בא תתחבר לדף היומי!
                • התחברות

                • אין לך חשבון עדיין? הרשמה

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