MultiLineTextInputBehavior

두번째 Slog 입니다.

다이어로그에 텍스트 입력창을 넣었는데
텍스트 입력은 멀티라인을 허용 하고 싶고
엔터는 IsDefault를 지원 하고 싶을때

쓸수 있는 MultiLineTextInputBehavior 입니다.

깃에 올려서 공유 할까 하다가
너무 짧아서 그냥 코드로 올려 봅니다.

public class MultiLineTextInputBehavior : Behavior<TextBox>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.PreviewKeyDown += AssociatedObject_PreviewKeyDown;
    }
    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.PreviewKeyDown -= AssociatedObject_PreviewKeyDown;
    }
    private void AssociatedObject_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (Keyboard.Modifiers == ModifierKeys.Alt && Keyboard.IsKeyDown(Key.Enter))
        {
            var pos = AssociatedObject.SelectionStart;
            StringBuilder sb = new(AssociatedObject.Text);
            if (AssociatedObject.SelectionLength > 0)
                sb.Remove(AssociatedObject.SelectionStart, AssociatedObject.SelectionLength);
            sb.Insert(AssociatedObject.SelectionStart, Environment.NewLine);
            AssociatedObject.Text = sb.ToString();
            AssociatedObject.SelectionLength = 0;
            AssociatedObject.SelectedText = "";
            AssociatedObject.SelectionStart = pos + 1;
            e.Handled = true;
        }
    }
}

개행은 Alt + Enter로 처리 하고
중간에 remove 부분은
특정 범위를 선택 후 Alt + Enter 할 경우
해당 부분을 삭제 하고 개행 되게 하기 위해
넣었습니다.

개선점 있으면 댓글 부탁 드려요

3개의 좋아요