PDA

View Full Version : میشه یه توضیحی درباره ItemsPresenter بدید ؟



mdssoft
یک شنبه 09 فروردین 1388, 19:47 عصر
با سلام.

من چند منبع درباره ItemsPresenter خوندم ، از جمله MSDN . اما چیز زیادی دستگیرم نشد.
میشه شما یه توضیح ساده ای درباره ItemsPresenter بدید .

ممنون از شما.

Mahdi.Kiani
دوشنبه 10 فروردین 1388, 00:30 صبح
یصورت خیلی ساده، زمانی که بخواهید برای کنترل های آیتم دار، مانند ListBox، ComboBox و ... یک template جدید تعریف کنید، بایستی محلی را که آیتم های این کنترل باید درون آن قرار گیرند را درون Template مشخص کنید. برای این منظور از ItemsPresenter استفاده میشه.
در همین راستا ItemsPanel برای تعریف Panel ای می باشد که آیتم های یک کنترل را درون خود نگه می دارد. در واقع شیوه نمایثش آن ها را کنترل می کند. بعنوان مثال می توانید یک ListBox داشته باشدی که آیتم های درون آن به شیوه افقی چیده شوند.
چیزی شبیه به نمونه زیر




<ListBox VerticalAlignment="Top" HorizontalAlignment="Center" >
<ListBoxItem>Item1</ListBoxItem>
<ListBoxItem>Item2</ListBoxItem>
<ListBoxItem>Item3</ListBoxItem>
<ListBoxItem>Item4</ListBoxItem>
<ListBoxItem>Item5</ListBoxItem>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel
Orientation="Horizontal"
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>



http://www.gigaimage.com/images/0t5f387qlv00ol7sbr4.png

mdssoft
دوشنبه 10 فروردین 1388, 00:34 صبح
ممنون آقای کیانی . خیلی عالی توضیح دادید .
میشه با همین ItemsPresenter یه ButtonTemplate ساخت که یه عکس داشته باشه و توسط کاربر عوض شه ؟

Mahdi.Kiani
دوشنبه 10 فروردین 1388, 09:26 صبح
برای ساخت Template برای Button نیازی به ItemPresenter نیست.Button جرء کنترل های محتوایی بشمار میرود (Content Controls) بنابرا ین به ContentPresenter نیاز دارد./
اما جواب سوالتون بسیار سادست.یک Resource Dictionary ایجاد و Template مربوط Button را درون آن تعریف کنید. یک کنترل Image نیز درون Template قرار دهید.(هر جایی که می خواهید عکس درون آن قرار گیرد)
یک کلاس نیز اضافه کنید و آن را به Resource Dictionary ساخته شده در مرحله قبل ارتباط دهید.
حال درون کلاس یک Property تعریف کنید. سپس کنترل Image را به این پروپرتی بایند کنید. حال موقع استفاده از button جدید، یک خاصیت جدید هم به آن اضافه شده و...

mdssoft
دوشنبه 10 فروردین 1388, 10:07 صبح
یک کلاس نیز اضافه کنید و آن را به Resource Dictionary ساخته شده در مرحله قبل ارتباط دهید.
میشه منظورتون رو از این جمله بگید !

Mahdi.Kiani
دوشنبه 10 فروردین 1388, 11:41 صبح
میشه منظورتون رو از این جمله بگید !
با نحوه ارتباز دادن این دو مشکل دارید؟ یا اینکه کلا منظورم را متوجه نشدید؟

mdssoft
دوشنبه 10 فروردین 1388, 11:46 صبح
با نحوه ارتباز دادن این دو مشکل دارید؟ یا اینکه کلا منظورم را متوجه نشدید؟
نه من منظورتون رو از ارتباط دادن متوجه نشدم .
اگر ممکن هست نحوه ارتباط دادن رو توضیح بدید .

ممنون از شما

Mahdi.Kiani
دوشنبه 10 فروردین 1388, 12:55 عصر
در مورد نحوه ارتیاط دادن می توانید به اسکین هایی که در همین بخش گذاشتم مراجعه کنید.template هایی که برای Window ها تعریف کردم هر کدام به یک کلاس ارتباط داده شده اند تا بتوانند رفتار WIndow را مدیریت کند.

http://www.gigaimage.com/images/6bpjhmya6x82ou5b75fv.png

اما بطور خلاصه یک کلاس تعریف می کنید و در فایل Resource Dictionary با کد زیر آن را به کلاس مورد نظر ارتباز می دهید:




xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Class Address"

خط اول در فایل Resource موجود است.

اما در مورد مثال شما، بهتره که یک UserControl طراحی کنید. چون هنگام ارتباط کلاس به ResourceDictionry کلاس شما باید از ResourceDictionary ارث بری کند. در نتیجه امکان تعریف Dependency Property از بین خواهد رفت. و استفاده از CLR Property ها هم کارتون را مشکل می کنه..
این روشی که عرض کردم بیشتر برای مواردی کاربرد دارد که خاصیت مورد نظر درون خود کنترل موجود باشد. در اون صورت می توانید با بایند کردن آن براحتی از آن استفاده کنید.
بعنوان مثال اگر به اسکین Window ها نگاه کنید. برای آیکن من یک کنترل Image در Template تعریف کردم و مقدار آن را به Icon در Window بایند کردم. در نتیجه با تغییر Icon توسط کاربر، Image موجود در Template متناظر با آن تغییر خواهد کرد.

mdssoft
دوشنبه 10 فروردین 1388, 13:08 عصر
خیلی خیلی ممنون .
خیلی خوب توضیح دادید . ممنون :تشویق: