2016-09-28 32 views
0

在我的Visio加载项中,我创建了一些没有几何图形,只有文本的图形。下面的C#代码被用来在Visio页面的中心,以创建文本:文本形状创建在C#加载项中创建Visio 2016形状

Master MyMaster = MyStencil.Masters["Navigation"]; 

Shape MyShape = MyPage.Drop(MyMaster, PageRight/2.0, PageTop/2.0); 

MyShape.Text = "Some text"; 

double ShapeLeft, ShapeBottom, ShapeRight, ShapeTop; 

MyShape.BoundingBox((short)VisBoundingBoxArgs.visBBoxUprightText, 
    out ShapeLeft, out ShapeBottom, out ShapeRight, out ShapeTop); 

后其边框计算生成页面的其他组件。在早期版本的Visio的完美工作,但不是在Visio在Visio 2010和Visio 2013 2016

文字形状边框是:在Visio 2016

ShapeLeft = 5.48 
ShapeBottom = 4.05 
ShapeRight = 6.20 
ShapeTop = 4.21 

形状边框是:

ShapeLeft = 0.0 
ShapeBottom = 0.0 
ShapeRight = -1.0 
ShapeTop = -1.0 

Visio 2016中Shape.BoundingBox()方法有什么问题?

谢谢

萨尔

+0

嗨,我确认我看到2013年和2016年之间的相同差异,并已与Visio团队一起提出。 – JohnGoldsmith

+0

@JohnGoldsmith - 你听说过Visio团队的消息吗?您是否认为我们可以预料在任何传入的Office 2016 SP中都会遇到问题的解决方案? – Sal

+0

嗨,只是为了更新,对此的修复似乎是现在的方式:https://support.microsoft.com/en-gb/help/3203473/july-5-2017-update-for-visio- 2016-kb3203473 – JohnGoldsmith

回答

0

我可以瑞普这个藏汉但也有一些细节这一点,建议的BoundingBox()在visio16工作正常,

Shape.BoundingBox()接受标志作为第一个参数,就像这里提到的“((short)Visio.VisBoundingBoxArgs.visBBoxUprightText”,用于获取文本包围的矩形的边界框。下面是catch,Shape.BoundingBox()方法检查Shape .type()在这种情况下返回为矩形,并且该标志表示获取t的边界框ext结束于失败的情况,因此观察到输出。

上面的语句就可以用这里提供的信息进行验证, https://msdn.microsoft.com/en-us/library/office/ff766755.aspx

“如果BoundingBox的方法返回一个错误,或者如果它被要求返回矩形封闭零种形状,返回的矩形为{左: 0,bottom:0,right:-1,top:-1};否则,返回的矩形右侧小于或等于(< =),底部小于或等于(< =返回的是内部单位(英寸)。“

此外,为了验证BoundingBox()返回正确的值,我们可以尝试使用“visBBoxUprightWH”标志,它给出了我们正在查询边界框的矩形的确切边界框。 (下面的代码)

private void button1_Click(object sender, RibbonControlEventArgs e) 
{ 
     Visio::Application application = Globals.ThisAddIn.Application; 
     Visio::Page page = application.ActivePage; 
     Visio::Document basicStencil = application.Documents.OpenEx("basic_u.vssx", (short)(Visio.VisOpenSaveArgs.visOpenRO | Visio.VisOpenSaveArgs.visOpenHidden)); 
     var master = basicStencil.Masters.ItemU["Rectangle"]; 
     double pinX = 5.5; 
     double pinY = 5.5; 
     double height = 2.0; 
     double width = 2.0; 
     Visio::Shape shape = page.Drop(master, pinX, pinY); 
     String text = "I am here"; 
     shape.Text = text; 
     Visio.Cell cell = shape.get_CellsU("Height"); 
     cell.ResultIUForce = height; 
     cell = shape.get_CellsU("Width"); 
     cell.ResultIUForce = width; 


     double Left = 0.0; 
     double Right = 0.0; 
     double Bottom = 0.0; 
     double Top = 0.0; 
       shape.BoundingBox((short)Visio.VisBoundingBoxArgs.visBBoxDrawingCoords, out Left, out Bottom, out Right, out Top); 
     Console.WriteLine(Left);  //4.5 
     Console.WriteLine(Right); //6.5 
     Console.WriteLine(Bottom); //6.5 
     Console.WriteLine(Top);  //4.5 
} 

的Visio内部首先获取实际矩形内的文字的临时矩形,然后调用该温度矩形形状的BoundingBox方法每当使用标志“visBBoxUprightText”,而查询所述的BoundingBox()最终能正常工作,没有任何失败。

+0

BoundingBox方法可以正常工作,但在OP没有几何体的情况下不能正常工作。2013年的相同代码按预期执行,因此两个版本之间存在差异,应该不存在。 – JohnGoldsmith

+0

做了进一步的调查,并因此发现了最近对Shape.BoundingBox()方法所做的一些更改。对于解决方法可以使用Shape.VisualBoundingBox() – bluemoonstudios