2016-09-28 31 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