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๊ฐœ์˜ ์ข‹์•„์š”