1

アプリケーション レベルのアドインを使用して、リビジョン (追跡された変更) を非表示ではなくインラインでレンダリングする必要がRangeあるドキュメントを開くときにいくつかの操作を実行しています。ドキュメントを参照した後、私がしなければならないことは、アクティブ ウィンドウのビュー プロパティMarkupModeを変更することだけだと思いました。

しかし、このプロパティは、ドキュメントでのリビジョンの表示方法とは完全に切り離されているようです! これをテストするために、ドキュメントで手動でモードを切り替え、 を見てMarkupMode、その後すぐにonSelectionChangeイベント ハンドラーで確認してみました。私は先に進み、かなりの量の のプロパティを追跡しましたActiveWindow.View。インラインでレンダリングされた変更を含むローカルを見たとき、驚きと悔しさに、

前

値の前

...そして、値を変更が非表示になっている値と比較しました。

後

値の後

何も変わっていません!何を与える?変更がインラインでレンダリングされることを確認するために、適切なプロパティを見ていませんか? Microsoft は意味のあるドキュメントを書くことがまったくできないのでしょうか? リビジョンのレンダリングが変更されるかどうかを確認するために、コードでもプロパティを変更しようとしたことを指摘しておきますが、成功しませんでした。フィードバックをいただければ幸いです。

編集:問題を複製する簡単なコード:

private void ThisAddIn_Startup(object sender, EventArgs e)
{
    Application.WindowSelectionChange += application_WindowSelectionChange;
}

private void application_WindowSelectionChange(Selection sel)
{
    var testDoc = sel.Document;

    var test = new
    {
        testDoc.ActiveWindow.View,
        testDoc.ActiveWindow.View.ShowRevisionsAndComments,
        testDoc.ActiveWindow.View.ShowInsertionsAndDeletions,
        testDoc.ActiveWindow.View.MarkupMode,
        testDoc.ActiveWindow.View.RevisionsMode
    };
}

編集 2:DocumentOpenこの不自然な例を超えて、オブジェクトとして存在するテキストを含む可能性のあるテキストを検索しているため、リビジョンのマークアップ スタイルを制御する必要がありRevisionます。より具体的には、上記のテキストを使用して、次のことを試みています(テキスト「証明するのに役立つ強力な方法」はリビジョンで削除されています)。

private void ThisAddIn_Startup(object sender, EventArgs e)
{
    Application.DocumentOpen += application_DocumentOpen;
}

private void application_DocumentOpen(Document doc)
{
    // expected text, as taken from screengrab example above. Includes
    //  text removed in a revision
    string expectedText = "Video provides a powerful way to help you prove your point.";

    // make sure that we're in print view
    if (doc.ActiveWindow.View.Type != WdViewType.wdPrintView)
    {
        doc.ActiveWindow.View.Type = WdViewType.wdPrintView;
    }

    // attempt to ensure that document revisions are marked up inline. Does not accomplish anything
    doc.ActiveWindow.View.MarkupMode = WdRevisionsMode.wdInLineRevisions;        
    // attempt to locate text. Will fail if revisions are not marked up inline (deletion is not part of document content range otherwise)
    var locatedRange = doc.Content.OccurrenceOfText(expectedText);
}

// extension method to locate text inside a range. Searching entire Content in this example
private static Range OccurrenceOfText(this Range rng, string text)
{
    rng.Find.Forward = true;
    rng.Find.Format = false;

    rng.Find.Execute(text);

    if (!rng.Find.Found)
    {
        throw new Exception("Unable to locate text! Are Revisions marked up inline?");
    }

    // return brand new range containing located content
    return rng.Document.Range(rng.Start, rng.End);
}

編集 3: Cindy が明らかにしたように、私の問題は、間違ったプロパティを使用していView.RevisionsFilter.Markupたことです。プロパティを使用して変更を加える必要がありました。さらに、私が診断していなかった問題は、View プロパティによっては、Range実行した検索から返された が、検索されTextたテキストとは異なるプロパティを返す可能性が十分にあるということです。これはRevision、 内にオブジェクトが存在する場合に発生する可能性がありRangeます。

4

1 に答える 1

2

わたしにはできる。私がしたこと:

  1. テスト ドキュメントを作成しました。=rand() を使用 ->Enter キーを押して、ドキュメントにテキストを入力します。「強力な」を「便利な」に変えて、フレーズでコピーしました。
  2. トラックの変更をオンにし、「便利」を選択して「強力」と入力するなど、いくつかの変更を加えました。
  3. 変更がバルーンに表示され、マークアップの「元の」ビューが表示されていることを確認してください。
  4. ドキュメントを保存して閉じました。
  5. OccurrenceOfText を呼び出す行にブレークポイントを配置し、F5 キーを押してアドインをデバッグ モードで開始します。
  6. 保存したドキュメントを開きました。Open イベントが発生しました。View.Markup と View.RevisionsView の値を確認しました - それらはインラインと "Final" に変更されました。残りのコードをステップ実行すると、正しく実行されました (発生が見つかりました)。

「ラッパー」がないため、コードを少し変更する必要がありました。また、OccurrenceOfText が Range を返す方法も変更しました。複雑な方法で行う必要はありません...

View.RevisionsView を設定していないように見えることに注意してください。おそらくこれが、期待する結果が表示されない理由ですか?

 private void Application_DocumentOpen(Microsoft.Office.Interop.Word.Document doc)
  {
            //Test revisions
    // expected text, as taken from screengrab example above. Includes
    //  text removed in a revision
    string expectedText = "Video provides a powerful way to help you prove your point.";

    // make sure that we're in print view
    if (doc.ActiveWindow.View.Type != Word.WdViewType.wdPrintView)
    {
        doc.ActiveWindow.View.Type = Word.WdViewType.wdPrintView;
    }

    // attempt to ensure that document revisions are marked up inline. Does not accomplish anything
    Word.View vw = doc.ActiveWindow.View;
    vw.MarkupMode = Word.WdRevisionsMode.wdInLineRevisions;
    vw.RevisionsView = Word.WdRevisionsView.wdRevisionsViewFinal;      
    // attempt to locate text. Will fail if revisions are not marked up inline (deletion is not part of document content range otherwise)
    var locatedRange = OccurrenceOfText(doc.Content, expectedText);
}

// extension method to locate text inside a range. Searching entire Content in this example
private static Word.Range OccurrenceOfText(Word.Range rng, string text)
{
    rng.Find.Forward = true;
    rng.Find.Format = false;

    rng.Find.Execute(text);

    if (!rng.Find.Found)
    {
        throw new Exception("Unable to locate text! Are Revisions marked up inline?");
    }

    // return brand new range containing located content
    return rng;  //.Document.Range(rng.Start, rng.End);
 }
于 2015-11-30T20:54:12.097 に答える