Многострочное текстовое поле: отображение текущей строки / индекса символов в строке состояния - PullRequest
1 голос
/ 29 июля 2011

У меня есть многострочное текстовое поле, где пользователь может редактировать текст.В строке состояния я хотел бы показать текущий индекс строки / символа.Я знаю, что могу получить CaretIndex и использовать GetLineIndexFromCharacterIndex для получения индекса строки.

Но как мне связать это в строке состояния?

Ответы [ 3 ]

3 голосов
/ 29 июля 2011

Я бы использовал прикрепленное поведение для этого.Поведение может прослушивать изменения с помощью SelectionChanged и обновлять два прикрепленных свойства CaretIndex и LineIndex соответственно.

<TextBox Name="textBox"
         AcceptsReturn="True"
         local:CaretBehavior.ObserveCaret="True"/>

<TextBlock Text="{Binding ElementName=textBox,
                          Path=(local:CaretBehavior.LineIndex)}"/>
<TextBlock Text="{Binding ElementName=textBox,
                          Path=(local:CaretBehavior.CaretIndex)}"/>

CaretBehavior

public static class CaretBehavior 
{
    public static readonly DependencyProperty ObserveCaretProperty = 
        DependencyProperty.RegisterAttached 
        (
            "ObserveCaret",
            typeof(bool),
            typeof(CaretBehavior),
            new UIPropertyMetadata(false, OnObserveCaretPropertyChanged) 
        );
    public static bool GetObserveCaret(DependencyObject obj) 
    {
        return (bool)obj.GetValue(ObserveCaretProperty); 
    }
    public static void SetObserveCaret(DependencyObject obj, bool value) 
    {
        obj.SetValue(ObserveCaretProperty, value); 
    }
    private static void OnObserveCaretPropertyChanged(DependencyObject dpo, 
                                                   DependencyPropertyChangedEventArgs e) 
    {
        TextBox textBox = dpo as TextBox;
        if (textBox != null) 
        { 
            if ((bool)e.NewValue == true) 
            {
                textBox.SelectionChanged += textBox_SelectionChanged;
            } 
            else 
            {
                textBox.SelectionChanged -= textBox_SelectionChanged; 
            } 
        } 
    }

    static void textBox_SelectionChanged(object sender, RoutedEventArgs e)
    {
        TextBox textBox = sender as TextBox;
        int caretIndex = textBox.CaretIndex;
        SetCaretIndex(textBox, caretIndex);
        SetLineIndex(textBox, textBox.GetLineIndexFromCharacterIndex(caretIndex));
    }

    private static readonly DependencyProperty CaretIndexProperty =
        DependencyProperty.RegisterAttached("CaretIndex", typeof(int), typeof(CaretBehavior));
    public static void SetCaretIndex(DependencyObject element, int value)
    {
        element.SetValue(CaretIndexProperty, value);
    }
    public static int GetCaretIndex(DependencyObject element)
    {
        return (int)element.GetValue(CaretIndexProperty);
    }

    private static readonly DependencyProperty LineIndexProperty =
        DependencyProperty.RegisterAttached("LineIndex", typeof(int), typeof(CaretBehavior));
    public static void SetLineIndex(DependencyObject element, int value)
    {
        element.SetValue(LineIndexProperty, value);
    }
    public static int GetLineIndex(DependencyObject element)
    {
        return (int)element.GetValue(LineIndexProperty);
    }
}
0 голосов
/ 29 июля 2011

ИМХО, самый простой и надежный способ - это выборка членов CarteIndex и GetLineIndexFromCharacterIndex с использованием DispatcherTimer. Затем выставляем значения на пару DP для привязок строки состояния.

0 голосов
/ 29 июля 2011
RichTextBox rtb = new RichTextBox();
int offset = 0;
rtb.CaretPosition.GetOffsetToPosition(rtb.Document.ContentStart);
rtb.CaretPosition.GetPositionAtOffset(offset).GetCharacterRect(LogicalDirection.Forward);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...