WPF TextBox覆盖

Ton*_*ony 2 c# wpf

在WPF中,是否可以轻松地覆盖文本框中的文本?

感谢
托尼

编辑:我想我不清楚.抱歉.

我有一个TextBox,用户可以输入6个字符.如果用户输入6个字符,然后由于某种原因将光标放在开头或6个字符中间的某个位置并开始输入,我想要他们输入的内容覆盖字符.基本上就像Word中的覆盖模式一样.

再次感谢.

raf*_*raf 5

我会避免反思.最干净的解决方案如下:

EditingCommands.ToggleInsert.Execute(null,myTextBox);


k1l*_*r8e 5

嘿嘿,我知道这个问题已经很老了,但我一直在寻找一种解决方案来通过 MVVM 模式存档“覆盖”行为。所以我写了以下内容DependencyProperty,希望对某人有所帮助。

public class ElementBehavior
{
   #region ForceOverride

    ///<summary>
    /// DependencyProperty
    ///</summary>
    public static readonly DependencyProperty ForceOverrideProperty = DependencyProperty.RegisterAttached("ForceOverride", typeof(bool), typeof(ElementBehavior), new PropertyMetadata(false, (s, e) =>
    {
        if (s is TextBoxBase t)
        {
            if ((bool)e.NewValue)
            {
                t.PreviewKeyDown += OnForceOverride;
            }
            else
            {
                t.PreviewKeyDown -= OnForceOverride;
            }
        }
    }));

    ///<summary>
    /// Get
    ///</summary>
    ///<param name="target"><see cref="DependencyObject"/></param>
    ///<returns><see cref="bool"/></returns>
    public static bool GetForceOverride(DependencyObject target)
    {
        return (bool)target.GetValue(ForceOverrideProperty);
    }

    ///<summary>
    /// Set
    ///</summary>
    ///<param name="target"><see cref="DependencyObject"/></param>
    ///<param name="value"><see cref="bool"/></param>
    public static void SetForceOverride(DependencyObject target, bool value)
    {
        target.SetValue(ForceOverrideProperty, value);
    }

    private static void OnForceOverride(object sender, KeyEventArgs e)
    {
        Key[] BAD_KEYS = new Key[] { Key.Back, Key.Delete };
        Key[] WRK_KEYS = new Key[] { Key.Left, Key.Up, Key.Right, Key.Down, Key.Enter };
        if (BAD_KEYS.Contains(e.Key))
        {
            e.Handled = true;
        }
        else if (!WRK_KEYS.Contains(e.Key))
        {
            if (sender is RichTextBox r)
            {
                if (!string.IsNullOrEmpty(new TextRange(r.Document.ContentStart, r.Document.ContentEnd).Text))
                {
                    r.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Input, (Action)delegate
                    {
                        TextPointer tp = r.CaretPosition.GetNextInsertionPosition(LogicalDirection.Forward);
                        if (tp != null && tp != r.Document.ContentEnd)
                        {
                            r.Selection.Select(r.CaretPosition, tp);
                        }
                    });
                }
            }
            else if (sender is TextBox t)
            {
                if (!string.IsNullOrEmpty(t.Text))
                {
                    t.Select(t.CaretIndex, 1);
                }
            }
        }
    }
    #endregion
}
Run Code Online (Sandbox Code Playgroud)

用法:

 <Style TargetType="{x:Type TextBox}">
       <Setter Property="ElementBehavior.ForceOverride" Value="True"/>
 </Style>
Run Code Online (Sandbox Code Playgroud)