2011-12-23 40 views
6

Tôi đã phát triển Hộp thoại giống như IntelliSense, sẽ xuất hiện trên một phím bấm cụ thể. (Dự án của tôi là gói VS, hộp thoại của tôi sẽ được mở dưới dạng lệnh) Vấn đề là, tôi không biết cách hiển thị hộp thoại của mình tại vị trí con trỏ hiện tại. Có nhiều cách dễ dàng để xử lý văn bản hiện được chọn, ví dụ: vớiCách lấy vị trí tuyệt đối của con trỏ văn bản trong phần mở rộng của Visual Studio 2010

TextSelection objSel = (EnvDTE.TextSelection)(dte.ActiveDocument.Selection); 

nhưng tôi không thể có được vị trí tuyệt đối ở đây.

Tôi đã tìm kiếm rất nhiều nhưng không tìm thấy bất kỳ thứ gì có thể giúp tôi. Có thể ai đó có thể cho tôi một gợi ý hay - ví dụ mã tốt hơn để giải quyết vấn đề của tôi. Tôi thực sự đánh giá cao sự giúp đỡ của bạn!

Trả lời

6

Tôi đang làm chính xác điều tương tự trong dự án hiện tại, vì vậy, đây là bản sao và dán mã có liên quan. Tôi tạo đối tượng activeWpfTextView ở nơi khác bằng cách sử dụng câu trả lời sau: Find an IVsTextView or IWpfTextView for a given ProjectItem, in VS 2010 RC extension.

private IVsWindowFrame GetWindow() 
    { 
     // parent is the Microsoft.VisualStudio.Shell.ToolWindowPane 
     // containing this UserControl given in the constructor. 
     var window = (ToolWindowPane)parent.GetIVsWindowPane(); 
     return (IVsWindowFrame)window.Frame; 
    } 

    private void DoShow() 
    { 
     var window = GetWindow(); 

     var textViewOrigin = (activeWpfTextView as UIElement).PointToScreen(new Point(0, 0)); 

     var caretPos = activeWpfTextView.Caret.Position.BufferPosition; 
     var charBounds = activeWpfTextView 
      .GetTextViewLineContainingBufferPosition(caretPos) 
      .GetCharacterBounds(caretPos); 
     double textBottom = charBounds.Bottom; 
     double textX = charBounds.Right; 

     Guid guid = default(Guid); 
     double newLeft = textViewOrigin.X + textX - activeWpfTextView.ViewportLeft; 
     double newTop = textViewOrigin.Y + textBottom - activeWpfTextView.ViewportTop; 
     window.SetFramePos(VSSETFRAMEPOS.SFP_fMove, ref guid, 
      (int)newLeft, (int)newTop, 
      0, 0); 

     window.Show(); 
     resultsList.Focus(); 
    } 
+0

'parent' trong mã này là gì? –

+1

Đã thêm nhận xét trong mã làm rõ nơi 'parent' xuất phát. – perelman

Các vấn đề liên quan