VSpackage: تعديل نص شريط الأدوات/تلميح الأدوات في وقت التشغيل
-
26-09-2019 - |
سؤال
لقد قمت بتطوير امتداد 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 ، والعثور على شريط الأدوات الخاص بي وعناصر التحكم الخاصة بي والتعامل معها ببساطة كخطوط أوامر ، تمامًا كما فعلت في الوظيفة الإضافية الخاصة بي.