سؤال

لقد كتبت وظيفة إضافية بسيطة لبرنامج Visual Studio 2008 والتي تفتح جزء نافذة قابل للإرساء.

يمكنك تنزيل المصدر والمثبت الثنائي بالضغط هنا.

تعني طبيعة الوظيفة الإضافية أنه من الأفضل أن تظل راسية بجوار المكان الذي تقوم فيه بتحرير المصدر الخاص بك.لكن في بعض الأحيان، في بعض عمليات التثبيت، لن يظل مثبتًا.تقوم بتشغيل VS، وإرساء الجزء الخاص بي، وإيقاف تشغيل VS، وإعادة تشغيل VS، ثم الضغط عليه - يطفو الجزء مرة أخرى.في بعض الأجهزة لا بد لي من إعادة إرساءها في كل مرة.

ولكن في عمليات التثبيت الأخرى، يظل راسيًا أينما أضعه إلى الأبد.لقد اعتقدت في البداية أنه قد يكون هناك اختلاف بين نظامي التشغيل Vista وXP، ولكن لدي الآن تقارير تفيد بتعطل نظام التشغيل XP أيضًا.

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

أظن أن الجزء الوحيد ذي الصلة من الكود الخاص بي هو:

public class Connect : IDTExtensibility2
{
    private static DTE2 _applicationObject;
    private AddIn _addInInstance;
    private static CodeModelEvents _codeModelEvents;

    public static DTE2 VisualStudioApplication
    {
        get { return _applicationObject; }
    }

    public static CodeModelEvents CodeModelEvents
    {
        get { return _codeModelEvents; }
    }

    public static event EventHandler SourceChanged = delegate { };

    public void OnConnection(object application, 
           ext_ConnectMode connectMode, object addInInst, ref Array custom)
    {
        _applicationObject = (DTE2)application;
        _addInInstance = (AddIn)addInInst;
    }

    public void OnStartupComplete(ref Array custom)
    {
        try
        {
            Events2 events = (Events2)_applicationObject.Events;
            _codeModelEvents = events.get_CodeModelEvents(null);

            object objTemp = null;

            Windows2 toolWins = (Windows2)_applicationObject.Windows;

            Window toolWin = toolWins.CreateToolWindow2(
                _addInInstance, GetType().Assembly.Location, "Ora.OraPane", "Ora", 
                "{DC8A399C-D9B3-40f9-90E2-EAA16F0FBF94}", ref objTemp);
            toolWin.Visible = true;
        }
        catch (Exception ex)
        {
            MessageBox.Show("Exception: " + ex.Message);
        }
    }

    public void OnBeginShutdown(ref Array custom) { }

    public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom) { }

    public void OnAddInsUpdate(ref Array custom) { }
}

(تقترح مستندات MSDN أنه يجب إنشاء النافذة في OnConnection، ولكن إذا قمت بذلك فلن تظهر النافذة في الغالب.)

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

المحلول

لقد واجهت بعض مشكلات الإرساء نفسها مع TeamReview (http://www.codeplex.com/TeamReview).لا أستطيع أن أقول سبب حدوث ذلك ولكن يمكنني مساعدتك في توجيهك إلى التعليمات البرمجية التي تقوم دائمًا بتوثيق نافذتك في OnStartupComplete.إذا كان لديك موقع معين تريد أن تكون فيه، فيمكنك ربطه ليكون داخل إطار بعد إنشاء الأداة الخاصة بك وقبل استدعاء الخاصية المرئية.سيتعين عليك التحقق من الثوابت التي تناسب حالتك للطرق CreateLinkedWindowFrame وSetKind.قد ترغب أيضًا في ربط نافذتك بشيء آخر غير MainWindow مثل SolutionExplorer

EnvDTE80.Window2 frame = toolWins.CreateLinkedWindowFrame(toolWin, toolWin, vsLinkedWindowType.vsLinkedWindowTypeTabbed);


frame.SetKind(EnvDTE.vsWindowType.vsWindowTypeToolWindow);


_applicationObject.MainWindow.LinkedWindows.Add(frame);

frame.Activate();

هذه العينة مشابهة لما يلي: http://www.codeplex.com/TeamReview/SourceControl/changeset/view/16102# 2008 -> TeamReview -> Command -> ShowReplayWindowCommand.cs -> ShowForm()

هنا مثال جيد لمايكروسوفت لربط نافذة الإخراج ونافذة الأوامر ومستكشف الحلول معًا.ثم يتحكم في عرض هذه النوافذ المرتبطة وارتفاعها، ثم يقوم في النهاية بفصلها جميعًا عن إطار النافذة المرتبطة.

نصائح أخرى

ولدي نفس المشكلة حسب المؤلف. لقد لاحظت أن Visual ستوديو موقف 2005 "نسي" نافذة الأداة فقط بعد جلسات التي استخدمت التصحيح.

والجواب المقبول لا يساعد كثيرا لأن نافذة أداة دائما يحصل رست إلى أسفل. أنا حقا تريد أن يتمكن المستخدمون اختيار المكان الذي ترغب في قفص الاتهام وحفظ تفضيلها ببساطة عن طريق الالتحام حيث يحلو لهم.

وإليك ما ساعد بالنسبة لي. I استخدام Visual Studio 2005، ولكن هذا قد تساعدك أيضا.

public void OnBeginShutdown(ref Array custom)
{
     if (_toolWin != null)
          _toolWin.Visible = false;
}

وتحديد الرؤية toolwindow لأعمال خاطئة بشكل جيد. بفضل JK.

لإجابات السؤال JK حول الانفصال بعد التصحيح، وأنا أتساءل عما إذا كان التبديل devenv.exe / resetaddin في خصائص المشاريع التصحيح يتسبب بحدوث ذلك. ومن المؤكد أنه يعيد كل شيء آخر الدين يخلق.

فكرة: يتم إضافة التبديل / resetaddin تلقائيا إلى تكوين التصحيح عند إنشاء مشروع الدين. أنا معتاد وضع حرف غير صالح مثل 'س' حتى الخط من اسم الفئة في الأمر / resetaddin، بحيث يمكن بسهولة إعادة تمكين من خلال إزالة س عندما نريد إعادة تعيين ثابت. عادة ما يكون هناك حاجة لإعادة تعيين كل مرة نقوم تصحيح!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top