2014-10-27 16 views
6

sto creando un Word Add-In e al fine di permettere il trascinamento qualcosa da un riquadro attività personalizzato al documento, ho seguito la seguente guida: http://msdn.microsoft.com/en-us/library/office/hh780901(v=office.14).aspxWord Add-In di trascinamento sul documento

Ci sono alcuni dei veri inconvenienti che utilizzano questo approccio.

In primo luogo, il Windows Form trasparente (o WPF nel mio caso) che rileva l'evento di rilascio è la dimensione della finestra, non del documento e RangeFromPoint restituisce sempre un valore, anche se non si trova sopra il documento (per esempio, se siamo sopra il nastro). Quindi, una volta trascinato qualcosa e questo modulo viene creato, non importa dove si rilascia, verrà inserito nel documento. Non esiste un modo elegante per annullare una volta che hai iniziato.

La mia domanda è:

Qualcuno ha fatto alcun lavoro con Drag and Drop in un Word Add In, e ha trovato un modo migliore per gestire la cosa che l'esempio fornito da Microsoft?

Sarebbe bello utilizzare la soluzione corrente, ma sapere quando l'utente non sta trascinando il documento o la finestra trasparente viene visualizzata solo sull'area del documento.

+0

hai ancora la tua risposta? – vothaison

risposta

0

Spero tu abbia già avuto la tua risposta.

Ho una soluzione per il mio.

Quindi, il mio requisito:

Ho un riquadro personalizzato, che contiene una casella di riepilogo, ogni elemento è una stringa normale. Quando trascino un elemento dalla casella di riepilogo nel documento, in una posizione specifica, voglio inserire un campo unione in quella posizione. Il nome del campo unione è il testo dell'articolo.

All'inizio era semplice, poi ho avuto un problema proprio come descrivi nella tua domanda.

Informazioni sul codice

Quindi, c'è una casella di riepilogo, è necessario gestire mouseDown e mouseMove, non ti preoccupare mouseUp.

Nel gestore mouseDown, registro il limite, se il mouse si sposta fuori da quel limite, il trascinamento avrà inizio.

Quindi, in listBox_MouseMoveHandler, controllo la posizione del mouse per avviare il trascinamento. E devo usare DragDropEffects.Copy per il metodo DoDragDrop.

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

Con tale opzione, SelectedValue verrà inserito nella posizione goccia, e dopo l'inserimento, sarà anche essere selezionati.

Quindi, controllo solo se la selezione non è vuota e sostituisco il testo selezionato con il campo unione. Ovviamente, ho interrotto la selezione prima dello DoDragDrop. E questo è l'intero trucco.

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); } } } } }

Problemi correlati