Положение курсора не изменяется для клавиш вверх и вниз в текстовом редакторе Avalon.

Я использую Avalon text editor, и позиция курсора не меняется для клавиши вверх и клавиши вниз. Может ли кто-нибудь предложить мне, как преодолеть эту проблему?

Положение курсора корректно меняется при навигации с помощью клавиш вправо и влево.

Я также проверил значение курсора в событии нажатия клавиши, и оно не меняется при нажатии клавиш вверх и вниз.


person Venkat    schedule 18.01.2018    source источник
comment
Я пропустил что-нибудь основное здесь, пожалуйста, предложите?   -  person Venkat    schedule 18.01.2018
comment
Вы обрабатываете событие PreviewKeyDown где-то в своем окне? Если да, отмечаете ли вы событие как Handled? Переключается ли кнопка Scroll Lock на клавиатуре?   -  person Mike Strobel    schedule 23.01.2018
comment
Да, я обработал события previewKeyDown и PreviewKeyUp. Некоторая логика прописана в методах.   -  person Venkat    schedule 24.01.2018
comment
Можете ли вы поделиться кодом?   -  person Gaurang Dave    schedule 24.01.2018
comment
Если вы обрабатываете PreviewKeyDown, то вы перехватываете нажатия клавиш до того, как они попадут в элемент управления AvalonEdit. Это не обязательно неправильно, но если вы установите для свойства Handled события значение true, вы не позволите редактору обрабатывать то же самое событие. Следовательно, он может не видеть определенные нажатия клавиш. Это действительно зависит от ваших обработчиков ключей. Нам нужно увидеть код.   -  person Mike Strobel    schedule 24.01.2018


Ответы (1)


Как заявил @Mike-Strobel, вам нужно пометить аргументы события, обрабатываемые как false, иначе базовый элемент управления TextEditor не получит событие. Вы должны проверить свое событие PreviewKeyDown, событие PreviewKeyUp не будет блокировать события курсора.

private void TextEditor_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
    e.Handled = false;
}

Если вы пытаетесь просто захватить текст из элемента управления и используете шаблон MVVM, возможно, вы захотите взглянуть на поведение, которое я использую для привязки данных к свойству Text. Это позволяет исключить программный код.

<avalonedit:TextEditor
    x:Name="TextEditor"
    FontFamily="Consolas"
    FontSize="10pt"
    LineNumbersForeground="Silver"
    ShowLineNumbers="True"
    SyntaxHighlighting="XML"
    PreviewKeyDown="TextEditor_PreviewKeyDown"
    PreviewKeyUp="TextEditor_PreviewKeyUp"
    WordWrap="True">
    <i:Interaction.Behaviors>
        <behaviors:AvalonEditTextBindingBehavior TextBinding="{Binding XamlEditText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
    </i:Interaction.Behaviors>
</avalonedit:TextEditor>

Вам понадобится пара пространств имен в пользовательском элементе управления xaml или в окне:

xmlns:behaviors="clr-namespace:MatrixGold.Behaviors"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

Вот код поведения:

using System;
using System.Windows;
using System.Windows.Interactivity;
using ICSharpCode.AvalonEdit;

namespace MyProject.Behaviors
{
    public sealed class AvalonEditTextBindingBehavior : Behavior<TextEditor>
    {
        public static readonly DependencyProperty TextBindingProperty = DependencyProperty.Register("TextBinding", typeof(string), typeof(AvalonEditTextBindingBehavior), new FrameworkPropertyMetadata(default(string), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, PropertyChangedCallback));

        private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
        {
            var behavior = dependencyObject as AvalonEditTextBindingBehavior;
            if (behavior.AssociatedObject != null)
            {
                var editor = behavior.AssociatedObject;
                if (editor.Document != null
                    && dependencyPropertyChangedEventArgs.NewValue != null)
                {
                    // Update Text from Binding
                    editor.Document.Text = dependencyPropertyChangedEventArgs.NewValue.ToString();

                    // If Pasting In, Scroll to End of Content just Inserted
                    var caretOffset = editor.CaretOffset;
                    if (caretOffset > editor.Document.TextLength)
                    {
                        caretOffset = editor.Document.TextLength;
                        editor.CaretOffset = caretOffset;
                    }
                }
                else
                {
                    editor.Document.Text = string.Empty;
                }
            }
        }

        public string TextBinding
        {
            get { return (string) GetValue(TextBindingProperty); }
            set { SetValue(TextBindingProperty, value); }
        }

        protected override void OnAttached()
        {
            base.OnAttached();
            if (AssociatedObject != null)
                AssociatedObject.TextChanged += AssociatedObjectOnTextChanged;
        }

        protected override void OnDetaching()
        {
            base.OnDetaching();
            if (AssociatedObject != null)
                AssociatedObject.TextChanged -= AssociatedObjectOnTextChanged;
        }

        private void AssociatedObjectOnTextChanged(object sender, EventArgs eventArgs)
        {
            var textEditor = sender as TextEditor;
            if (textEditor != null)
            {
                if (textEditor.Document != null)
                    TextBinding = textEditor.Document.Text;
            }
        }
    }
}
person Jason Stevenson    schedule 23.06.2018