public class TextBoxPasteHelper:DependencyObject { public static bool GetCanPasteNewLine(DependencyObject d) { return (bool)d.GetValue(CanPasteNewLineProperty); } public static void SetCanPasteNewLine(DependencyObject d,bool value) { d.SetValue(CanPasteNewLineProperty, value); } // Using a DependencyProperty as the backing store for CanPasteNewLine. This enables animation, styling, binding, etc... public static readonly DependencyProperty CanPasteNewLineProperty = DependencyProperty.RegisterAttached("CanPasteNewLine", typeof(bool), typeof(TextBoxPasteHelper), new PropertyMetadata(default(bool),OnCanPasteNewLineChanged)); private static void OnCanPasteNewLineChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var currentTextBox = d as TextBox; if(currentTextBox != null) { var cmd = new CommandBinding(); cmd.Command = ApplicationCommands.Paste; cmd.Executed += Cmd_Executed; currentTextBox.CommandBindings.Add(cmd); var keyBinding = new KeyBinding(); keyBinding.Key = Key.V; keyBinding.Modifiers = ModifierKeys.Control; keyBinding.Command = ApplicationCommands.Paste; currentTextBox.InputBindings.Add(keyBinding); } } private static void Cmd_Executed(object sender, ExecutedRoutedEventArgs e) { string copiedStr = Clipboard.GetText(); if (string.IsNullOrEmpty(copiedStr)) return; var currentTB = sender as TextBox; if (currentTB != null) { if (currentTB.SelectedText == currentTB.Text) { currentTB.Text = copiedStr; } else { if (!string.IsNullOrEmpty(currentTB.SelectedText)) { currentTB.SelectedText = copiedStr; } else { StringBuilder currentStr = new StringBuilder(currentTB.Text); currentStr.Insert(currentTB.CaretIndex, copiedStr); currentTB.Text = currentStr.ToString(); } } } } }
使用:
<TextBox attached:TextBoxPasteHelper.CanPasteNewLine="True"/>