3

C# コードの書式設定を行う小さなアドインを作成しました。アドインのExecメソッドで、次のことを行います

try {
    TextSelection selection = (EnvDTE.TextSelection)_applicationObject.ActiveDocument.Selection;
    String foo = String.Empty;                      
    if (!text.IsEmpty) {                            
    foo = someCoolObjectThatFormatsText.Format(selection.Text);
    selection.Text = foo;  // here everything gets painfully slow :-(
    }
}
catch (Exception) {
    throw;
}

コード「SelectedText.Text = foobar;」の行 が呼び出されると、VS は選択の各行を段階的に再構築します。このステップを実行している様子を簡単に見ることができます。しかし、なぜそんなに遅いのかわかりません。

ヒントはありますか?ティア

4

2 に答える 2

2

JFTR: TextSelection.Insert(...) を使用する必要がありましたが、ビジュアル スタジオのインデントの深さも取得するために、選択したテキストをいじって、選択範囲を最初と最後の行全体にまたがる必要がありました。

TextSelection text = (EnvDTE.TextSelection)_applicationObject.ActiveDocument.Selection;
text.SmartFormat(); //  sets the correct indention als studio
/* the following lines will expand the selection to whole lines: */
int lineSpan = text.BottomPoint.Line - text.TopPoint.Line;
text.MoveToPoint(text.TopPoint,false);                      
text.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstColumn,false);                       
text.LineDown(true,lineSpan);                       
text.EndOfLine(true);
/* and now my custom textformatting */
text.Insert(someCoolObjectThatFormatsText.Format(text.Text),(int)vsInsertFlags.vsInsertFlagsContainNewText);                                                                                    
text.Collapse();

これがテキスト選択を変更する良い方法かどうかはよくわかりませんが、うまく機能し、元のアドイン コードよりもはるかに高速です。

于 2009-07-08T08:09:10.150 に答える
0

私はアドインを使用していませんが、「ヒント」を要求しただけなので、ここに私のものがあります。

割り当てを行う前に、画面の更新を無効にしてみてください。

また、ヘルプファイルには次のように書かれています。

「Textプロパティが設定されている場合、Textの値は選択されたテキストの前に挿入されてから折りたたまれます。これは、テキストがドキュメントに貼り付けられた場合と同じです。このプロパティは、エディタが入力されているときと同じように動作することに注意してください。挿入(つまり、上書きしない)モードの場合。128番目以降のテキストはすべて切り捨てられます。」

これは、変数が期待どおりに上書きされていないことを意味しているようですが、代わりに追加されてから、前のテキストが削除されます。最初に変数を空にして、何かが変わるかどうかを確認してください。

また、割り当てる代わりに、PasteMethodを使用してテキストを置き換えることを検討してください。

于 2009-07-03T19:52:48.400 に答える