עיצוב טפסים WPF
-
אתה מתכוון דרך הקוד C#
זה גם אפשר בזאמלנכון שאפשר בזאמל אבל דרך הקוד זה יהיה גנארי כלומר יהיה לך פונקציה שכפרמטר תעביר לא את הטבלה והקוד כבר לבד יעבור על העמודות ולכל עמודה יעשה את הפקדים שצריך. ואילו בזאמל אתה צריך לבנות הכל לבד ושוב ושוב עבור כל טבלה.
וגם נראה ל שאתה מתכוון הפוך
WrapPanel לתוך StackPanelלא, בכוונה אני שם את הפקדים שבאים בזוגות בתוך StackPanel כדי שיהיו צמודים אחד לצידו של השני, ואת כל ה StackPanelים אני שם בתוך WrapPanel שיסדר אותם בשורות ואפשר לשים את ה WrapPanel בתוך ScrollViewer וכך גם אם יש הרבה פקדים יהיה אפשר לגלגל ולראות את כולם.
פורסם במקור בפורום CODE613 ב16/01/2014 08:23 (+02:00)
-
צריך קודם לראות מה רוצים בדימיון, ולתת דרור מוחלט לדמיון.
אח"כ למצוא משהו דומה, ולחשוב איך הכי טוב בXAML לעשות זאת.צריך מאוד לראות XAML טוב של אחרים כדי לראות איך הXAML עובד.
גם בד"כ אם הXAML ארוך בכמה פקדים, זה מראה על תכנון לקוי (זה לא אסור, אבל שווה שיפור).
צריך להכיר גם חזק מה תפקידו של כל פקד' ומאפיין.לדוגמה, הנה רשימה של פקדים שנוטים להשתמש באחד מהם במקום במתאים בסיטואציות שונות.
TextBlock Button Label Pictue, זה נראה שעם טיפה קיסטום כולם עושים אותו דבר... טעות!!!
Grid Border Canavas
StackPanel (אופקי) WrapPanel
Label TextBlockבעצם כל פקד שלא הכי יודעים לשם מה נברא ("מה הבעיה לעשות זאת עם XX") שווה לימוד בירור וייעוץ.
אותו הדבר מאפיינים, שווה לרחרח, למה משמש ומתי.חשוב גם להשתמש בסטיילים: אם יש יותר משלוש כפתורים ובכל השלוש יש הגרה זהה של משהו, זה כבר שווה סטייל.
אם צורת העבודה מאוד קבועה שווה לפתח UserControls ליחידות קטנות שחוזרות על עצמם, וזה גם יכול לענות על השאלה.
למתקדמים: אפשר לעשות פקד מותאם אישית קטנטן שיש לו מאפיינים אלו: תווית, סוג תוכן (סטרינג, תאריך, מספר), מאפיין יעד (כסטרינג).
ואז כל שדה נראה ככה<local:Field Caption="שם תצוגה" PathToBinding="FieldName" />
פורסם במקור בפורום CODE613 ב16/01/2014 13:22 (+02:00)
-
ראה כאן עבור על כל המדריך לסידור פקדים, זה יפתח לך את הראש להבין איך הדברים עובדים. ייאמר לשבח wpf שהם חלוצים בעניין הזה של "נזילות פקדים" כפי שהגדיר את זה מתכנת אחד. (הפקדים של wpf הם כמו מים בתוך הפקד האב שלהם, והם נוזליים ומשנים את המיקום/גודל לפי השינויים בגודל הפקד האב.
פורסם במקור בפורום CODE613 ב16/01/2014 13:27 (+02:00)
-
יש איזה דרך לעשות טמפלט לuserContol שהוא בעצם יהיה הטופס וכל פעם יחברו לו בביינדיג מאפיינים מתאימים לטופס הנוכחי
זאת אומרת שיהיה לי userContol מעוצב כטופס עם שדות וכו' וכל פעם אני רק ישנה לו את הביינדינג
במקרה כזה זה יוכל להתקרב לאקסס כמובן אחרי ההשקעה הראשונה של יצירת הטמפלט הראשוןפורסם במקור בפורום CODE613 ב16/01/2014 16:17 (+02:00)
-
זה בדיוק מה שתיארת לך קודם וזה מה עשיתי לעצמי וזה עובד מצויין, עשיתי לuserContol שיש לו חלק עליון וחלק תחתון עם אפשרות לשלוט על גודל של כל חלק, בחלק העליון אתה שם את כל הפקדים בזמן ריצה כמו שתיארתי קודם ובחלק התחתון אתה שם בזמן ריצה את הדטה גריד של קשרי הגומלין השייכים לרשומה שכעת מוצגת בחלק העליון, כמובן עושים פרמטר אם ה לuserContol יראה רק את החלק העליון או גם את החלק התחתון כי תמיד יש קשרי גומלין.
הדטה קונטקס של ה לuserContol הוא ה DataTadle שלך או כל מקור נתונים אחר, ובזמן ריצה אתה יוצר את כל הפקדים הנ''ל ושם לכל אחד את הבינדינג לפי שם מאפיין על פי העמודות של ה DataTadleאבל יש כאלה שמתקשים עם פקדים שנוצרים בזמן ריצה, אבל אני חושב שזו הדרך היחידה לעשות דברים גנארים, אדרבא אשמח לשמוע עוד רעיונות. למשל ה XAML ממש לא גמיש בדברים האלו כמו הקוד.
פורסם במקור בפורום CODE613 ב16/01/2014 16:24 (+02:00)
-
רחמים מה שתיארת לדעתי אפשר לעשות הכל עם XAML.
אבל אני לא בטוח שהתכוונתם לאותו דבר.
אם אתם מתכונים לפאנל שמציבים לו מקור ואטומטית הוא נותן את כל המאפיינים, אז:
א. קל לעשות זאת נטו עם XAML.
ב. יש כבר פקד מובנה לכך http://wpftoolkit.codeplex.com/wikipage?title=PropertyGrid.רציתי גם לומר לכם, שזה לא חכם לדעתי. אין מצב שהמשתמש צריך לראות את כל המאפיינים בבת אחת. זה לא נוח, הרבה פעמים גם מיותר, ולא בטיחותי.
אבל אני מתחרט כי אני רואה שאפשר לשלוט על הכל דרך המאפיינים והארטיביוטים של אובייקט המקור.
תודה לשניכם על התגליות!ClickOne! בקטע של הטפסים המוכנים, אתה כמעט מסודר לגמרי עם הכיוון הזה שהעלו כאן.
פורסם במקור בפורום CODE613 ב16/01/2014 16:45 (+02:00)
-
@דוד ל.ט.
רחמים מה שתיארת לדעתי אפשר לעשות הכל עם XAML.
אבל אני לא בטוח שהתכוונתם לאותו דבר.
אם אתם מתכונים לפאנל שמציבים לו מקור ואטומטית הוא נותן את כל המאפיינים, אז:
א. קל לעשות זאת נטו עם XAML.מאוד מעניין אותי איך יכול להיות קל, הרי אתה צריך לעבור על כל העמודות ב DataTadle ולבדוק כל עמודה מה הטיפוס שלה ובהתאם לעשות לה פקדים ולהגדיר בינדינג מיוחד לפי טיפוס העמודה. איך תעשה כל זה בתוך הXAML ?
דבר נוסף הרי כל הפקדים האלו מופיעים רק בזמן ריצה לפי הפרמטר שאתה מעביר ל userContol ובזמן עיצוב לא תראה כלום וגם לא תוכל לדבג את זה בזמן ריצה כיון שהכל ב XAML אבל בקוד אפשר כל דבר לדבג ולתפוס מה קורה בדיוק ואיפה השגיאות ואי הדיוקים.
דבר נוסף מה העינין לעשות את זה דווקא ב XAML ? הרי דרך הקוד כידוע זה רץ הרבה יותר מהר, כיון שה XAML עובר המרה לקוד ורק אחר כך מתחיל לרוץ ובקוד חוסכים את השלב של ההמרה.@דוד ל.ט.
רציתי גם לומר לכם, שזה לא חכם לדעתי. אין מצב שהמשתמש צריך לראות את כל המאפיינים בבת אחת. זה לא נוח, הרבה פעמים גם מיותר, ולא בטיחותי.
אני פתרתי את זה בקלות, בפרמטר שאתה מעביר ל userContol אתה מביא גם מערך של שמות מאפיינים שאתה לא רוצה שיופיעו וזהו. פרמטר זה אופציונלי אם הוא ריק כל המאפיינים מופיעים בטופס.
@דוד ל.ט.
אבל אני מתחרט כי אני רואה שאפשר לשלוט על הכל דרך המאפיינים והארטיביוטים של אובייקט המקור.
תודה לשניכם על התגליות!לא הבנתי על מה אתה מתחרט? ומה זה ארטיביוטים ? ואיזה תגלית מרעישה יש פה ?
פורסם במקור בפורום CODE613 ב16/01/2014 17:54 (+02:00)
-
@דוד ל.ט.
ב. יש כבר פקד מובנה לכך http://wpftoolkit.codeplex.com/wikipage?title=PropertyGrid.
עברתי על הקישור ולא כ"כ הבנתי את מה שהולך שם
האם באמת אתה יכול ליצור טופס וכל פעם הא יזהה את האובייקטים של המחלקה ויצור פקדים רק בשבילהם?פורסם במקור בפורום CODE613 ב16/01/2014 21:42 (+02:00)
-
@דוד ל.ט.
דבר נוסף הרי כל הפקדים האלו מופיעים רק בזמן ריצה לפי הפרמטר שאתה מעביר ל userContol ובזמן עיצוב לא תראה כלום וגם לא תוכל לדבג את זה בזמן ריצה כיון שהכל ב XAML אבל בקוד אפשר כל דבר לדבג ולתפוס מה קורה בדיוק ואיפה השגיאות ואי הדיוקים.
אני מבין שלא ידוע לך ואולי לעוד כמה אנשים שXAML הוא מדובג כל הזמן גם בזמן כתיבת הXAML עצמו
(לדוגמא אם תיצור ליסט בוקס שמחובר לאוסף של 3 איברים תראה 3 איברים בעיצוב)מה שעושים בשביל באמת לראות את העיצובים כל הזמן תוך כדי כתיבת הXAML
אתה כותב מחלקה שממלא את הנתונים בנתוני דמו
עושים מתודה שבודקת האם אתה כעת אתה בזמן עיצוב או שאתה מחובר לנתוני אמת
ואז אתה רואה את הנתונים תוך כדי עיצוב בלי צורך להריץ את התוכניתמה שאני זוכר זה שיש בדיקה IsInDesignMode ובהתאם לכך ממלאים את הנתונים
ניסיתי לחפש אבל לא הצלחתי ליישם לכן לא העליתי קוד
אולי מישהוא מכיר או אם יהיה לי אשתדל בעז"ה להעלות דוגמאפורסם במקור בפורום CODE613 ב16/01/2014 22:31 (+02:00)
-
אני מבין שלא ידוע לך ואולי לעוד כמה אנשים שXAML הוא מדובג כל הזמן גם בזמן כתיבת הXAML עצמו
(לדוגמא אם תיצור ליסט בוקס שמחובר לאוסף של 3 איברים תראה 3 איברים בעיצוב)נכון בוודאי זה ידוע, אני לא קורא לזה לדבג, אלא לדבג הכוונה שבזמן ריצת התוכנית אתה שם ברייק-פוייט
ואז עובר שורה שורה ורואה מה הערכים של כל משתנה וכדומה ואת זה אי אפשר לעשות ב XAML, למשל אם עשית איזה בינדינג שיעשה משהו והוא לא עושה ואתה לא מבין למה, אתה יכול רק לנחש ולא לדבג את זה שורה אחר שורה כדי להבין מה קורה בזמן ריצה ולמה זה לא עובד כמצופה.לגבי מה שזכרת זה נקרא design mode
הנה קישר שמסביר איך עושים את זה:
http://blogs.msdn.com/b/jnak/archive/2006/10/07/detecting-design-mode.aspxפורסם במקור בפורום CODE613 ב16/01/2014 23:17 (+02:00)
-
רחמים, בקשר לביצועים זה קשקוש, גם הקוד וגם הXAML הופכים לשפת הביניים של NET.
בקשר ל"מעניין איך עושים", אני בהחלט אולי יתחיל לכתוב ואז תראה.התגלית המרעישה, זה היכולת לסנן ולקבץ מאפיינים לפי הAttribute שלהם, בע"ה אראה זאת.
פורסם במקור בפורום CODE613 ב17/01/2014 12:17 (+02:00)
-
@דוד ל.ט.
רחמים, בקשר לביצועים זה קשקוש, גם הקוד וגם הXAML הופכים לשפת הביניים של NET.
אז למה א''כ בתוך האסמבלי יש את כל ה XAML ורואים את הכל ברפלקטור? אם זה כבר הפך לקוד למה לשמור את ה XAML ?
דבר שני אם תפתח כל תוכנית WPF ברפלקטור תראה בתוך הבנאי קריאה לפונקציה הבאה:
Public Sub InitializeComponent() If (Not Me._contentLoaded) Then Me._contentLoaded = True Application.LoadComponent(Me, New Uri("/שם היישום שלך;component/mainwindow.xaml", UriKind.Relative)) End If End Sub
הרי שהוא טוען את ה XAML וממיר אותו לקוד. ואם תמשיך ברפלקטור ותפתח את LoadComponent תראה כמה קוד יש בהמרה הזו.
פורסם במקור בפורום CODE613 ב17/01/2014 12:28 (+02:00)
-
מעיון בטענותיך, חשבתי, אם זה גוזל ביצועים, ואם אפשר בזמן קומפילציה להפוך הכל לקוד, אז למה הקומפיילר כ"כ טיפשי?
לכן חשבתי שהנך טועה, והרפלקטור פשוט משחזר הכל (רשום במטה דטה של כל אובייקט מה מקורו).אולם התאמצתי לבדוק, ואכן אתה צודק, הXAML מקומפל רק לBMAL שזה יותר מהיר מXAML אבל פחות מIL. למה? בשל יתרונות מינוריים.
אז אולי באמת מהיום תהפוך הכל לקוד לפני הפצת היישום שלךתודה על ההערה, וסליחה על ההצרה שזה "קשקוש" בעוד שזה דברים כהוויתם.
לענייננו, הצגת אלמנטים ויזואליים דרך הקוד היא לא נוחה בעליל, ובלתי ניתנת להתאמה גמישה.
פורסם במקור בפורום CODE613 ב17/01/2014 13:03 (+02:00)
-
@דוד ל.ט.
אז אולי באמת מהיום תהפוך הכל לקוד לפני הפצת היישום שלך
נכון, בשביל זה יש את http://xamlgenerator.codeplex.com/
אם כי הוא עדיין לא מספיק מפותח, ואולי היה עדיף שמיקרוסופט יפתחו את ה WPF שלהם בצורה קצת יותר הגיונית, ושיהיה אפשר להכניס לתוך ה XAML גם קוד רגיל וכמו שב HTML יש קטעי קוד JS ועדיין זה ישאר MVVM
@דוד ל.ט.לענייננו, הצגת אלמנטים ויזואליים דרך הקוד היא לא נוחה בעליל, ובלתי ניתנת להתאמה גמישה.
נכון אבל רק בתנאי שאכן זה אפשרי דרך ה XAML לעשות טופס דינמי שמתאים את עצמו למקור הנתונים וכמו שתואר לעיל, ולכן אני כבר מחכה לראות איך זה אפשרי.
תודה, ושבוע טוב.פורסם במקור בפורום CODE613 ב18/01/2014 20:42 (+02:00)