2011-12-07 2 views
0

저는 WPF 및 C#을 사용하여 기본 드래그 앤 드롭 기능을 꽤 성공적으로 구현해 왔습니다. 나는 그것을 구현 한 후에 항상 하나의 문제를 가지고있다 ... 어떤 이유로, 드래그 앤 드롭 기능은 ListBoxItem이 (첫 번째 클릭에서) 선택되지 않게한다.WPF DragDrop 동작을 구현하면 첫 번째 클릭에서 ListBoxItem이 선택되지 않는 이유는 무엇입니까?

ListBoxItem을 클릭했지만 드래그하지 않으면 선택되지 않고 드래그 아이콘이 잠깐 나타납니다. 다음 번 클릭시 ListBoxItem 중 하나를 선택할 수 있으며 끌기 아이콘이 나타나지 않습니다. 그런 다음이주기가 반복됩니다. 첫 번째 클릭이 선택되지 않고 두 번째 클릭이 선택됩니다.

다음은 Micorsoft MCTS 70-511 '교육 키트'북에서 가져온 내 끌어서 놓기 코드의 일반적인 구현 방법입니다.

private void ListBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    object data = (ListBoxItem)(FrameworkElement)sender; 
    if (data != null) DragDrop.DoDragDrop(ListBox, data, DragDropEffects.Copy); 
    e.Handled = false; 
} 

private void ListBox_DragEnter(object sender, DragEventArgs e) 
{ 
    if (e.Data.GetDataPresent(typeof(ListBoxItem))) e.Effects = DragDropEffects.Copy; 
} 

private void ListBox_Drop(object sender, DragEventArgs e) 
{ 
    object data = e.Data.GetData(typeof(ListBoxItem)); 
    if (data != null) DoSomethingWith((DataType)((ListBoxItem)data).DataContext); 
} 

드래그 앤 드롭 잘 작동하지만 항목 선택 ... 나는 ListBox_PreviewMouseLeftButtonDown 핸들러에서 e.Handled = false을 추가하여 ListBoxItem 선택 메커니즘은 클릭 이벤트를 처리 할 수있는 것으로 추정하지 않습니다, 그러나 그것은 결코 도달하지 멀리. 나는 또한 MouseLeftButtonDown 처리기에서 드래그 개시를 처리하려고

PreviewMouseLeftButtonDown 핸들러의 instaed하지만 ListBoxItem 선택 메커니즘은 클릭 이벤트를 처리하며 그 드래그 앤 드롭 핸들러를 도달하지 못했다.

끌어 놓기 작업을 시작하고 클릭 한 ListBoxItem이 여전히 선택되어 있어야하지만 아직 찾을 수 없었습니다 ... 모든 단서는 누구입니까?

UPDATE >>>에 대한 링크를 제공 @icebat은 MSDN 문서에

덕분에, 내가 드래그를 얻을 완벽하게 작동 드롭 기능을 관리했습니다.

private void SourceListBox_MouseMove(object sender, MouseButtonEventArgs e) 
{ 
    if (e.LeftButton == MouseButtonState.Pressed) 
    { 
     object data = ((ListBox)(FrameworkElement)sender).SelectedItem; 
     if (data != null) 
      DragDrop.DoDragDrop(SourceListBox, data, DragDropEffects.Copy); 
    } 
} 

private void TargetListBox_DragOver(object sender, DragEventArgs e) 
{ 
    if (e.Data.GetDataPresent(typeof(DragObject))) e.Effects = DragDropEffects.Copy; 
} 

private void TargetListBox_Drop(object sender, DragEventArgs e) 
{ 
    object data = e.Data.GetData(typeof(DragObject)); 
    if (data != null) DoSomethingWith((DragObject)data); 
} 

답변

2

그냥 드래그 앤 드롭 대신 MouseDown의 MouseMove 이벤트를 사용하여 다음과 같이 지금이다. MSDN의 Drag and Drop article에서 자세한 정보와 코드를 찾을 수 있습니다.

+0

아, 그게 내가 찾고 있던거야! 많은 감사합니다. – Sheridan

관련 문제