只是为了结束这个循环,我正在分享我的解决方法,希望有这个问题的其他人不会像我在这方面浪费那么多时间。我最终只使用SlideSelectionChanged和WindowSelectionChange事件以及字典来删除已复制的对象。
首先,当我的形状被添加到舞台时,我在字典中添加了一个新条目,其中包含形状名称(在我的例子中,它实际上是一组形状)和它的 ID。
itemIDDictionary.Add(myGroup.Name, myGroup.Id);
WindowSelectionChange是一个相当简单的检查。它只是查看新选择的项目是否已经在字典中。如果是,则检查 ID 是否匹配。如果不是,它会删除该项目。这是因为当您复制和粘贴一个项目时,新粘贴的项目会自动在幻灯片上被选中。
public void itemSelectionChange(PowerPoint.Selection SelectedItem)
{
try
{
if (Globals.Ribbons.Ribbon2.itemIDDictionary.ContainsKey(SelectedItem.ShapeRange.Name))
{
for (int shapeIDCount = 0; shapeIDCount < Globals.Ribbons.Ribbon2.itemIDDictionary.Count; shapeIDCount++)
{
if (!Globals.Ribbons.Ribbon2.itemIDDictionary.ContainsValue(SelectedItem.ShapeRange[1].Id))
{
SelectedItem.Delete();
MessageBox.Show("You can not copy the browser object.\nAdd a new one using the ribbon bar");
}
}
}
}
catch {}
SlideSelectionChanged稍微复杂一点,因为我必须遍历幻灯片上的所有形状。
try
{
if (SldRange.Count > 0)
{
var showWarning = false;
for (int slideCount = 1; slideCount <= SldRange.Count; slideCount++)
{
int shapeCount = 1;
while (shapeCount <= SldRange[slideCount].Shapes.Count)
{
if (Globals.Ribbons.Ribbon2.itemIDDictionary.ContainsKey(SldRange[slideCount].Shapes[shapeCount].Name))
{
if (!Globals.Ribbons.Ribbon2.itemIDDictionary.ContainsValue(SldRange[slideCount].Shapes[shapeCount].Id))
{
SldRange[slideCount].Shapes[shapeCount].Delete();
showWarning = true;
}
else
{
shapeCount++;
}
}
else
{
shapeCount++;
}
}
}
if(showWarning == true)
{
MessageBox.Show("You can not copy the browser object.\nAdd a new one using the ribbon bar");
}
}
}
catch { }
正如我在最初的帖子中所说,我确信有一种更清洁的方法可以做到这一点。我只是找不到一个来救我的命。