أضف رمزًا إلى نافذة المحرر الحالية في حزمة/موسع الاستوديو المرئي
-
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();
}));