WPF Theme (skin) Service Pattern Part 1

31 בMay 2014

אין תגובות

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

זה אולי לא ממש Pattern אבל די נפוץ באפליקציות בכל פלטופרמה שהיא

הרעיון הוא להתאים מראה שונה למשתמש בלחיצה אחת. הבעיה פה היא:

א. טכנית החלפת UI (נניח צבע רקע כדוגמא בסיסית).

ב. אני לא יכול מהVM לפנות לView כי אז אני שובר ארכיטקטורה! אבל נתעלם מזה כרגע

למקרה ששכחנו את יסודות הMVVM הקשר בין VM ל VIEW הוא באמצעות binding ואין כיום טכנולוגיית binding שיודעת להחליף resource. בצורה ישירה (על Dynamic נדבר בהמשך)

בוא נניח שיש לי מצב Dark ומצב Light לתכנית שלי, נתחיל בחלון הראשי שעליו נכיל את המצבים.

בתור התחלה רקורסיה פשוטה דרך VisualTreeHelper כמו הקוד הבא:

public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

        }


        private void Button_Click_1(object sender, RoutedEventArgs e)

        {

            foreach (var item in LogicalTreeHelper.GetChildren(this))

            {

                coloerSetter(item );

            }

        }


        void coloerSetter(object obj, int depth = 0)

        {

            DependencyObject Dep_Obg;

            if (!(obj is DependencyObject))

            {

                return;

            }

            else

            {

                Dep_Obg = obj as DependencyObject;


                if (Dep_Obg is System.Windows.Controls.Control)

                {

                    Control cntrl = Dep_Obg as Control;

                    cntrl.Background = Brushes.Green;

                }

                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(Dep_Obg); i++)

                {

                    coloerSetter(VisualTreeHelper.GetChild(Dep_Obg, i), depth + 1);

                }

            }

        }


    }

תצבע לכם את כל הפקדים בצבע  מסוים(ירוק) במקרה שלי,

הרעיון פה הוא קלאסי, ישנם פקדים רבים בWPF. המשותף לכולם זה אב קדמון מטיפוס Control (מפתיע נכון?), ולהבדיל מאלמנטים אחרים כמו Grid שיורשים מPanel ועליהם לא נרצה להכיל את הקוד שלנו.

איפה הבעיה בקוד כזה? דבר ראשון זה החיבור דרך codeBehind.

דבר שני שימוש בספריות resources, עבור עיצובים מורכבים, וכמובן צבע אחד לכולם..

מה טוב בקוד הזה? שאנו מתחילים להבין איך עושים את זה..

על ההתמודדות עם בעיות אלה בפוסט הבא בנושא.

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

Leave a Reply

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