VSpackage: تعديل نص شريط الأدوات/تلميح الأدوات في وقت التشغيل

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

سؤال

لقد قمت بتطوير امتداد Visual Studio كإضافة إلى VS2008/2010. يجب أن يتم الإصدار الجديد الآن كحزمة VSIX لـ VS2010 فقط (كما يجب أن يكون .NET 4 على أي حال) ، وأواجه بعض المشاكل (بسيطة إلى حد ما ، أعتقد) معالجة واجهة المستخدم.

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

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

في vspackage ، ما يعادل Microsoft.VisualStudio.Commandbars.CommandBarbutton يبدو أنه olemenucommand. العثور على أمر "التسمية" من خلال MenuCommandService لا توجد مشكلة ، وتعديلها حسب الحاجة.

لغرض معرفة كيفية القيام بذلك ، لدي فقط شريط أدوات مع زرين في مجموعة. btnaction هو بسيط جدا؛ مجرد أيقونة ومعالج تنفيذ لتغيير النص على الزر الآخر ، لا يوجد أمر قيادي.btnlabel يبدو هكذا في .vsct:

<Button guid="guidVSPackageBuilderTutorialCommandSet" id="btnLabel" priority="0x0100">
    <CommandFlag>DefaultDisabled</CommandFlag>
    <CommandFlag>DontCache</CommandFlag>
    <CommandFlag>NoCustomize</CommandFlag>
    <CommandFlag>TextChanges</CommandFlag>
    <CommandFlag>TextOnly</CommandFlag>
    <Strings>
        <CommandName>cmdidbtnLabel</CommandName>
        <ButtonText>btnLabel</ButtonText>
        <MenuText>btnLabel</MenuText>
        <ToolTipText>Tooltip btnLabel</ToolTipText>
    </Strings>
</Button>

المشكلة الأولى في هذا هي ذلك عندما أستخدم Textchanges, ، ال نص تلميح الأداة يتم تجاهل السلسلة و زر كتابة يستخدم في البداية لملالية الأدوات كذلك.

رمز المعالج لزر الإجراء هو كما يلي:

private int iClickCount = 0;

protected override void btnActionExecuteHandler(object sender, EventArgs e)
{
    var svc = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;

    CommandID idBtnLabel = new CommandID(GuidList.guidVSPackageBuilderTutorialCmdSet, (int)PkgCmdIDList.btnLabel);
    var cmd = svc.FindCommand(idBtnLabel) as OleMenuCommand;

    cmd.Text = "Clicked " + (++iClickCount) + " times";
}

هذا يغير التسمية التوضيحية btnlabel كما هو متوقع ، ولكن نظرًا لعدم وجود طريقة لتحديد تلميح الأدوات بشكل صريح ( olemenucommand الكائن فقط نص الممتلكات ، على عكس CommandBarbutton, ، على حد سواء التسمية التوضيحية و نص تلميح الأداة) ، يتم ضبط تلميح الأدوات دائمًا على نفس السلسلة مثل التسمية التوضيحية. من ما أفهمه ، هذا لأنه مع FindCommand () لا أحصل في الواقع على زر واجهة المستخدم ، ولكن فقط الأمر الأساسي ، الذي لا يهتم بتلميحات الأدوات.

ما هو أكثر إرباكًا هو ما يحدث عندما أستخدم TextChangesbutton CommandFlag بدلا من Textchanges. سيقوم الزر الآن بعرض نص تلميح الأدوات المحدد في .vsct ، ولكن لن يتغير التسمية التوضيحية أو تلميح الأدوات عند النقر فوق الزر الآخر - على الرغم من أنني عندما أتحقق من btnlabel القيادة نص الخاصية ، يتم تعيينه على ما أتوقعه ("نقر X Times"). يفعل TextChangesbutton نوع من "Decouple" خصائص الأمر والزر؟ إذا كان الأمر كذلك ، فهذا ما أريده إلى حد كبير (لا يهمني الأمر ، حيث لا يوجد شيء يمكن تنفيذه على أي حال ؛ btnlabel سيتم تعطيل دائمًا) ، ولكن كيف يمكنني الوصول إلى الزر وخصائصه الخاصة؟

لقد بحثت من خلال واجهات IVS المختلفة وخدمات SVS ، لكنني لم أتمكن من العثور على شيء مناسب ، ولا يبدو أن الوثائق (ومساعدة Intellisense) واسعة للغاية.

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

المحلول

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

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