none
Перетаскивание элементов в ListBox/ListView [c#, WPF] RRS feed

  • Общие обсуждения

  • Беда в следующем:

    Кое как нашел код для перетаскивания элементов:

    <ListBox x:Name="lb" Margin="147,10,10,10">
    	<ListBox.ItemContainerStyle>
    		<Style TargetType="{x:Type ListBoxItem}">
    			<Setter Property="AllowDrop" Value="True" />
    			<EventSetter
    				Event="ListBoxItem.PreviewMouseLeftButtonDown"
    				Handler="listBoxItem_PreviewMouseLeftButtonDown" />
    			<EventSetter
    				Event="ListBoxItem.Drop"
    				Handler="listBoxItem_Drop" />
    		</Style>
    	</ListBox.ItemContainerStyle>
    	<ListBox.ItemTemplate>
    		<DataTemplate>
    			<StackPanel Orientation="Vertical" >
    				<TextBlock Text="{Binding Title}" />
    				<TextBlock Text="{Binding Path}" />
    				<TextBlock Text="{Binding Param}" />
    			</StackPanel>
    		</DataTemplate>
    	</ListBox.ItemTemplate>
    </ListBox>
    void listBoxItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
    	if (sender is ListBoxItem)
    	{
    		ListBoxItem draggedItem = sender as ListBoxItem;
    		DragDrop.DoDragDrop(
    			draggedItem,
    			draggedItem.DataContext,
    			DragDropEffects.Move);
    		draggedItem.IsSelected = true;
    	}
    }
    
    void listBoxItem_Drop(object sender, DragEventArgs e)
    {
    	BaseElement droppedData =
    		(BaseElement)e.Data.GetData(typeof(BaseElement));
    	BaseElement target =
    		(BaseElement)((ListBoxItem)sender).DataContext;
    
    	int removedIdx = lb.Items.IndexOf(droppedData);
    	int targetIdx = lb.Items.IndexOf(target);
    
    	if (removedIdx < targetIdx)
    	{
    		xmlWorks.ReplaceTwoElementPosition(
    			target.Title,
    			droppedData.Title);
    		btRead_Click(null, null);
    		e.Handled = true;
    	}
    	else
    	{
    		int remIdx = removedIdx + 1;
    		if (lb.Items.Count + 1 > remIdx)
    		{
    			xmlWorks.ReplaceTwoElementPosition(
    				droppedData.Title,
    				target.Title);
    			btRead_Click(null, null);
    			e.Handled = true;
    		}
    	}
    }

    Код действительно работает и перетаскивает куда надо, но при этом выбранный элемент не подсвечивается!

    Т.е. теперь вообще нельзя выбрать элемент - только перетаскивать!

    Выставляю AllowDrop = False --- перетаскивание не работает, но работает все остальное!

    Как это вылечить? Может есть лучше способы реализации этой задачи?

    28 октября 2015 г. 21:18

Все ответы

  • Я не спец, но вдруг. Может вот это
    void listBoxItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
    	if (sender is ListBoxItem)
    	{
    		ListBoxItem draggedItem = sender as ListBoxItem;
    		DragDrop.DoDragDrop(
    			draggedItem,
    			draggedItem.DataContext,
    			DragDropEffects.Move);
    		draggedItem.IsSelected = true;
    	}
    }
    запихнуть  в PreviewMouseMove
    29 октября 2015 г. 4:44
  • К сожалению нет! Это тот же эффект, ток с припадками от движения мыши (чего и следовало ждать :) )

    Вопрос по прежнему открыт!

    29 октября 2015 г. 19:42