Come posso rilevare le modifiche alla posizione del testo e del cursore in Word utilizzando VSTO

StackOverflow https://stackoverflow.com/questions/55735

  •  09-06-2019
  •  | 
  •  

Domanda

Voglio scrivere un componente aggiuntivo di parole che esegua alcuni calcoli e aggiorni alcune interfacce utente ogni volta che l'utente digita qualcosa o sposta il punto di inserimento corrente.Osservando i documenti MSDN, non vedo alcun modo ovvio come un evento TextTyped sul documento o sugli oggetti dell'applicazione.

Qualcuno sa se questo è possibile senza interrogare il documento?

È stato utile?

Soluzione

Come probabilmente avrai scoperto, La parola ha eventi, ma servono per azioni davvero grossolane come l'apertura di un documento o il passaggio a un altro documento.Immagino che MS lo abbia fatto intenzionalmente per evitare che una macro scadente rallenti la digitazione.

In breve, non esiste un ottimo modo per fare quello che vuoi. Un MVP di Word lo conferma in questo thread.

Altri suggerimenti

In realtà c'è un modo per eseguire del codice quando viene digitata una parola, puoi usare gli SmartTag e sovrascrivere il metodo Recognize, questo metodo verrà chiamato ogni volta che viene digitata una parola, il che significa ogni volta che l'utente digita del testo e preme lo spazio , TAB o inserisci tasti.

un problema con questo tuttavia è che se si modifica il testo utilizzando "Range.Text" lo rileverà come un cambio di parola e chiamerà la funzione in modo che possa causare loop infiniti.

Ecco del codice che ho usato per raggiungere questo obiettivo:

public class AutoBrandSmartTag : SmartTag
{
    Microsoft.Office.Interop.Word.Document cDoc;

    Microsoft.Office.Tools.Word.Action act = new Microsoft.Office.Tools.Word.Action("Test Action");

    public AutoBrandSmartTag(AutoBrandEngine.AutoBrandEngine _engine, Microsoft.Office.Interop.Word.Document _doc)
        : base("AutoBrandTool.com/SmartTag#AutoBrandSmartTag", "AutoBrand SmartTag")
    {
        this.cDoc = _doc;

        this.Actions = new Microsoft.Office.Tools.Word.Action[] { act };
    }

    protected override void Recognize(string text, Microsoft.Office.Interop.SmartTag.ISmartTagRecognizerSite site, 
        Microsoft.Office.Interop.SmartTag.ISmartTagTokenList tokenList)
    {
        if (tokenList.Count < 1)
            return;

        int start = 0;
        int length = 0;
        int index = tokenList.Count > 1 ? tokenList.Count - 1 : 1;

        ISmartTagToken token = tokenList.get_Item(index);

        start = token.Start;
        length = token.Length;
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top