0

Visual Studio 2010 を使用して PowerPoint 2010 C# アドインを作成しています。アドインの機能の 1 つは、現在のスライドに図形を追加することです。ただし、図形がスライドに追加されたら、コピーされないようにする必要があります。それが私が問題に直面しているところです。すべてのアプリケーション レベルのイベントを確認しましたが、beforeCopy または beforePaste タイプのイベントは見られません。

私が今考えることができる唯一のオプションは、キーダウンイベントリスナーを追加して「ctrl + c」をリッスンし、形状が選択されている場合はそれをブロックしてから、カスタムの右クリックメニューを作成することです(まだできるかどうかもわかりません)私の形が選択されている場合は、「コピー」オプションを削除してください。ただし、より簡単なオプションが必要です。

ユーザーが図形をコピーできないようにする方法を知っている人はいますか?

4

2 に答える 2

2

組み込みのリボン ボタン Microsoft Office によって実行されるコマンドは、無効にしたり、再ルーティングしたりできます。Microsoft はこれを「転用」と呼んでいます。概要については、こちらを参照してください。

したがって、別のアプローチとして、組み込みの [コピー] ボタンを次のように「再利用」することもできます。(リボンをカスタマイズするには、GetCustomUI によって返される必要があります。上記のリンクを参照してください。)これにより、[コピー] ボタンによって実行されるアクションと、ボタンが有効かどうかを決定するコールバック メソッドが変更されます。

<command idMso="Copy" onAction="copyAction" getEnabled="copyEnabled" />

copyAction形状が選択されたときに戻るように実装してcancelDefault = true、コピーされないようにします。

形状が選択されている場合copyEnabledに返すように実装します。false選択変更イベントでボタンを無効にすることを忘れないでください。

実際には、両方のアプローチのいずれかで十分です。onAction実装しやすいと思います。

于 2012-08-24T14:07:33.837 に答える
0

このループを閉じるために、この問題を抱えている他の誰かが私ほど多くの時間を無駄にしないことを願って、回避策を共有しています。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 { }

最初の投稿で述べたように、これを行うためのよりクリーンな方法があると確信しています。命を救ってくれる人を見つけることができませんでした。

于 2012-08-23T09:33:19.717 に答える