C# VSTO中的透明控件

C# VSTO中的透明控件,c#,vsto,C#,Vsto,我正在尝试使用vsto将一些windows窗体控件添加到工作表中。我希望它们是透明的(这样Excel中的实际内容是可见的) 我的winforms用户控件构造函数如下所示: public Tag() { InitializeComponent(); this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); BackColor = Color.Transparent

我正在尝试使用vsto将一些windows窗体控件添加到工作表中。我希望它们是透明的(这样Excel中的实际内容是可见的)

我的winforms用户控件构造函数如下所示:

    public Tag()
    {
        InitializeComponent();
        this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        BackColor = Color.Transparent;
    }
void Application_WorkbookOpen(Excel.Workbook Wb)
{
  var nativeSheet = Wb.ActiveSheet as Excel.Worksheet;

  if (nativeSheet != null)
  {
    var tag = new Tag();
    var vstoSheet = nativeSheet.GetVstoObject();
    var range = nativeSheet.Range["A1", missing];
    vstoSheet.Controls.AddControl(tag, range, Guid.NewGuid().ToString());
  }
}
我添加了如下控件:

    public Tag()
    {
        InitializeComponent();
        this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        BackColor = Color.Transparent;
    }
void Application_WorkbookOpen(Excel.Workbook Wb)
{
  var nativeSheet = Wb.ActiveSheet as Excel.Worksheet;

  if (nativeSheet != null)
  {
    var tag = new Tag();
    var vstoSheet = nativeSheet.GetVstoObject();
    var range = nativeSheet.Range["A1", missing];
    vstoSheet.Controls.AddControl(tag, range, Guid.NewGuid().ToString());
  }
}
如果有一些内容单元格A1,它将被控件覆盖(单元格将显示为纯白色)


有人对此有什么想法吗?

如MSDN中所述:

当Windows窗体控件托管在Office文档上时,该控件 未直接嵌入到文档中。一个名为 Windows窗体控件主机首先添加到文档表面,然后 控件主机充当添加的每个Windows窗体控件的主机 文件也是如此

你可以自己看看:

var btn = new ImageButton();
btn.Name = "link1";
btn.Text = controlText;
btn.Click += new EventHandler(btn_Click);
vstoWorksheet.Controls.AddControl(pic, nativeWorksheet.Range[address], controlText);


 public class ImageButton : Control, IButtonControl
    {
        public ImageButton()
        {
            SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            SetStyle(ControlStyles.Opaque, true);
            SetStyle(ControlStyles.ResizeRedraw, true);
            this.BackColor = Color.Transparent;

        }

        protected override void OnPaint(PaintEventArgs pevent)
        {
            Graphics g = pevent.Graphics;
            g.DrawRectangle(Pens.Black, this.ClientRectangle);
        }    

        protected override void OnPaintBackground(PaintEventArgs pevent)
        {
            // don't call the base class
            //base.OnPaintBackground(pevent);
        }    

        protected override CreateParams CreateParams
        {
            get
            {
                const int WS_EX_TRANSPARENT = 0x20;
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= WS_EX_TRANSPARENT;
                return cp;
            }
        }    
        // rest of class here...          
    }

+1,但是一些微软的人。。。