Как заявил @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
PreviewKeyDown
где-то в своем окне? Если да, отмечаете ли вы событие какHandled
? Переключается ли кнопка Scroll Lock на клавиатуре? - person Mike Strobel   schedule 23.01.2018PreviewKeyDown
, то вы перехватываете нажатия клавиш до того, как они попадут в элемент управленияAvalonEdit
. Это не обязательно неправильно, но если вы установите для свойстваHandled
события значениеtrue
, вы не позволите редактору обрабатывать то же самое событие. Следовательно, он может не видеть определенные нажатия клавиш. Это действительно зависит от ваших обработчиков ключей. Нам нужно увидеть код. - person Mike Strobel   schedule 24.01.2018