このトピックでは、 xamSyntaxEditor™ コントロールのエラー報告機能の概要と、コントロールの構成方法およびその使用方法を紹介します。
このトピックを理解するためには、以下のトピックを理解しておく必要があります。
このトピックは、以下のセクションで構成されます。
xamSyntaxEditor は、現在の言語の文書校正ルールに従って、構文的に正しくないというフラグが付いたテキストをハイライト表示します。正しくないテキストは波下線で区別できます。波下線はデフォルトで赤く表示されます。波下線にマウスを合わせるとツールチップにエラーの詳細情報が表示されます。
以下に示したのは xamSyntaxEditor のスクリーンショットです。数カ所のエラーと、マウス位置のエラーに関するエラーの内容がツールチップに表示されています。
xamSyntaxEditor の ErrorDisplayMode プロパティを設定すると、エラー波下線を表示するかどうかを設定できます。
以下の表では、目的のプロパティ設定の構成をマップしています。
波下線の色は xamSyntaxEditor の ClassificationAppearanceMap プロパティで変更できます。
以下のコードでは、波下線の色をマゼンタ色に変更します。
C# の場合:
// 新しい分類外観マップを作成する
ClassificationAppearanceMap cam = new ClassificationAppearanceMap();
// マゼンタ色の塗りつぶし色ブラシを "SyntaxError" 分類タイプで追加する
cam.AddMapEntry(
ClassificationType.SyntaxError,
new TextDocumentAppearance()
{
Foreground = new SolidColorBrush(Colors.Magenta)
}
);
// xamSyntaxEditor にマップを設定する
this.xamSyntaxEditor1.ClassificationAppearanceMap = cam;
Visual Basic の場合:
' 新しい分類外観マップの作成
Dim cam As New ClassificationAppearanceMap()
' マゼンタ色の塗りつぶし色ブラシを "SyntaxError" 分類タイプで追加する
cam.AddMapEntry(ClassificationType.SyntaxError, New TextDocumentAppearance() With { _
.Foreground = New SolidColorBrush(Colors.Magenta) _
})
' xamSyntaxEditor にマップを設定する
Me.xamSyntaxEditor1.ClassificationAppearanceMap = cam
エディターでドキュメントの内容を変更した後にドキュメントを読み込むと、 xamSyntaxEditor はドキュメントの内容を構文解析し直します。これは非同期プロセスです。このプロセスは、 TextDocument の PropertyChanged イベントにハンドラーをアタッチし、 SyntaxTree プロパティをチェックして監視できます。SyntaxTree
のプロパティを変更したあとは、構文ツリーの各ノードの ContainsDiagnostics プロパティを照会すればエラーの有無をチェックできます。
以下のコード例では、構文エラー リストの取得方法と、エラーの記述とエラーの発生行の検索方法を示します。
C# の場合:
// ドキュメントを取得する
TextDocument doc = this.xamSyntaxEditor1.Document;
if (doc.SyntaxTree.RootNode.ContainsDiagnostics)
{
// ドキュメント全体の中のテキストの範囲を作成する
TextSpan ts = new TextSpan(0, doc.CurrentSnapshot.Length);
// ドキュメント全体からエラーを取得する
IEnumerable<NodeDiagnostic> diagnostics =
doc.SyntaxTree.RootNode.GetDiagnostics(ts);
foreach (NodeDiagnostic nd in diagnostics)
{
// エラーの場所を取得する
SnapshotSpan span = nd.SnapshotSpan;
TextLocation location = span.Snapshot.LocationFromOffset(span.Offset);
int errorLineNumber = location.Line + 1;
int errorCharacter = location.Character + 1;
// エラー メッセージを取得する
string errorMessage = nd.Message;
}
}
Visual Basic の場合:
' ドキュメントを取得する
Dim doc As TextDocument = Me.xamSyntaxEditor1.Document
If doc.SyntaxTree.RootNode.ContainsDiagnostics Then
' ドキュメント全体の中のテキストの範囲を作成する
Dim ts As New TextSpan(0, doc.CurrentSnapshot.Length)
' ドキュメント全体からエラーを取得する
Dim diagnostics As IEnumerable(Of NodeDiagnostic) = _
doc.SyntaxTree.RootNode.GetDiagnostics(ts)
For Each nd As NodeDiagnostic In diagnostics
' エラーの場所を取得する
Dim span As SnapshotSpan = nd.Span
Dim location As TextLocation = span.Snapshot.LocationFromOffset(span.Offset)
Dim errorLineNumber As Integer = location.Line + 1
Dim errorCharacter As Integer = location.Character + 1
' エラー メッセージを取得する
Dim errorMessage As String = nd.Message
Next
End If
このトピックの追加情報については、以下のトピックも合わせてご参照ください。