このループを閉じるために、この問題を抱えている他の誰かが私ほど多くの時間を無駄にしないことを願って、回避策を共有しています。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 { }
最初の投稿で述べたように、これを行うためのよりクリーンな方法があると確信しています。命を救ってくれる人を見つけることができませんでした。