أضف رمزًا إلى نافذة المحرر الحالية في حزمة/موسع الاستوديو المرئي

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

  •  29-09-2019
  •  | 
  •  

سؤال

كيف يمكنك إضافة/إزالة التعليمات البرمجية في محرر التعليمات البرمجية من امتداد؟

فمثلا:
لقد قمت بإنشاء سحرة ملحق يعدل الرمز من مقبس وارد
يستخدم المثال microsoft.visualstudio.text.editor

حاول استخدام:

IWpfTextView textView; // got from visual studio "Create" event ITextChange change; // Got from network socket or other source

ITextEdit edit = textView.TextBuffer.CreateEdit(); // Throws "Not Owner" Exception edit.Delete(change.OldSpan); edit.Insert(change.NewPosition, change.NewText);

لكنني أعتقد أن هناك طريقة أخرى لأن وظيفة crateedit () تفشل

هل كانت مفيدة؟

المحلول

المشكلة هنا هي أنك تحاول إجراء تعديل على ITextBuffer من خيط مختلف عن الذي يمتلكه. هذا ببساطة غير ممكن. ITextBuffer يتم تحديد الحالات إلى مؤشر ترابط معين بمجرد حدوث التحرير الأول وبعد تلك النقطة لا يمكن تحريرها من خيط مختلف. ال TakeThreadOwnership ستفشل الطريقة أيضًا بعد ITextBuffer تم تحديده. معظم طرق غير التحرير الأخرى (CurrentSnapshot على سبيل المثال) يمكن استدعاء من أي موضوع.

عادة ITextBuffer سيتم تحديدها إلى مؤشر ترابط واجهة المستخدم Visual Studio. لذلك لإجراء التحرير ، استخدم الأصل SynchronizationContext.Current مثيل أو Dispatcher.CurrentDispatcher من موضوع واجهة المستخدم للعودة إلى مؤشر ترابط واجهة المستخدم ثم قم بإجراء التحرير.

نصائح أخرى

هنا هو الرمز الذي اكتشفه

Dispatcher.Invoke(new Action(() =>
        {

            ITextEdit edit = _view.TextBuffer.CreateEdit();
            ITextSnapshot snapshot = edit.Snapshot;

            int position = snapshot.GetText().IndexOf("text:");
            edit.Delete(position, 5);
            edit.Insert(position, "some text");
            edit.Apply();
        }));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top