بله. دست تون باز نیست که هر چیزی در اونجا بنویسید، نمی توانید بنویسید "{1+1}"= که موقع اجرا بشه 2 . محدود به مواردی هستید که برای اون قسمت تعریف شده.
سلامی مجدد
خیلی ممنون استاد .
آره میدونم . باید طبق قوانین و چیزهایی که در markup extention مربوط به اون دستور گفته (مثلا دستور StaticResource و یا هر دستور دیگه) ، عمل کنیم .
راستی استاد ، تفاوت StaticResource و DynamicResource چیه؟
من دیدم که بیشتر اوقات از دستور StaticResource استفاده میشه .
تفاوت شون هم فقط موقع فراخونی این دستورات هست دیگه؟ درسته؟ یعنی مثلا وقتی میخوایم توی Resource مربوط به کنترلی ، دیکشنری و کلا اشیاهایی تعریف کنیم ، خودمون تعریف میکنیم . یعنی موقع تعریف کردن ، مشخص نمیشه که Resource مون Static هست یا Dynamic . درسته؟ تفاوت ، فقط موقع فراخونی و استفاده از این Resource های تعریف شده هست که بصورت StaticResource یا DynamicResource بخوایم اونها را فراخونی کنیم . درسته؟
------------------------
بعد اینکه استاد ، من قشنگ این قضیه ی فضای نام ها را درک نکردم . الان این فضای نام هایی که با xlmns تعریف میشن ، در واقع برابر با همونی هستند که در سی شارپ ، از using استفاده میکردیم؟ (مثلا using System.Windows) ؟
و این مقادیر url ای که برای این فضای نام در نظر گرفته شد ، آیاد در مفسر xml در wpf ، مثلا تعریف شد که برای هر کدوم از این فضای نام (مثلا برای فضای نام با پیشوند x) ، یه مجموعه ای از فضای نام ها در دات نت استفاده بشه؟ یعنی وقتی مثلا فضای نام x (در xml) فراخونی شد ، این فضای نام ، دربرگیرنده ی مجموعه ای از فضای نام ها در دات نت (مثلا System.Windows و System.Windows.Controls و ...) میشه؟ و به این ترتیب هست که میشه در xml از فضای نام های دات نت و بنابراین از کلاس های دات نت ، استفاده کرد؟
اگه این طور هه ، مثلا بیاد یه کنترل یا کلا یه فضای نام ای از دات نت را بخوایم استفاده کنیم که در فضای نام های xml اش وجود نداره . در این صورت باید چجوری فضای نام دات نت را به xml اضافه کنیم (تا بتونیم از اون کنترل یا کلاس استفاده کنیم)؟
اگه این طور نیست ، پس من دقیق رابطه ی فضای نام xml و فضای نام دات نت را متوجه نشدم . یعنی متوجه نشدم که چجوری میشه که با استفاده از فضای نام پیش فرض xml (که بدون پیشوند هست) ، وقتی تگ Button را مینویسیم ، میدونه منظورمون اسمبلی PresentationFramework.dll و فضای نام System.Windows.Controls و کلاس Button هست؟
نه، Binding ئه، با اینکه بنویسید x = y فرق داره. احتمالا در Windows Forms هم با Binding کار نکردید. وقتی x رو Bind می کنید به y، هر زمان y تغییر کرد x هم عوض میشه، یعنی اگه شما بعد Bind کردن مقدار Foreground اون Button رو عوض کنید مقدار مشخصه Stroke در اون Ellipse هم عوض میشه. اون TemplateBinding برای این نیست که الان مقدار فلان رو بده به بهمان و دیگه بعدا کاری بهش نداشته باشه. Binding مقدار چیزی رو وابسته میکنه به تغییرات چیز دیگری.
کار که قبلا بصورت سطحی (شاید هم فقط در حد تئوری و نه عملی) کار کردم ولی نه چندان .
پس اولا پروپرتیِ Background از Button را توی پروپرتیِ Fill از شی Ellipse میریزه و هر وقت اگه مقدار پروپرتیِ Background از Button ، تغییر کنه ، مقدارپروپرتیِ Fill از شی Ellipse هم (به همون مقدار) ،تغییر میکنه . درسته؟
نه. Content اون دکمه تغییری نمی کنه، همون string ئه Button 2 میمونه. شما حتی اگر بعدا در حالی که اون ControlTemplate داره نمایش داده میشه Content اون دکمه رو با یک متن یا حتی یک المنت دیگه پر کنید همچنان اون Ellipse سرجاش داره نمایش داده میشه. زیبا است، نه؟
بله ولی از اون مهمتر، مشخص میکنه که در این ترکیب ظاهری جای Content کجا است، اگه مشخص اش نکنید ControlTemplate جایی برای نمایش اون Button نداره.
بله قشنگ هه
الان استاد ، من از Control Template این جوری متوجه شدم . ببینین درسته؟ :
خود (شیِ کلاسِ) ControlTemplate ، انگار چیز خاصی نیست . توش میتونیم مشخص کنیم که چه رسم هایی میشه توی کنترل مورد نظر ، انجام بدیم . اولا مثل قضیه ی Style ها ، باید TargetType اش را مشخص کنیم .
دوما 2 عنوان کلی را باید توش رسم یا مدیریت کنیم . اولی ، شکل دلخواه مون هست (که با هر کلاسی مثل Ellipse و ... میتونیم رسم کنیم) که بجای شکلِ رایجِ اون TargetType مون که مشخص کرده بودیم ، رسم میشه و دومی ، محتوا (یا پروپرتیِ Content) مربوط به اون TargetType مون که مشخص کرده بودیم را باید با کلاس ContentPresenter ، مدیریت و رسم و تراز اش را تنظیم کنیم .
درسته؟
پس با رسم مثلا Ellipse مون ، کلا رسم دکمه ، انجام نمیشه و بجاش رسم Ellipse مون جایگزین اش میشه دیگه . درسته؟
پس شبیه OnPaint در win form عمل میکنه . یعنی رسم اون کنترل را کلا نادیده میگیره و بجاش کاربر میتونه رسم دلخواهش را اون هم از ابتدا رسم کنه . درسته؟
----------------------------------------------
خوب حالا سئوال مهم اینها هستند :
1) چجوری میتونیم توی یه کنترل ، توسط Template ها ، برای یه کنترل که برای یه قسمت ، پروپرتی ای در نظر نگرفت را بهش پروپرتی داد؟
مثلا در کنترل CheckBox ، پروپرتی ای در نظر گرفته نشد که بتونیم رنگ پشت زمینه ی قسمت Content (اگه Content مون ، متن ساده باشه) را عوض کنیم .
اگه بخوایم این یه CheckBox شخصی برای خودمون در نظر بگیریم که این قابلیت را داشته باشه ، اول باید در ControlTemplate ، یک Grid رسم کنیم (به عنوان parent یا والد) . بعد داخلش یه کنترل دلخواه (مثلا یه Grid دیگه) رسم کنیم و لوکیشنِ این گرید جدید را جوری تنظیم کنیک که در پشت متن (context مربوط به CheckBox) بیفته (یا کلا در جایی که خودمون در نظر داریم) و بعد در Grid ئه والد ، یه CheckBox هم رسم کنیم که مشخصاتش را از CheckBox ای که در TargetType ئه مربوط به ControlTemplate مشخص کرده بودیم ، بگیره .
درسته؟ (کلا متوجه ی منظورم از این قسمتِ 1 شدین؟)
2) حالا اگه بخوایم یه قسمتی از یه کنترل را تغییر بدیم که استایل اش فرق کنه (منظورم از استایل ، پروپرتیِ Style نیست) . یعنی شکل اون بخش ، یه کم متفاوت باشه . یا رنگش متفاوت باشه . مثلا قسمتی که در چک باکس ، علامت و شکلِ "تیک" رسم میشه ، شکل "تیک" استایل اش فرق کنه . مثلا نوکِ رسمِ شکلِ "تیک" ، یه کم تیزتر باشه یا رنگ "تیک" فرق کنه . مثلا مثل شکل زیر که CheckBox در تنظیمات PowerDVD هست ، باشه :
اگه همچین شکلی بخوایم ، باید چی کار کنیم؟
اگه اون بخش "تیک" را بخوایم رنگش را هم تغییر بدیم ، چی؟
کلا راهکارش اینه که باید اون بخشِ "تیک" را خودمون توسط اشکالی که در دات نت و wpf هست ، از اول رسم کنیم یا نه؟
اگه اشتباه نکنم ، یه کلاس های Decorator (مثل BulletDecorator) برای این کارها تعبیه شدند. درسته؟
یعنی تعبیه شدند تا کارها و رسم هایی که براشون پروپرتی در نظر گرفته نشدند را انجام داد . درسته؟ حالا من دقیق این کلاس را نمیشناسم . چون تازه توی چند تا کد دیدم . این کلاس دقیقا برای چه کاری استفاده میشه؟
چون این کلاس خیلی عضو داره ، 4 تا 5 تا از مهمترین عضوهاشون را نام میبرین تا بررسی کنم؟
مثلا به عضو Bullet در این کلاس ، میتونیم کنترل بدیم . عضو مهم دیگه هم Child هست که این هم کنترل دریافت میکنه و با Bullet تراز میشه . (اگه درست گفته باشم) . کلا یه کم درباره ی این کلاس و کلا کلاس هایی که موقع رسم و زمان شخصی سازی کنترل ها کاربرد دارند را میگین؟
منظورم این نیست کد بدین .منظورم اینه که راهکارِ کلی برای رسیدن به این هدف (و یا در صورت نیاز ، کلاس هایی که برای این کار) لازم هست را اگه معرفی کنین ، ممنون میشم .
3) یا اگه ComboBox ای بخوایم شبیه اونچه که در تنظیمات PowerDVD هست ، رسم کنیم ، چطور؟ :
یعنی کلا بتونیم رنگ همه ی قسمت هاش را در نظر بگیریم و مدیریت کنیم ، چی کار باید کرد؟ (راهکار کلی اش منظورم هست) .
در ComboBox ، مقدار رنگ در پروپرتی Background و BorderBrush را عوض میکنم (بصورت بصری در پنجره ی Properties . نه بصورت کد نویسی) ، هیچ قسمت از رنگ هاش تغییر پیدا نمیکنه . چرا؟!
4) در کنترل های wpf ، یه کنترلی هست که شبیه RadPageView (که در کمپوننت های تلریک هست) باشه؟
چون RadPageView را میشه تقریبا همه ی قسمت هاش را تغییر داد و خوشکل اش کرد .
RadPageView هم شبیه TabControl در wpf هست اما خیلی خوشکل تر هه . جوری که اگه بخوایم TabControl را شبیه اون کنیم ، فکر کنم از اساس باید تغییرش بدیم .
خیلی زیاد شد . ببخشید
خیلی ممنون استاد