XamSyntaxEditor で行番号表示位置をクリックしたときにクリック位置の行情報を取得したい場合は、LineNumberMarginPresenter の PreviewMouseDown イベントで実装できます。

マウス クリック座標をもとに ActiveDocumentView の ViewLineFromVerticalOffset メソッドを使って Y 座標に対応する行番号を取得します。

マウス クリック座標は、テキスト描画領域で使用されている描画要素 EditorDocumentViewTextArea の座標で取る必要があります。EditorDocumentViewTextArea はプロパティで公開されていないので、Visual Tree をたどって取得してください。

<ig:XamSyntaxEditor
    x:Name="xamSyntaxEditor1"
    IsLineNumberMarginVisible="True">
    <ig:XamSyntaxEditor.Document>
        <ig:TextDocument x:Name="textDocument" />
    </ig:XamSyntaxEditor.Document>
    <ig:XamSyntaxEditor.Resources>
        <Style TargetType="{x:Type localPrim:LineNumberMarginPresenter}">
            <EventSetter Event="PreviewMouseDown" Handler="LineNumberMarginPresenter_PreviewMouseDown"/>
        </Style>
    </ig:XamSyntaxEditor.Resources>
</ig:XamSyntaxEditor>
private void LineNumberMarginPresenter_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    // DocumentViewのテキスト描画領域EditorDocumentViewTextAreaを取得します。
    // プロパティで公開されていないので、Visual Treeをたどる必要があります。
    // そのため、いったんLineNumberPresenterから親へと辿ってXamSyntaxEditorを取得し、
    // その子要素の中からEditorDocumentViewTextAreaを取得しています。
    var lineNumberMarginPresenter = (LineNumberMarginPresenter)sender;
    var xamSyntaxEditor = Utilities.GetAncestorFromType(lineNumberMarginPresenter, typeof(XamSyntaxEditor), false) as XamSyntaxEditor;
    if (xamSyntaxEditor == null) return;
    var textArea = Utilities.GetDescendantFromType(xamSyntaxEditor, typeof(EditorDocumentViewTextArea), false) as EditorDocumentViewTextArea;
    if (textArea == null) return;

    var mouseDownPointInTextAreaCoordinates = e.GetPosition(textArea);
    var line = xamSyntaxEditor.ActiveDocumentView.ViewLineFromVerticalOffset(mouseDownPointInTextAreaCoordinates.Y);
    if(line != null)
    {
        ... 以下、line.SnapshotLineInfo.LineNumberで行番号が取得できます
    }
}

実行結果

 

 

Tagged:

製品について

Ultimate UI for WPF