בפוסט הקודם דיברנו על Dependency property. כעת נדבר על Attached. קודם כל נראה דוגמא קטנה :
<Canvas><Button Canvas.Top="20"
Width="150"
Height="50"
Content="Button in canvas"
Canvas.Left="36"></Button>
</Canvas>
הקוד הבא ימקם Button בתוך הCanvas על בסיס של Top ו Left. אנחנו רואים שהמאפיינים Top ו Left יושבים בתוך ה Canvas ולא בתוך ה Button, למה ? למה אין ל Button מאפיינים של Top ושל Left?! אם נחשוב לרגע נזכור שCanvas הוא רק סוג אחד של Container. Container נוסף שנפוץ בצורה משמעותית יותר מה Canvas הוא ה Grid. ל Grid עצמו אין Top ו Height אלא Column ו Row. אז מה יקרה אם נעבוד בצורה המוצעת כאן ? ל Button יהיה גם top וגםleft ו Column וגם Row. מה יקרה כאשר ירצו להוסיף Container נוסף? האם הגיוני שעל כל Container שנוסיף נצטרך לעבור על כל הControls שרלוונטים ולבצע שינוי גם אצלם ? איך נזכור בכלל איזה Controls רלוונטים. כך שבאמת צריך למצוא פיתרון טוב יותר. ב WPF המציאו את ה Attached Property שמאפשר לנו לשמור נתונים נוספים על פקד בלי שיהיה לא את המאפיין הזה מראש. בואו נראה איך נראה הקוד ב #C ביחס ל XAML למעלה :
Button b = new Button();
b.Content = "Button in canvas";Canvas.SetLeft(b, 36);
Canvas.SetTop(b, 20);
c1.Children.Add(b);
מה הולך פה ? c1 מתייחס כאן ל Canvas עצמו. תיזכרו שוב במילון של ה Dependency Properties מה Post הקודם. באמצעות פונקציה סטטית שיושבת ב Canvas אני שומר על ה Button שה Canvas.Left שלו הוא 36. את מי הערך הזה מעניין ? בטח שלא את ה Button עצמו. כאשר ה Canvas בא לצייר את עצמו הוא עובר על כל ה Childerns שלו ושואל אותם האם יש להם ערכים בשבילו. הערכים הרלוונטים ל Canvas הם left, top, bottom, right, zIndex. הקריאה של הProperty מתבצעת בצורה הבאה :
Canvas.GetTop(b);
ה Canvas מקבל את הערך ולפי זה יודע איך לצייר אותו. שימו לב שהButton לא שומר canvas.Left על אובייקט ספציפי של Canvas אלא ברמה הסטטית.
Read more: SHIMON DAHAN
0 comments:
Post a Comment