14-02-2007, 09:36
|
|
אדמין לשעבר
|
|
חבר מתאריך: 25.10.01
הודעות: 20,292
|
|
DesignMode בWPF (לא שאלה)
רקע
צוות Cider וWPF במיקרוסופט נתקלו בסוגיה - מה לעשות עם הProperty שממש UserControl בגרסאות הישנות של .NET, הלא הוא DesignMode.
הProperty הזה אפשר למפתחים לזהות האם הUserControl שהם יצרו רץ בסביבת Design או בRuntime, וכך להתאים את הלוגיקה.
עם זאת, היו שני חסרונות גדולים שלצערנו רובנו הכרנו:- לא ניתן היה לקבל סטטוס מדויק בתוך הConstructor של הUserControl. זאת בגלל שהפרמטר DesignMode קיבל ערך רק אחרי שהDesigner ביצע Deserialization לקוד שכתוב בInitializeComponents.
- UserControls מקננים (כאלו שנמצאים בתוך הUserControls שאותם אנחנו כרגע מעצבים), לא ידעו להחזיר תשובה נכונה בפרמטר הזה.
הדגמה למצב הישן
קוד:
public class CustomButton : Button
{
public CustomButton()
{
if (this.DeisgnMode)
{
this.Text= "In Design Mode";
}
else
{
this.Text= "Runtime";
}
}
}
הפתרון הראשון (מאחד הCTPים)
הפתרון שמיקרוסופט מצאו בהתחלה היה קצת מפגר (קישור לבלוג של Urban Potato). מצד אחד, הם כן הפכו את הפרמטר הזה לפרמטר גלובאלי (אגב, גם בWinForms הייתה אפשרות דרך הLicenceManager לראות גלובאלית אם אנחנו בDesign Mode או לא.), מצד שני - הם סיבכו אותנו
קצת, והחזירו את זה רק בתור DependencyProperty דרך הAppDomain
זה נראה כך:
קוד:
bool IsDesignMode {
get {
DependencyProperty isDesignModeProperty = (DependencyProperty)AppDomain.CurrentDomain.GetDat a(“IsDesignModeProperty”);
return isDesignModeProperty == null ? false : true.Equals(isDesignModeProperty.GetValue(this));
}
}
הפתרון בהפצה הסופית
מתישהו בשלהי ספטמבר 2006, אחרי תגובה של טוקבקיסט בבלוג של Urban Potato, הם יצרו מטודה שמחזירה bool כמו שכולנו אוהבים.
השימוש הוא כדלקמן:
קוד:
public class CustomButton : Button
{
public CustomButton()
{
if (System.ComponentModel.DesignerProperties.GetIsInD esignMode(this))
{
Content = "In Design Mode";
}
else
{
Content = "Runtime";
}
}
}
זהו. זה הסוד. UserControl בWPF לא מממש את DesignMode, וזוהי הדרך לדעת את זה.
GetIsInDesignMode(). תכירו.
כתבתי את ההודעה הזאת אחרי שביליתי כמה שעות בניסיון למצוא את זה, ולצערי - Google לא עזר כ"כ.
בסופו של דבר, נמצאה האבידה בבלוג של See Win App
מילות מפתח לגוגל: DesignMode, WPF, Cider, IsDesignModeProperty, CLR 3.0
_____________________________________
דורון
|