2016-05-23 15 views
0

コンテキストメニューボタンが1回だけ発生します。 起動時にbtnオブジェクトが終了します。どうすれば修正できますか?コンテキストメニューボタンがExcelアドインで1回発生します

どうすれば呼び出しオブジェクトを早期に修正できますか?

public partial class ThisAddIn 
{ 
    private void ThisAddIn_Startup(object sender, System.EventArgs e) 
    {       
     PicPaste btn = new PicPaste(this.Application);} 

class PicPaste 
{ 
    private Excel.Application application; 
    private Office.CommandBarButton picpasteMenuItem; 
    public PicPaste(Excel.Application app) 
    { 
     application = app; 
     CreatePicpasteBtn(); 
    } 

    public void CreatePicpasteBtn() 
    { 
     Office.MsoControlType contextMenuItem = Office.MsoControlType.msoControlButton; 
     Office.CommandBar commandBarCell = application.CommandBars["Cell"]; 
     picpasteMenuItem = commandBarCell.Controls.Add(contextMenuItem, Type.Missing, Type.Missing, 5, true) 
      as Office.CommandBarButton; 

     if (picpasteMenuItem != null) 
     { 
      picpasteMenuItem.Style = Office.MsoButtonStyle.msoButtonCaption; 
      picpasteMenuItem.Caption = "Вставить изображение в коммент"; 
      picpasteMenuItem.Click += new Office._CommandBarButtonEvents_ClickEventHandler(
       PicPasteMenuItemClick); 
     } 
    } 

    private static void PicPasteMenuItemClick(Office.CommandBarButton Ctrl, ref bool CancelDefault) 
    { 
     ...some code here 

    } 
} 

答えて

0

問題は、メソッド/イベントにオブジェクトPicPaste btn = new PicPaste(this.Application);を宣言し、インスタンス化していることです。つまり、この手順にスコープが設定されます。プロシージャが終了すると範囲外になり、最終的にガベージコレクションされます。

あなたは宣言クラスレベルであなたのアドインの寿命のために存在している必要があります任意のオブジェクトに必要 - すべての手続き外。その後、アドインがアンロードされるまでスコープ内に留まります。

ので、例えば:

public partial class ThisAddIn 
{ 
    PicPaste btn = null; 
    private void ThisAddIn_Startup(object sender, System.EventArgs e) 
    {       
    btn = new PicPaste(this.Application); 
    } 
0

が何らかの方法限られPicPasteインスタンスのスコープのように見えます。しかし、GCによるヒープからのスワイプを防ぐために、ソースオブジェクトをクラスレベルで定義したままにしておくのが正しい方法です。アドインクラスレベルなどで保存されるコントロールのリストを使用してみてください。

PicPaste btn = null; 
private void ThisAddIn_Startup(object sender, System.EventArgs e) 
{       
    btn = new PicPaste(this.Application); 
} 
関連する問題