PowerPoint C#插件中的形状分组问题

3
我正在使用Visual Studio 2010开发PowerPoint 2010插件,在幻灯片上将两个对象组合时遇到了很大的问题。我试图在同一个函数中创建这两个对象并放置在幻灯片上,然后将它们组合起来。添加对象并将它们放置在幻灯片上没有问题,但是当涉及到组合部分时……
我已经尝试过:
PowerPoint._Application myPPT = Globals.ThisAddIn.Application;
PowerPoint.Slide curSlide = myPPT.ActiveWindow.View.Slide;
string[] myRangeArray = new string[2];
myRangeArray[0] =  "nameOfShape0";
myRangeArray[1] = "nameOfShape1";
curSlide.Shapes.Range(myRangeArray).Group();

并且

PowerPoint._Application myPPT = Globals.ThisAddIn.Application;
PowerPoint.Slide curSlide = myPPT.ActiveWindow.View.Slide;
curSlide.Shapes.Range(Array("nameOfShape0", "nameOfShape1")).Group();

两种方法都失败了。我对此感到相当沮丧,真的希望有善良的人能为我提供解决方案。谢谢。

更新: 以下是我使用的完整代码:

PowerPoint._Application myPPT = Globals.ThisAddIn.Application;
PowerPoint.Slide curSlide = myPPT.ActiveWindow.View.Slide;

PowerPoint.Shape browser = curSlide.Shapes.AddOLEObject(110, 70, 500, 400, "Shell.Explorer.2");
var slideName = "webBrowser_0";
browser.Name = slideName;

PowerPoint.Shape rectangle = curSlide.Shapes.AddShape(Microsoft.Office.Core.MsoAutoShapeType.msoShapeRectangle, 110, 70, 500, 400);
rectangle.Name = "shape2";
string[] myRangeArray = new string[2];
myRangeArray[0] = "webBrowser_0";
myRangeArray[1] = "shape2";
curSlide.Shapes.Range(myRangeArray).Group();

我收到的错误是“ShapeRange对象必须至少包含两个项”。
2个回答

5

你的代码对我来说很好用。尝试这样做:

private void ThisAddIn_Startup(object sender, System.EventArgs e) {
    this.Application.PresentationNewSlide += Application_PresentationNewSlide;
}

void Application_PresentationNewSlide(PowerPoint.Slide Sld) {
    PowerPoint.Shape textBox = Sld.Shapes.AddTextbox(Office.MsoTextOrientation.msoTextOrientationHorizontal, 0, 0, 500, 50);
    textBox.Name = "shape1";
    textBox.TextFrame.TextRange.InsertAfter("This text was added by using code.");

    textBox = Sld.Shapes.AddTextbox(Office.MsoTextOrientation.msoTextOrientationHorizontal, 0, 100, 500, 50);
    textBox.TextFrame.TextRange.InsertAfter("This text was also added by using code.");
    textBox.Name = "shape2";

    PowerPoint._Application myPPT = Globals.ThisAddIn.Application;
    PowerPoint.Slide curSlide = myPPT.ActiveWindow.View.Slide;
    string[] myRangeArray = new string[2];
    myRangeArray[0] = "shape1";
    myRangeArray[1] = "shape2";
    curSlide.Shapes.Range(myRangeArray).Group();
}

我测试了你的代码,它完全正常,这让我很想知道我做错了什么。唯一的区别就是我尝试使用的形状类型不同。我已经更新了我的初始帖子,其中包含我正在尝试使用的完整代码。谢谢。 - Dom
2
嗯...也许这是PowerPoint的某些限制。如果您运行代码并注释掉组部分,然后手动尝试在PowerPoint中进行分组,它不会让您选择该对象。 - aquinas
我也试了一下,你是完全正确的。我无法同时选择这两个对象。非常奇怪。嗯,我想我会把它存档到“尝试不成功”抽屉里然后继续进行。谢谢你的帮助。 - Dom

0
如果你要开始的幻灯片布局包括一个内容占位符或其他可以包含OLE对象的占位符,那么PPT可能会将新创建的OLE对象弹出到该占位符中。占位符不能与其他形状分组。如果这是问题所在,要么从不包括可以包含OLE对象的占位符的幻灯片布局开始,要么在创建OLE对象之前删除占位符,或者创建OLE对象,复制它(给你一个不包含在占位符中的OLE对象),然后删除原始对象。

感谢您的回复。幻灯片上没有占位符。我发现创建OLEObject和形状(使用AddShape)不能一起分组。但是,如果您创建两个OLEObject,则可以将它们分组在一起。因此,我创建了我的OLEObject 'Shell.Explorer.2',然后创建了OLEObject 'Forms.Label.1',它们可以分组。这很奇怪。 - Dom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接