WPF Custom Control – The Third Way

14 בFebruary 2014

תגיות: , ,
אין תגובות
אחרי שבעבר דיברנו לא מעט על קסטומיזציה של פקדים מן הראוי לציין שאחרי 2 הדרכים שדיברנו עליהם (לבצע ירושה מControl , או להשתמש ב User Control)
כמובן ישנה דרך שלישית שלא נוגעת בXAML אלא באמצעות C# טהור בלבד.
למעשה זה סוג של מימוש ל Decorator Pattern ואני מדבר על לרשת מפקד ידוע כאן לא נתעסק בStyle ולא עם Date Template.
(למרות שהכל אפשרי גם מקוד) ומאחר שלא נכתוב שום שורת XAML הפקד שלנו יממש את הTemplate הבסיסי שלו, אבל שוב נזכור שלא ניתן לשנות\להרחיב מראה אלא התנהגות בלבד.
אבל המטרה היא שונה לגמרי , נניח לצורך שינוי לוגיקה של הפקד. זה יהיה נוגע בדרך כלל לכתיבת תשתית וזה בדרך כלל לא הדבר הנכון לעשות.
מה שאומר שאם אנו נמצאים בצומת של השאלה : האם לכתוב כפתור חדש נניח שיממש התנהגות כלשהי ..
חובה לזכור שיש לנו בWPF תשתית נחמדה של כתיבת Behaviors ששם כל הרעיון הוא הרחבת התנהגות. והוספה דרך קוד XAML בלבד, מה שמחזיר אותנו לדברים כמו הוספת פרופרטי פנימי שזה לא יקרה דרך Behavior של WPF ואז נבצע ירושה ונכין תשתית עבור שימוש חוזר ביכולת.
כדוגמא בסיסית: הדרישה היא שכל לחיצה על כפתור תעדכן משתנה פנימי ותכתוב ללוג את שעת הלחיצה עליו. עכשיו כמה דרכים לממש.
א. ברמה אפליקטיבית להאזין לכל “קליק” ולשרשום
ב. לקסטם את הקלאס Button ולהשתמש רק בו במקום בכפתור רגיל. (ברור שהדוגמא פה לא רצינית וזה לדוגמא בלבד)
ג. ספציפית לדרישה הזאת ניתן לממש Behavior כמו שאמרנו קודם כי זה בעצם תוצאה של האזנה לאירוע של לחיצה וbehaviors תומכים בכל האירועים של הפקד.
ד. כמובן בדרך הטפשית בכל קוד שהגדרנו כפתור לקרוא לאינטרפייס שרושם ללוג ולהאזין דרך הCodeBehind
לאירוע של ButtonClick אז לצורך פוסט זה ברור שאני בוחר באפציה 2
public class LoggerClickButton : Button

    {

        public LoggerClickButton()

        {

            this.Click += LoggerClickButton_Click;

        }

        void LoggerClickButton_Click(object sender, RoutedEventArgs e)

        {

            Debug.WriteLine("button was clicked " + DateTime.Now);

        }

    }

אם דוגמא כזאת נוכל להמשיך לעבוד כרגיל בXAML וכל הלוגיקה המקורית של הקונטרול נשמרת וגם המראה שלו.

הוסף תגובה
facebook linkedin twitter email

Leave a Reply

Your email address will not be published. Required fields are marked *