2014-10-27 22 views
6

tworzę Word Add-In oraz w celu umożliwienia przeciągania coś z panelu niestandardowych zadań z dokumentem, śledzę następujący przewodnik: http://msdn.microsoft.com/en-us/library/office/hh780901(v=office.14).aspxSłowo Add-In przeciągnij-upuść na dokumencie

Nie są pewne realne wady przy użyciu tego podejścia.

Po pierwsze, przezroczysty formularz Windows (lub WPF w moim przypadku), który przechwytuje zdarzenie upuszczenia, jest wielkością okna, a nie dokumentu, a RangeFromPoint zawsze zwraca wartość, nawet jeśli nie znajdujemy się nad dokumentem (na przykład, jeśli mamy nad wstążką). Po przeciągnięciu elementu i utworzeniu tego formularza, bez względu na to, gdzie go upuścisz, zostanie on umieszczony w dokumencie. Nie ma żadnego zgrabnego sposobu anulowania po rozpoczęciu.

Moje pytanie brzmi:

ktoś zrobić żadnej pracy metody przeciągnij i upuść w MS Word, a znalazł lepszy sposób poradzić niż dostarczony przykład przez Microsoft?

Byłoby miło albo użyć obecnego rozwiązania, ale wiedzieć, kiedy użytkownik nie przeciąga nad dokumentem lub czy przezroczyste okno pokazuje się tylko w obszarze dokumentu.

+0

Masz jeszcze odpowiedź? – vothaison

Odpowiedz

0

Mam nadzieję, że już otrzymałeś odpowiedź.

Mam rozwiązanie na własną rękę.

Więc moje wymóg:

mam okienko niestandardowy, który zawiera listbox, każdy element jest normalny ciąg. Kiedy przeciągam element z pola listy do dokumentu, w określonej lokalizacji, chcę wstawić pole scalania w tej lokalizacji. Nazwa pola scalania jest tekstem pozycji.

Z początku było to proste, wtedy dostałem problem, jak opisałeś w swoim pytaniu.

o kodzie

Tak, tam jest pole listy, trzeba obsłużyć mouseDown i mouseMove, nie martw się o mouseUp.

W procedurze obsługi myszki, zapisuję granicę, jeśli mysz zostanie przesunięta poza tę granicę, rozpocznie się przeciąganie.

Następnie, w listBox_MouseMoveHandler, sprawdzam pozycję myszy, aby uruchomić przeciągnięcie. I muszę użyć metody DragDropEffects.Copy dla metody DoDragDrop.

DoDragDrop((sender as ListControl).SelectedValue, DragDropEffects.Copy);

Dzięki tej możliwości, SelectedValue zostanie wstawiony w miejscu zrzutu, a po włożeniu zostanie ona również wybrana.

Następnie, po prostu sprawdzam, czy zaznaczenie nie jest puste, i zamień zaznaczony tekst na pole scalania. Oczywiście zawaliłem selekcję przed DoDragDrop. I to jest cała sztuczka.

private int _selectedItemIndex; 

    private Rectangle dragBoxFromMouseDown; 

    private void CustomizationForListBox(ListBox listBox) 
    { 
     listBox.ItemHeight = 25; 
     listBox.DrawMode = DrawMode.OwnerDrawFixed; 
     listBox.DrawItem += ListBox_DrawItem; 
     listBox.MouseDoubleClick += listBox_MouseDoubleClick; 
     listBox.MouseMove += listBox_MouseMoveHandler; 
     listBox.MouseUp += listBox_MouseUp; 

     listBox.MouseDown += (sender, e) => 
     { 
      // Handle drag/drop 
      if (e.Button == MouseButtons.Left) 
      { 
       _selectedItemIndex = listBox.IndexFromPoint(e.Location); 

       // Remember the point where the mouse down occurred. The DragSize indicates 
       // the size that the mouse can move before a drag event should be started.     
       Size dragSize = SystemInformation.DragSize; 

       // Create a rectangle using the DragSize, with the mouse position being 
       // at the center of the rectangle. 
       dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width/2), 
                   e.Y - (dragSize.Height/2)), dragSize); 
      } 
     }; 

    } 

    private void listBox_MouseUp(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Left) 
     { 
      // Reset the drag rectangle when the mouse button is raised. 
      dragBoxFromMouseDown = Rectangle.Empty; 
     } 

    } 

    private void listBox_MouseMoveHandler(object sender, MouseEventArgs e) 
    { 
     // Handle drag and drop 
     // To check if the Mouse left button is clicked 
     if ((e.Button & MouseButtons.Left) == MouseButtons.Left) 
     { 
      // If the mouse moves outside the rectangle, start the drag. 
      if (dragBoxFromMouseDown != Rectangle.Empty && 
       !dragBoxFromMouseDown.Contains(e.X, e.Y)) 
      { 
       // Collapse current selection, now we know nothing is selected 
       Globals.ThisAddIn.Application.Selection.Collapse(WdCollapseDirection.wdCollapseEnd); 

       //Start Drag Drop 
       DoDragDrop((sender as ListControl).SelectedValue, DragDropEffects.Copy); 
       if (_selectedItemIndex != -1) 
       { 
        // If the drag/drop was successful, there dropped text must be selected 
        if (!String.IsNullOrWhiteSpace(Globals.ThisAddIn.Application.Selection.Text)) 
        { 

// Replace the selected text with a merge field MergeFieldHelper.InsertSingleMergeField(mergeFieldInfos[_selectedItemIndex].Name); } } } } }