the_king
مدیرکل انجمن
در استایلی که من کد نویسی کردم زمینه آیتم بصورت کامل رنگ شده بود، یا سفید بود یا آبی. فضای خالی نداشت که بگید Style ئه TabItem پوشش نداد.
ItemsControl موقع ایجاد آیتم ها از ItemContainerStyle به عنوان Style استفاده می کنه، Style ئه یک آیتم خاص نیست، یک Style مستقل ئه که ممکنه صد تا آیتم ازش استفاده کنند.
فتوای جدید ئه که ComboBox باید TabItem داشته باشه؟ در ComboBox Styles and Templates ئه TabItem هست؟اول اینکه کنترل هایی که دارای آیتم هستند (مثل combobox و TabControl و ...) ، دارای بخشی بنام TabItem هستند .
ItemContainerStyle جزئی از ItemsControl ئه، پس هر کلاسی که وارث ItemsControl باشه ItemContainerStyle داره. کاری به این نداریم که چی آیتم داره و چی نداره، اصل قضیه اینه که وارث ItemsControl باشه.و پروپرتی ای بنام ItemContainerStyle دارند که میشه بهش استایل داد (و بنابراین Template هم میشه داد) که این استایل و تمپلیت ، استایل و شکل بخش آیتم ها را مشخص میکنه . در واقع ، وقتی به ItemContainerStyle ، استایل و تمپلیست میدیم ، اولا فقط در حیطه ی یک آیتم اِعمال میشه (یعنی این جور نیست که وقتی یه Grid ای در استایل و تمپلیتِ مربوط به ItemContainerStyle رسم میکنیم ، کلِ آیتم های موجود را شامل بشه و به اندازه ی کل آیتم های اون کنترل بشه . بلکه فقط به اندازه ی یک آیتم هست) و دوما ، استایل ای که دادیم ، استایلِ همه ی آیتم های موجود خواهد شد . یعنی همه ی آیتم ها ، اون استایل را برای خودشون رسم میکنن .
ItemsControl موقع ایجاد آیتم ها از ItemContainerStyle به عنوان Style استفاده می کنه، Style ئه یک آیتم خاص نیست، یک Style مستقل ئه که ممکنه صد تا آیتم ازش استفاده کنند.
بدیهی است که جایی که محل TabItem نیست ربطی به Style ئه TabItem نداره.بنابراین چون در این پروپرتی ، فقط به اندازه ی هر آیتمِ اون کنترل میتونیم رسم انجام بدیم ، اگه بخوایم بیشتر از فضای اون آیتم ، رسم ای انجام بدیم ، توسط این پروپرتی ، نمیتونیم و باید برای کل اون کنترل (یعنی توسط پروپرتیِ Template یا پروپرتیِ Style اون کنترل) رسم انجام بدیم .
پایین آیتم با پشت آیتم دو موقعیت مکانی جدا است، وقتی یک آیتمی فرضا رنگش سفید ئه، پشت اش قرمز هم باشه همچنان رنگ سفید دیده میشه، نه قرمز. اگر رنگش هم بکنید دیده نمیشه. پایین آیتم هم که اصلا جزئی از کادر آیتم ها نیست.مثلا مثل همین کاری که میخواستم بدم و در بخشِ پایینِ آیتم های TabControl (پشت زمینه ی آیتم هاش) ، چیزی رسم کنم . چون در محدوده ی بیرونِ از آیتم هاست ، بنابراین توسط پروپرتیِ ItemContainerStyle نمیشه و باید توسط پروپرتیِ Template یا پروپرتیِ Style مربوط به TabControl ، این کار را انجام بدم .
بله، TabItem برای فضای داخل تک تک آیتم ها است، فضای اطراف مجموعه اش رو پوشش نمیده. اون یک TabPanel ئه که TabItem ها داخلش قرار گرفته.یا اگه بخوایم دورِ کلِ آیتم های این کنترل ها (کنترل TabControl یا combobox) ، یه border رسم کنیم ، باز هم توسط پروپرتیِ ItemContainerStyle نمیشه و باید توسط پروپرتیِ Template یا پروپرتیِ Style مربوط به این کنترل ها ، این کار را انجام بدیم .
بله.دوم اینکه پروپرتیِ Template ای که در کنترل ها هست ، باعث میشه کلِ اون کنترل را از نو رسم کنیم . اما همونطور که در نکته ی اول گفتم ، پروپرتیِ ItemContainerStyle ئه مربوط به اون کنترل ، باعث میشه استایل و تمپلیت هایی که فقط مربوط به بخش آیتم های اون کنترل هستند را رسم کنیم .
بله.سوم اینکه در کنترل TabControl ، هر TabItem ، پروپرتی ای بنام Template و Style داره که بصورت اختصاصی میتونیم فقط استایل های مربوط به همون TabItem را تغییر بدیم (برخلاف پروپرتیِ ItemContainerStyle ئه TabControl که باهاش همه ی TabItem را میتونیم با هم به یک شکل ، استایل بدیم) .
بنابراین پروپرتی Template و Style ئه مربوط به TabItem ها ، زمانی به درد میخوره که بخوایم استایل یه آیتم خاص را تغییر بدیم . مثلا یه آیتم ، اندازه ی پیش فرض اش نسبت به بقیه ی آیتم ها بزرگ تر باشه یا هر تغییر دیگه ای .
بله، ContentPresenter ربطی به ControlTemplate ئه TabItem ها نداره و در ControlTemplate ئه خود TabControl توصیف شده.چهارم اینکه در کنترل TabControl ها ، TabItem ، فقط بخشِ قسمتِ بالایی (سربرگ ها) را میگن (یعنی فقط بخشی که بصورت پیش فرض متن شون ، TabItem نوشته هست) . یعنی بخش محتوای TabControl (که داخل هر کدوم از صفحات شون ، کنترل های مختلف مون را قرار میدیم) ، جزء TabItem ها به حساب نمیان.
نمیفهمم چی میگید، حرف شما اینه که اگر در Content تگ <Border> نوشته بشه <ContentPresenter> اشکالی نداره و لازم نیست که حتما Border یک ContentControl باشه. حرفتون درسته ولی اصلا بود و نبود ContentPresenter ربطی به خود Border نداره، شما دارید برای TabItem که یک ContentControl ئه کد توصیفی می نویسید. Border یک المنت رو به عنوان فرزند قبول می کنه که داخلش نشون بده، چه ContentPresenter باشه چه چیز دیگری فرقی بحال Border نمیکنه. ContentPresenter کاری به این نداره که داخل چی قرار گرفته، Border باشه یا Grid یا اصلا هیچی. وجود اون ContentPresenter از اونجا معنی داره که در توصیف TabItem ئه، در توصیف یک ContentControl ئه. به Border ربطی نداره.اولا ContentPresenter ، لازم نیست که فقط برای کنترل هایی از نوع ContentControl بکار برده بشه . چون ContentPresenter که در کد بالا (برای Border) اومد ، اون Border که از نوع ContentControl نیست.
ContentSource مربوط به ContentControl نیست، مربوط به خود ContentPresenter ئه. میتونه محتواش اسم فیلد یا پروپرتی یا المنت خاصی باشه اما از نظر فنی نام چیز خاصی نیست، صرفا یک رشته string ئه، فقط یک پیشوند نام ئه. برای نامگذاری محتویات ContentPresenter ئه بکار برده میشه. شرح اش رو در سایت مایکروسافت بخونید.دوما ، پروپرتی ContentSource مربوط به ContentControl ، یعنی اینکه نام پروپرتی ای را بهش بدیم که محتوای اون را نشون بده؟ اینه قضیه اش؟
اگه اینه ، پس در کد اول که ContentSource="SelectedContent" هست ، اون SelectedContent چیه و از کجا آورد؟
اگه این نیست ، پس در کد دوم که ContentSource="Header" هست ، منظورش همون Header ئه مربوط به هر TabItem هه دیگه ؟ (چون نوع ControlTemplate مون ، TabItem هست دیگه) .