2011-12-19 2 views
0

Im ищет способ вставки формы MS Word в позицию курсора. На данный момент у меня есть следующий код, который вставляет форму в заранее определенном месте:Вставьте форму слова в позицию курсора

 Microsoft.Office.Interop.Word.Range CurrRange = Globals.ThisAddIn.Application.Selection.Range; 

     //Get the id of the MS Word shape to be inserted 
     int shapeId = (int)MsoAutoShapeType.msoShapeRoundedRectangle; 
     //Get the value of the name attribute from the selected tree view item 
     string nodeText = treeViewItem.GetAttribute("name"); 

     //Add a new shape to the MS Word designer and set shape properties 
     var shape = CurrRange.Document.Shapes.AddShape(shapeId, 170, 200, 100, 20); 
     shape.AlternativeText = String.Format("Alt {0}", nodeText); 
     shape.TextFrame.ContainingRange.Text = nodeText; 
     shape.TextFrame.ContainingRange.Font.Size = 8; 

Место, где форма получает вставлен жестко закодировано:

Это может быть видно из 2-го и 3-го параметров AddShape() метод:

170 = положение измеряется в точках к левому краю Автоформы

200 = положение, измеренной в точках к верхнему краю Автоформы

Я изучил свойства и методы моего объекта Range, но не могу найти ни одного, в котором хранятся требуемые значения позиции.

ответ

2

Последним параметром AddShape является Anchor, который ожидает объект диапазона. Попробуйте передавая свой диапазон в том, что:

var shape = CurrRange.Document.Shapes.AddShape(shapeId, 0, 0, 100, 20,CurrRange); 

Обновление: Похоже, что есть в Word 2010 документов, которые не уважают якорь bug. Сохраните документ как файл .doc и повторите проверку, он привязывает его к началу абзаца, если вы это сделаете. Ссылка выше только на форумы Microsoft, я не мог найти отчет об ошибке подключения для этой проблемы.

Обходной бы указать верхний и левый на основе расположения выбора:

Microsoft.Office.Interop.Word.Range CurrRange = Globals.ThisAddIn.Application.Selection.Range; 

//Get the id of the MS Word shape to be inserted 
int shapeId = (int)MsoAutoShapeType.msoShapeRoundedRectangle; 

//Get the value of the name attribute from the selected tree view item 
string nodeText = "Hello World"; 

var left = Globals.ThisAddIn.Application.Selection.get_Information(Microsoft.Office.Interop.Word.WdInformation.wdHorizontalPositionRelativeToPage); 
var top = Globals.ThisAddIn.Application.Selection.get_Information(Microsoft.Office.Interop.Word.WdInformation.wdVerticalPositionRelativeToPage); 

//Add a new shape to the MS Word designer and set shape properties 
var shape = CurrRange.Document.Shapes.AddShape(shapeId, left, top, 100, 20); 
shape.AlternativeText = String.Format("Alt {0}", nodeText); 
shape.TextFrame.ContainingRange.Text = nodeText; 
shape.TextFrame.ContainingRange.Font.Size = 8; 
+0

Я попытался это уже, это не work.The форма еще вставлена ​​в том же месте –

+0

Я обновил свой ответ с некоторой информацией, которую я нашел на форумах Microsoft. –

+0

Я также столкнулся с этим сообщением в msdn - http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/53d9baff-c10c-4655-822a-4c7a1b0fa885/ Однако значения слева и сверху всегда нужно увеличить на 70, иначе форма будет вставлена ​​на несколько см выше и слева от курсора ... Это очень странно, и я не совсем уверен, почему это нужно сделать, но похоже, что это работает. Спасибо для усилий, отмечая, как ответили –

Смежные вопросы