WPF TextBox覆盖

时间:2009-03-06 14:40:19

标签: c# wpf

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

感谢

编辑:我想我不清楚。遗憾。

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

再次感谢。

4 个答案:

答案 0 :(得分:5)

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

  

EditingCommands.ToggleInsert.Execute(null,myTextBox);

答案 1 :(得分:4)

在Reflector中查看它,这似乎是从布尔TextBoxBase.TextEditor._OvertypeMode内部属性控制的。你可以通过反思得到它:

// fetch TextEditor from myTextBox
PropertyInfo textEditorProperty = typeof(TextBox).GetProperty("TextEditor", BindingFlags.NonPublic | BindingFlags.Instance);
object textEditor = textEditorProperty.GetValue(myTextBox, null);

// set _OvertypeMode on the TextEditor
PropertyInfo overtypeModeProperty = textEditor.GetType().GetProperty("_OvertypeMode", BindingFlags.NonPublic | BindingFlags.Instance);
overtypeModeProperty.SetValue(textEditor, true, null);

答案 2 :(得分:3)

Heyho, 我知道这个问题是超级老的,但我一直在寻找一种解决方案,通过MVVM模式存档“覆盖”行为。所以我写了下面的DependencyProperty,希望它会帮助别人。

public class ElementBehavior
{
    #region AlwaysOverride

    ///<summary>
    /// DependencyProperty
    ///</summary>
    public static readonly DependencyProperty AlwaysOverrideProperty = DependencyProperty.RegisterAttached("AlwaysOverride", typeof(bool), typeof(ElementBehavior), new PropertyMetadata(false, OnAlwaysOverrideChanged));

    ///<summary>
    /// Get
    ///</summary>
    ///<param name="target">DependencyObject</param>
    ///<returns>ICommand</returns>
    public static bool GetAlwaysOverride(DependencyObject target)
    {
        return (bool)target.GetValue(AlwaysOverrideProperty);
    }

    ///<summary>
    /// Set
    ///</summary>
    ///<param name="target">DependencyObject</param>
    ///<param name="value">ICommand</param>
    public static void SetAlwaysOverride(DependencyObject target, bool value)
    {
        target.SetValue(AlwaysOverrideProperty, value);
    }

    ///<summary>1
    /// OnChanged
    ///</summary>
    ///<param name="target">DependencyObject</param>
    ///<param name="e">DependencyPropertyChangedEventArgs</param>
    public static void OnAlwaysOverrideChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
    {
        if (target.GetType() == typeof(TextBox))
        {
            TextBox t = (TextBox)target;
            if ((bool)e.NewValue)
            {
                t.PreviewKeyDown += OnAlwaysOverride;
            }
            else
            {
                t.PreviewKeyDown -= OnAlwaysOverride;
            }
        }
    }

    private static void OnAlwaysOverride(object sender, KeyEventArgs e)
    {
        TextBox t = (TextBox)e.Source;
        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) == false && string.IsNullOrEmpty(t.Text) == false)
        {
            t.Select(t.CaretIndex, 1);
        }
    }
    #endregion
}

用法:

 <Style x:Key="HexEditBox" TargetType="{x:Type TextBox}">
       <Setter Property="UndoLimit" Value="0"/>
       <Setter Property="MaxLength" Value="2"/>
       <Setter Property="BorderThickness" Value="0"/>
       <Setter Property="Padding" Value="0"/>
       <Setter Property="ElementBehavior.AlwaysOverride" Value="True"/>
 </Style>

答案 3 :(得分:1)

假设您的意思是选择一些文本,然后允许用户键入该文本:

//select the third character
textBox.Select(2, 1);