2013-02-25 68 views
1

我有一个ListBox一个MainControl和4个PreviewControls。我希望当我单击mainControl更改(发生这种情况)列表框中的项目。但我想添加一个dragg行为到listboxitems,所以我可以将一个listboxitem拖到其中一个previewControls。我试过这个,但是当我尝试拖动listboxitem时,selectionchanged事件总是被触发。Listbox单击并拖动

所以我想,当我做MouseLeftDown和移动listboxitem,做拖动。 当Click或MouseLefUp(selectionchanged)发生时,MainControl会发生变化。

我试过这个,但是PreviewMouseLeftButtonDown事件再次没有执行其他事件。

private void lstCameras_PreviewMouseLeftButtonDown_1(object sender, MouseButtonEventArgs e) 
    { 
     startPoint = e.GetPosition(null); 
     if (!Test) e.Handled = true; 
     else 
     { 
      Test = false; 
     } 
     Console.WriteLine("lstCameras_PreviewMouseLeftButtonDown_1 Handled = " + e.Handled); 
    } 

    private void lstCameras_PreviewMouseUp_1(object sender, MouseButtonEventArgs e) 
    { 
     Console.WriteLine("lstCameras_MouseUp_1"); 
     if (!Test) 
     { 
      Test = true; 
    lstCameras.RaiseEvent(new MouseButtonEventArgs(Mouse.PrimaryDevice, Environment.TickCount, MouseButton.Left) { RoutedEvent = ListBox.PreviewMouseLeftButtonDownEvent }); 
     } 
     else 
     { 
      Test = false; 
     } 
     Console.WriteLine("end lstCameras_MouseUp_1 Test = " + Test); 
    } 
+0

从这个问题的写作方式来看,情景和问题都很难辨别。请考虑重述/重述您的问题,并确保场景和问题本身都非常清晰。 – Sam 2013-02-26 06:56:22

+0

更改了它,如果问题不明确,很抱歉。 – 2013-02-26 09:46:15

+0

+1现在好多了。谢谢。 – Sam 2013-02-26 14:46:23

回答

1

不知道它是否是最好的方式,但它的工作原理。

private object GetDataFromListBox(ListBox source, Point point) 
    { 
     DependencyObject element = source.InputHitTest(point) as DependencyObject; 
     if (element != null) 
     { 
      object data = DependencyProperty.UnsetValue; 
      while (data == DependencyProperty.UnsetValue) 
      { 
       data = source.ItemContainerGenerator.ItemFromContainer(element); 
       if (data == DependencyProperty.UnsetValue) 
       { 
        element = (DependencyObject)VisualTreeHelper.GetParent(element); 
       } 
       if (element == source) 
       { 
        return null; 
       } 
      } 
      if (data != DependencyProperty.UnsetValue) 
      { 
       return data; 
      } 
     } 
     return null; 
    } 
    private void lstCameras_PreviewMouseMove_1(object sender, MouseEventArgs e) 
    { 
     Point mousePos = e.GetPosition(null); 
     Vector diff = startPoint - mousePos; 

     if (e.LeftButton == MouseButtonState.Pressed && this.DataContext != null && 
      (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance || 
      Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)) 
     { 
      ListBox parent = (ListBox)sender; 
      Item data = (Item)GetDataFromListBox(parent, e.GetPosition(parent)); 

      if (data != null) 
      { 
       DataObject dragData = new DataObject(typeof(Item), data); 
       DragDrop.DoDragDrop(this, dragData, DragDropEffects.All); 
      } 
     } 
    } 

    private void lstCameras_PreviewMouseDown_1(object sender, MouseButtonEventArgs e) 
    { 
     ListBox parent = (ListBox)sender; 
     Item data = (Item)GetDataFromListBox(parent, e.GetPosition(parent)); 

     if (data != null) 
     { 
      startPoint = e.GetPosition(null); 
      e.Handled = true; 
     } 
    } 

    private void lstCameras_PreviewMouseUp_1(object sender, MouseButtonEventArgs e) 
    { 
     ListBox parent = (ListBox)sender; 
     Item data = (Item)GetDataFromListBox(parent, e.GetPosition(parent)); 

     if (data != null) 
     { 
      lstCameras.SelectedItem = data; 
     } 
    } 
+0

了不起的工作。你对这个答案满意吗? – Sam 2013-02-26 14:47:37

+0

Wel它工作完美,但我不知道它是否是一种解决方法,因为我自己填充selectedItem属性。 – 2013-02-26 14:49:18

0

将链接到UserControl的事件更改为mouseup而不是单击。这样,只有完全点击才会触发改变用户控制的代码,并且拖动将不受阻碍地进行。 Here是一个链接到MSDN的MouseUp事件:)