2013-02-25 67 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事件:)