4 Stimmen

Blockieren einer OpenFile in einem Visual Studio Addin

Ich habe ein Visual Studio 2008 Addin, das, wenn ich eine bestimmte Tastenkombination drücke, eine bestimmte Datei öffnet (je nach Kontext der Tastenkombination unterschiedlich) und dann diese Datei nach einer bestimmten Zeichenfolge durchsucht (wiederum kontextabhängig). Die meiste Zeit funktioniert dies einwandfrei, aber manchmal, wenn die Datei, die es öffnet, zu groß ist, schlägt die Suche fehl.

Hier ist ein Codeschnipsel:

Window xmlWindow = Commands.Application.ItemOperations.OpenFile(objectFilename, EnvDTE.Constants.vsViewKindPrimary);
Find find = xmlWindow.Document.DTE.Find;
find.Action = vsFindAction.vsFindActionFind;
find.FindWhat = String.Format("Name=\"{0}\"", objectLocalName);
if (find.Execute() == vsFindResult.vsFindResultFound) {
     MessageBox.Show("Found!");
}

1. Gibt es eine Möglichkeit, es immer funktionieren zu lassen (z.B. durch Blockieren der OpenFile)?

2. Eine weniger wichtige Frage: Gibt es eine Möglichkeit, auf diese Weise zu suchen, ohne dass die Ergebnisse im Fenster "Suchergebnisse" landen (was dazu führt, dass meine alten Ergebnisse durch diese Suche, die nur dazu dient, den Cursor zu diesem Teil der Datei zu bringen, gelöscht werden)?

11voto

WiredPrairie Punkte 56901

Wenn OpenFile sich asynchron verhält, würde ich vorschlagen, dass Sie die Logik ändern, um sich auf ein anderes Ereignis zu stützen, eines, das sich darauf stützt, dass das Dokument aktiviert wird.

Haben Sie zum Beispiel versucht, OpenFile mit Ihrer Tastenkombination auszulösen und dann die Suche in eine Warteschlange zu stellen, damit sie später von einem VS-Ereignis verarbeitet wird? (Der folgende Code stammt aus einem Visual Studio 2010-Addin, aber ich glaube, die Ereignisse sind dieselben).

// Vergewissern Sie sich, dass es sich um Klassenvariablen handelt, da sie andernfalls möglicherweise nicht korrekt in die GC aufgenommen werden und die COM-Interaktion unterbrechen private WindowEvents _winEvents = null; private DTE2 _applicationObject;

in der Verbindung:

_events = _applicationObject.Events;
_winEvents = _events.get_WindowEvents();

_winEvents.WindowActivated += new _dispWindowEvents_WindowActivatedEventHandler(WindowActivated);

Dann würden Sie etwas Code in die WindowActivated:

void WindowActivated(Window GotFocus, Window LostFocus)
        {
            Document gotFocusDoc = GotFocus.Document;
            if (gotFocusDoc != null)
            {
                string fileExt = Path.GetExtension(gotFocusDoc.Name);

Dort suchen Sie nach der Datei, die Sie scannen möchten (Sie müssen vielleicht eine Liste führen usw.).

Was die zweite Frage betrifft, so können Sie das Dokument selbst einscannen, sobald Sie Zugang zu dem Dokument haben, wie ich es oben vorgeschlagen habe.

0voto

Mikhail Nasyrov Punkte 880

Ich denke, dass die Methode DTE.ItemOperations.OpenFile() synchron ist. Versuchen Sie, einen folgenden Codeschnipsel für VS2008 zu verwenden.

using EnvDTE;

Window win = _applicationObject.ItemOperations.OpenFile(@"path-to-xml-file", Constants.vsViewKindPrimary);
TextDocument doc = win.Document.Object("TextDocument") as TextDocument;
if (doc != null)
{
    EditPoint searchStart = doc.StartPoint.CreateEditPoint();
    EditPoint endOfFoundText = null;
    TextRanges ranges = null;

    bool result = searchStart.FindPattern("Text-to-search", (int)vsFindOptions.vsFindOptionsNone, ref endOfFoundText, ref ranges);
    if (result)
    {
        // Result is bounded by searchStart and endOfFoundText points.
        System.Windows.Forms.MessageBox.Show("BINGO! Found at " + searchStart.Line.ToString());
    }
}

Wenn Sie ein Problem mit dem Fangen eines geöffneten Fensters haben, schlage ich vor, den Quellcode meiner Erweiterung zu überprüfen WordLight : Es gibt eine WindowWatcher-Klasse, die die Erstellung von Textansichten verfolgt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X