在WPF中,是否可以轻松地覆盖文本框中的文本?
感谢
托尼
编辑:我想我不清楚.抱歉.
我有一个TextBox,用户可以输入6个字符.如果用户输入6个字符,然后由于某种原因将光标放在开头或6个字符中间的某个位置并开始输入,我想要他们输入的内容覆盖字符.基本上就像Word中的覆盖模式一样.
再次感谢.
嘿嘿,我知道这个问题已经很老了,但我一直在寻找一种解决方案来通过 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)
| 归档时间: |
|
| 查看次数: |
4337 次 |
| 最近记录: |