2016-09-28 6 views
0

In meinem Visio-Add-In erstelle ich einige Formen, die keine Geometrie haben, nur Text. Im Anschluss an C# -Code wird verwendet, Texte im Zentrum von Visio-Seite zu erstellen:Erstellen von Visio 2016-Shapes in C# -Add-in

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); 

Nachdem der Text Form Begrenzungsrahmens andere Komponenten der Seite zu generieren erstellt wird berechnet. Das funktionierte perfekt in früheren Versionen von Visio, aber nicht in Visio 2016.

Text Form Begrenzungsrahmen in Visio 2010 und Visio 2013 war:

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

Form Begrenzungsrahmen in Visio 2016:

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

Was ist falsch mit der Methode Shape.BoundingBox() in Visio 2016?

Danke,

Sal

+0

Hallo, ich bestätige, dass ich den gleichen Unterschied zwischen 2013 und 2016 sehe und es mit dem Visio-Team erhöht habe. – JohnGoldsmith

+0

@JohnGoldsmith - haben Sie Neuigkeiten vom Visio-Team erfahren? Glauben Sie, dass wir eine Lösung für das Problem in einem eingehenden Office 2016 SP erwarten können? – Sal

+0

Hallo, nur um zu aktualisieren, dass die Lösung dafür scheint, auf dem Weg zu sein: https://support.microsoft.com/en-gb/help/3203473/july-5-2017-update-for-visio- 2016-kb3203473 – JohnGoldsmith

Antwort

0

ich diese als gut repro konnte aber es gibt einige Details dazu, die BoundingBox vorschlagen() in visio16 fein arbeitet,

Shape.BoundingBox() nimmt Flagge als erster Parameter, der wie hier erwähnt "((kurz) Visio.VisBoundingBoxArgs.visBBoxUprightText" ist und der verwendet wird, um die Begrenzungsbox des Rechtecks ​​zu erhalten, das der Text umschließt. Hier ist der Haken, die Shape.BoundingBox() -Methode prüft auf die Form .type(), die in diesem Fall als Rechteck zurückgegeben wird und das Flag sagt, um die Bounding Box für das t zu erhalten ext, was zu einem Fehlerfall und damit zu einer beobachteten Ausgabe führt.

obige Aussage kann mit der hier gegebenen Informationen bestätigt werden, https://msdn.microsoft.com/en-us/library/office/ff766755.aspx

„Wenn die BoundingBox Methode einen Fehler zurückgibt, oder wenn er gefragt wird, das Rechteck umschließt Null Formen zurückzukehren, das Rechteck zurückgegeben wird, ist {left: 0, unten: 0, rechts: -1, oben: -1}, andernfalls ist das zurückgegebene Rechteck kleiner oder gleich (< =) rechts und unten kleiner oder gleich (< =) oben zurückgegeben werden in internen Einheiten (Zoll). "

Auch um zu überprüfen, dass BoundingBox() den richtigen Wert zurückgibt, können wir versuchen, das Flag "visBBoxUpreightWH" zu verwenden, das den genauen Begrenzungsrahmen für das Rechteck angibt, nach dem wir den Begrenzungsrahmen abfragen. (Code unten)

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 intern erhält zuerst das temporäre Rechteck des Textes innerhalb des tatsächlichen Rechtecks ​​und ruft dann das Begrenzungsrechteck-Verfahren auf dieser Form Temp Rechtecks, wenn das Flag „visBBoxUprightText“ verwendet, während für die BoundingBox abfragt() was letztendlich ohne Fehler funktioniert.

+0

Die BoundingBox-Methode funktioniert ordnungsgemäß für normale Geometrie, aber nicht im OP, wo die Form keine Geometrie hat.Derselbe Code im Jahr 2013 funktioniert wie erwartet, daher gibt es einen Unterschied zwischen den beiden Versionen, die nicht vorhanden sein sollten. – JohnGoldsmith

+0

Wurde die weitere Untersuchung durchgeführt und festgestellt, dass einige Änderungen an der Shape.BoundingBox() -Methode vorgenommen wurden, die dies verursacht haben. Für eine Problemumgehung kann Shape.VisualBoundingBox() verwendet werden – bluemoonstudios