בחלק זה נלמד כיצד ליצור התנהגות חדשה בעזרת Visual Studio 2010, ולכן מיועד למפתחים בעל ניסיון בפיתוח בטכנולוגיית WPF.
מתכון ליצירת התנהגות
ראשית, ניצור מחלקה חדשה שיורשת מ
Behavior>T>. לאחר מכן נדרוס (Override) את הפונקציה
OnAttached. פונקציה זו נקראת פעם אחת כאשר ההתנהגות משוייכת לאלמנט, ובה נבצע את השינויים הדרושים על האלמנט שאליו ההתנהגות משוייכת (
AssociatedObject). בדרך כלל, נשנה את התכונות של האלמנט עליו אנו פועלים וכן נרשם לאירועים שמעניינים אותנו. לאחר מכן נדרוס את הפונקציה
OnDetaching, אשר נקראת פעם אחת כאשר ההתנהגות מוסרת מאלמנט. בפונקציה זו נבטל את השינויים שעשינו בפונקציה OnAttached. אם אנו בטוחים שלא יסירו את ההתנהגות במהלך ריצת התוכנית, ניתן לוותר על מימוש פונקציה זו.
דוגמא למימוש התנהגות
בדוגמא זו נממש אפקט של שיקוף-מראה לאלמנטים ב-WPF. נכתוב את האפקט בתור התנהגות כך שנוכל אחר כך להשתמש בה על כל אלמנט על-ידי גרירה של ההתנהגות ב-Blend אל האלמנט הרצוי.
נפתח פרויקט חדש מסוג WPF Application, ונקרא לו WpfReflectionBehaviorDemo.
כעת נוסיף את ה-Reference הדרוש לצורך הכרת המחלקה Behavior>T>. כעת נלך ל-Solution Explorer, נלחץ עם כפתור ימני בעכבר על References ונבחר Add Reference.
כעת נלחץ על Browse, נעבור לספריה:
C:\Program Files\Microsoft SDKs\Expression\Blend\.NETFramework\v4.0\Libraries
נבחר את הקובץ: System.Windows.Interactivity.dll ונלחץ על OK לצורך הוספתו לפרויקט. יש לציין כי קובץ זה מגיע כחלק מהתקנת Blend 4. לחילופין, ניתן להתקין אותו על-ידי הורדה של Microsoft Expression Blend 4 SDK בכתובת
הבאה.
על מנת להוסיף מחלקה חדשה נלחץ עם כפתור ימני בעכבר על שם הפרויקט (WpfReflectionBehaviorDemo) בחלון Solution Explorer, נבחר באפשרות Add ואז Class.
ניתן למחלקה החדשה את השם ReflectionBehavior ונאשר על-ידי לחיצה על כפתור OK.
נשנה את המחלקה כך שתהיה נגישה מכל מקום (Public) וכן תבצע ירושה מהמחלקה <Behavior<FrameworkElement. משמעות הפרמטר FrameworkElement היא שניתן להצמיד את ההתנהגות שאנו מגדירים רק על אלמנטים שיורשים מ-FrameworkElement:
public class ReflectionBehavior : Behavior<FrameworkElement>
{
}
יש להוסיף בשלב זה לראש הקובץ את השורות הבאות:
;using System.Windows
;using System.Windows.Controls
;using System.Windows.Data
;using System.Windows.Interactivity
;using System.Windows.Media
מימוש OnAttached
ראשית נוסיף דריסה (Override) של הפונקציה OnAttached:
הגדרת הפונקציות ReplaceControlWithProxyGrid ו-AddReflectionEffect תגיע מיד בצירוף הסבר. רשאית, כדי לממש אפקט שיקוף-מראה יש צורך להוסיף אלמנט נוסף לעץ הלוגי שיציג את תמונת השיקוף. לכן, בשלב ראשון אנו נחליף את האלמנט הקיים באלמנט מסוג Grid שיכיל את האלמנט המקורי וכן אלמנט נוסף שיציג את תמונת השיקוף.
בשביל להחליף את האלמנט המקורי באלמנט Grid יש צורך להסיר אותו מה-Container שמכיל אותו ולצרף במקומו את אלמנט ה-Grid. יש לטפל בשני מקרים שונים לפי סוג ה-Container שמכיל את האלמנט המקורי: מקרה שבו ה-Container של האלמנט המקורי יורש מ-Panel ומ-ContentControl. קטע הקוד הבא מבצע את הטיפול בשני המקרים:
כעת נרצה להוסיף את אפקט השיקוף-מראה לאלמנט החדש שהוספנו. כדי ליצור את האפקט נשתמש ביכולות הבאות:
קטע הקוד הבא משתמש ביכולות אלו ליצירת האפקט:
בכך סיימנו לממש את ההתנהגות. ראוי לציין שהמימוש אינו מושלם ואם נרצה להשתמש בו באפליקציה אמיתית יש לטפל במקרי קצה נוספים וכן לממש גם את הפונקציה OnDetaching כך שתסיר את השינויים שעשינו. יחד עם זאת, לצורך הדגמת הנושא המימוש הנ"ל מספיק טוב.
שימוש בהתנהגות החדשה
בשביל להדגים את השימוש בהתנהגות החדשה שיצרנו נוסיף לאפליקציה שלנו כפתור ותמונה, ונוסיף לכל אחד מהם ההתנהגות החדשה. קטע הקוד הבא מראה כיצד להגדיר זאת:
ניתן להוריד את הקוד המלא בכתובת הבאה:
WpfReflectionBehaviorDemo.zip.
הערה: ניתן להריץ את התוכנית בקלות על-ידי הפעלת הקובץ WpfReflectionBehaviorDemo.exe בספריה bin/Debug.
סיכום
בחלק זה למדנו מהו תהליך הפיתוח של התנהגות חדשה וכן ראינו דוגמה מלאה למימושה. כל הנותר לנו לעשות כעת הוא לאחל לכם בהצלחה, ובמידה ונתקלתם בבעיות אל תהססו להיעזר בפורומי התכנות שלנו!