WPF TextBox Перезаписать - PullRequest
       13

WPF TextBox Перезаписать

2 голосов
/ 06 марта 2009

В WPF легко ли разрешить перезапись текста в текстовом поле?

Спасибо
Tony

РЕДАКТИРОВАТЬ: Я думаю, я не должен был очистить. К сожалению.

У меня есть TextBox, который пользователь может вводить 6 символов. Если пользователь вводит 6 символов, а затем по какой-либо причине помещает курсор в начало или где-то посередине 6 символов и начинает печатать, я хочу, чтобы то, что они печатали, перезаписывало символы. В основном действует как режим перезаписи в Word.

Еще раз спасибо.

Ответы [ 4 ]

5 голосов
/ 31 октября 2010

Я бы избегал размышлений. Самым чистым решением является следующее:

EditingCommands.ToggleInsert.Execute (null, myTextBox);

4 голосов
/ 06 марта 2009

Глядя на это в Reflector, кажется, что это контролируется из внутреннего логического свойства TextBoxBase.TextEditor._OverypeMode. Вы можете получить это через отражение:

// 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);
3 голосов
/ 25 октября 2017

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>
1 голос
/ 06 марта 2009

Предполагая, что вы имеете в виду, выделите какой-то текст, а затем разрешите пользователю набирать текст:

//select the third character
textBox.Select(2, 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...