在WPF中,是否可以轻松地覆盖文本框中的文本?
感谢
贝
我有一个TextBox,允许用户输入6个字符。如果用户输入6个字符然后由于某种原因将光标放在开头或6个字符中间的某个位置并开始输入,我想要他们输入的内容覆盖字符。基本上就像Word中的覆盖模式一样。
再次感谢。
答案 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);