開発環境
- Windows 10 Home
- Microsoft Visual Studio Community 2019 Version 16.8.4
- Microsoft .NET Framework Version 4.8.03752
はじめに
アドインで使用できるUIツールの一つSplitButtonは、上部にボタン、下部にメニュー(なかにボタン配置が可能)という形で構成されています。
ここでは、メニューの中のボタンをクリックしたら、上部のボタンのデザインや挙動を置き換える方法について説明します。
※ 独自のやり方なので、よりよい方法があれば教えてください。
イメージ
ユースケース
よく使うボタンがメニューのなかにあり、何度もメニューを開いてクリックするのが大変な場合、前回クリックしたボタンを上のボタンに設定しておくことで操作の煩雑さを回避できます。
既存のイベントの削除
SplitButtonにすでに設定されているイベントを削除します。
※ 削除しないとイベントが複数起床してしまいます
いま設定されているイベントを知る術が見つからず、設定されている可能性のあるイベントを片っ端から削除していきます。(もっとスマートにやりたい)
※ 設定されていないものを削除してもエラーにはなりません
splitButton.Click -= button_1_Click;
splitButton.Click -= button_2_Click;
splitButton.Click -= button_3_Click;
新しいボタンへ乗り換える
ここでは、button_1を押されたときを考えます。
必要なプロパティ情報をコピーしましょう。
private void button_1_Click(...)
{
splitButton.Label = button_1.Label;
splitButton.Tag = button_1.Tag;
splitButton.OfficeImageId = button_1.OfficeImageId;
splitButton.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(button_1_Click);
}
汎用関数を作成する
各ボタンのクリックイベントごとに上記のコードを追加していくのもイマイチなので、抽象化した関数を用意します。
private void changeEvent_splitButton(RibbonSplitButton btnDst, RibbonButton btnSrc)
{
btnDst.Click -= button_1_Click;
btnDst.Click -= button_2_Click;
btnDst.Click -= button_3_Click;
btnDst.Label = btnSrc.Label;
btnDst.Tag = btnSrc.Tag;
btnDst.OfficeImageId = btnSrc.OfficeImageId;
}
各ボタンのクリックイベントからは下記のようにCallします。
private void button_1_Click(...)
{
changeEvent_splitButton(splitButton, button_1);
splitButton.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(button_1_Click);
}
選択されたボタンを設定ファイルに保存する方法
ボタンを入れ替えたあと、その状態を次回起動時にも反映させたい場合の方法になります。
設定ファイルに保存する方法は下記を参考にしてください。
Excelアドイン(VSTO)で設定ファイルを扱う方法
- メニュー内のボタンそれぞれに**タグ名(Tag)**を付与します。
内容は何でもよいです。switch文で分岐するために利用します。 - 設定ファイルに、**splitButton(名前は何でもよいです)**を追加します
設定ファイルを読み込みUIに反映する
※ 先ほどの汎用関数を利用します
Properties.Settings setting = Properties.Settings.Default;
switch (setting.splitButton)
{
case "1":
changeEvent_splitButton(splitButton, button_1, button_1_Click);
splitButton.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(button_1_Click);
break;
case "2":
changeEvent_splitButton(splitButton, button_2, button_2_Click);
splitButton.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(button_2_Click);
break;
}
UIの状態を設定ファイルに保存する
Properties.Settings setting = Properties.Settings.Default;
setting.splitButton = splitButton.Tag.ToString();
setting.Save();
以上です。