PDA

View Full Version : drag and drop درlistbox



یاسردرا
سه شنبه 03 مرداد 1391, 20:03 عصر
سلام.
دوستان با دراگ کردن بین دو لیست باکس مشکلی ندارم ولی بین خود ایتم مشکل دارم کسی میتونه کمک کنه؟90182البته این عکس متعلق به listviewهستش بنده برایlistboxمیخوام(البته گمون نکنم فرقی داشته باشه)

یاسردرا
چهارشنبه 04 مرداد 1391, 05:25 صبح
کسی بهش برخورد نکرده؟؟؟؟؟؟؟؟
جستجو هم کردم ولی مطلب بدرد بخور و واضح پیدا نکردم.

یاسردرا
چهارشنبه 04 مرداد 1391, 16:48 عصر
یه نمونه هم پیدا کردم.ولی کسی میتونه کمی توضیح بده تا بدونیم چی به چیه؟؟؟؟؟

Amir Oveisi
شنبه 07 مرداد 1391, 00:06 صبح
فایل ضمیمه شما رو به صورت اجمالی دیدم، فکر کنم از کامپوننت های telerik‌ استفاده شده توش.
حالا از اون بگذریم...

اینجا رو بخونید اطلاعات خوبی در مورد Drag & Drop تو WPF‌داده که به دید میخوره.
http://msdn.microsoft.com/en-us/library/ms742859.aspx

و اما در مورد سوالتون:
بر اساس اصولی که برای Drag & Drop وجود داره، شما باید یک data، یک source و یک target داشته باشید تا بتونید data‌ رو از source‌ به target درگش کنید.
تو موردی که شما مطرح کردید، source و target همون listbox هست و data‌هم میشه اون item از listbox‌ که میخواید drag بشه.
پس کافیه که این مقادیر رو بدست بیاریم تا بتونیم عمل DD رو انجام بدیم. برای این کار فرض کنید ما یک listbox داریم که توش ۵ تا textblock قرار دادیم:

ListBox Name="listbox1" AllowDrop="True" PreviewMouseLeftButtonDown="ListBox_PreviewMouseLeftButtonDown_1" Drop="ListBox_Drop_1">
<TextBlock>item 1</TextBlock>
<TextBlock>item 2</TextBlock>
<TextBlock>item 3</TextBlock>
<TextBlock>item 4</TextBlock>
<TextBlock>item 5</TextBlock>
</ListBox>

دقت کنید که برای listbox خاصیت AllowDrop رو True مقدار دادم تا امکان drop‌ کردن توش وجود داشته باشه.
بعد برای اینکه بتونم item ای که میخواد drag بشه رو پیدا کنم، رویداد previewmouseleftbuttondown رو برای listbox‌ هندل کردم و در اون، textblock‌ ای رو که mouse روی اون قرار داره رو (از روی point فعلی mouse) بدست میارم. بعدش با متد DragDrop.DoDragDrop عمل DD رو شروع می کنم. این متد سه تا پارامتر داره که تو لینکی که معرفی کردم توضیح داده شده.
حالا مونده این که هر موقع آیتم A روی آیتم B دراپ شد، آیتم B‌ بره پایین تر و آیتم A‌ بیاد به جای B.
برای این کار باید رویداد Drop‌ رو برای listbox هندل کنیم و تو اون data (که در بالا توضیح دادم چیه) رو بگیریم (که میشه همون آیتم A) و بعد تشخیص بدیم که الان mouse‌ روی چه آیتمی هست (که مثلا اینجا گفتیم روی آیتم B هست). بعد از اینکه این دو مورد رو بدست آوردیم، کافیه ایندکس B‌ رو پیدا کنیم و A‌ رو از listbox حذف کنیم (تا از مکان قبلیش برداشته بشه) و اونو به جای ایندکس B توی listbox‌ امون insert کنیم.

برای رویداد PreviewMouseLeftButtonDown:
private void ListBox_PreviewMouseLeftButtonDown_1(object sender, MouseButtonEventArgs e)
{
ListBox parent = sender as ListBox;
TextBlock data = GetElementFromPoint(parent, e.GetPosition(parent)) as TextBlock;
if (data != null)
{
DragDrop.DoDragDrop(parent, data, DragDropEffects.Move);
}
}

اینم متدی که یک element رو بر اساس point فعلی mouse بدست میاره:
private object GetElementFromPoint(ListBox source, Point point)
{
UIElement element = source.InputHitTest(point) as UIElement;
if (element != null)
{
object data = DependencyProperty.UnsetValue;
while (data == DependencyProperty.UnsetValue)
{
data = source.ItemContainerGenerator.ItemFromContainer(el ement);
if (data == DependencyProperty.UnsetValue)
element = VisualTreeHelper.GetParent(element) as UIElement;
if (element == source)
return null;
}
if (data != DependencyProperty.UnsetValue)
return data;
}

return null;
}

و اینم رویداد Drop:
private void ListBox_Drop_1(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(TextBlock)))
{
ListBox parent = sender as ListBox;
TextBlock draggingObject = e.Data.GetData(typeof(TextBlock)) as TextBlock;
TextBlock dropingObject = GetElementFromPoint(parent, e.GetPosition(parent)) as TextBlock;
int dropIndex = listbox1.Items.IndexOf(dropingObject);
listbox1.Items.Remove(draggingObject);
listbox1.Items.Insert(dropIndex, draggingObject);
}
}

موفق باشید

یاسردرا
دوشنبه 09 مرداد 1391, 02:50 صبح
مث اینه کا زیاد دارم سوال میکنم ولی دوباره یه مورد ذهنمو مشغول کرده:
برای انتخاب ایتم ها مثل ویندوز اگه دیده باشد کلا ایتم ها رو با موس می گیرید.یعنی ایتم ها داخل همون مستطیل ابی قرار می گیرن.
اثاث کار باید چجوری باشه؟////
یا از چجوری تشخیص بدم مستطیل که با موس رسم کردم چه ایتمی زیر شه بعد selectبشه؟؟؟؟///
:لبخند:می دونم خیلی ابتدایی ولی سخت نگیرید.