如何解决VSTO C#单击时从文件夹添加按钮
我正在使用VSTO创建一个单词插件,我需要动态添加和删除按钮和组。 我想做的是创建一个按钮,在从浏览器选择路径后单击该按钮,然后将创建一个新组(或更新现有的组),其中包含与文件夹中每个文件相关的按钮。 我唯一缺少的部分是创建和删除组和按钮,根据互联网,这绝对是可能的,但是我找不到任何指南来指导我进行操作。
当前,我有一个要插入的按钮(Doc1_Click),它会插入从下拉列表中选择的文件的内容,从下拉列表中显示来自所选路径的docx,还有一个浏览按钮(browse0_Click),该按钮允许用户选择文件夹。
我创建了6个组(我的问题之一是组的数量是硬编码的,用户无法更改),这就是为什么我有2个带有6个插槽的阵列的原因。
在我看来,我想为每个按钮组创建文件夹中每个匹配的docx文件的按钮数量,并将子文件夹的数量(在主文件夹中)与组的数量相关联。
public partial class Ribbon1
{
String[] paths = new string[6]; //create list of paths correlated to each group
RibbonDropDown[] ddowns = new RibbonDropDown[6]; //create list of dropdown items for each group
private void Ribbon1_Load(object sender,RibbonUIEventArgs e)
{
ddowns[0] = dropDown0;
ddowns[1] = dropDown1;
ddowns[2] = dropDown2;
ddowns[3] = dropDown3;
ddowns[4] = dropDown4;
ddowns[5] = dropDown5;
paths[0] = Properties.Settings.Default.path0;
paths[1] = Properties.Settings.Default.path1;
paths[2] = Properties.Settings.Default.path2;
paths[3] = Properties.Settings.Default.path3;
paths[4] = Properties.Settings.Default.path4;
paths[5] = Properties.Settings.Default.path5;
for (int i = 0; i < 6; i++)
{
actual_loader(i); // load manualy each group
}
}
private void actual_loader(int num)
{
RibbonDropDownItem ddItem1;
ddowns[num].Items.Clear();
DirectoryInfo d = new DirectoryInfo(paths[num]);
FileInfo[] Files = d.GetFiles("*.docx"); //Getting Text files
foreach (FileInfo file in Files)
{
ddItem1 = Globals.Factory.GetRibbonFactory().CreateRibbonDropDownItem();
ddItem1.Label = file.Name;
ddowns[num].Items.Add(ddItem1);
}
}
private void Doc1_Click(object sender,RibbonControlEventArgs e)
{
GenericInsert(0);
}
//insert content from docx file into current position in file
private void GenericInsert(int num)
{
if (ddowns[num].Items.Count != 0)
{
Word.Document doc = Globals.ThisAddIn.GetActiveDoc();
doc.ActiveWindow.Selection.InsertFile(paths[num] + "\\" + ddowns[num].SelectedItem,"",false,false);
}
else
{
//print message Box
}
}
private void browse0_Click(object sender,RibbonControlEventArgs e)
{
browser(0);
}
//allow user to choose folder
private void browser(int num)
{
using (var fbd = new FolderbrowserDialog())
{
DialogResult result = fbd.ShowDialog();
if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(fbd.Selectedpath))
{
switchFunc(num,fbd.Selectedpath);
paths[num] = fbd.Selectedpath; //update path array
actual_loader(num);//refresh dropdown list
}
}
}
//save new path to properties,Couldn't find any other solution so I used a switch case
private void switchFunc(int num,String path)
{
switch (num)
{
case 0:
Properties.Settings.Default.path0 = path;
break;
case 1:
Properties.Settings.Default.path1 = path;
break;
case 2:
Properties.Settings.Default.path2 = path;
break;
case 3:
Properties.Settings.Default.path3 = path;
break;
case 4:
Properties.Settings.Default.path4 = path;
break;
case 5:
Properties.Settings.Default.path5 = path;
break;
}
Properties.Settings.Default.Save();
}
private void dropDown0_SelectionChanged(object sender,RibbonControlEventArgs e)
{
}
}
}
在此问题上的任何帮助将不胜感激。
谢谢
解决方法
您不能动态创建和删除功能区控件,但可以动态显示和隐藏它们以及更改其属性(标题,启用/禁用等)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。