2009-03-06 7 views
2

Dans WPF, existe-t-il un remplacement facile du texte dans une zone de texte?WPF TextBox Overwrite

Merci
Tony

EDIT: Je suppose que je ne devais pas effacer. Pardon.

J'ai un TextBox que l'utilisateur est autorisé à taper 6 caractères. Si l'utilisateur tape 6 caractères et que, pour une raison quelconque, il place le curseur au début ou quelque part au milieu des 6 caractères et commence à taper, je veux que les caractères qu'ils tapent écrasent les caractères. Fondamentalement agir comme le mode d'écrasement dans Word.

Merci encore.

Répondre

2

regardant dans réflecteur, cela semble être contrôlé à partir de la propriété interne TextBoxBase.TextEditor._OvertypeMode booléen. Vous pouvez y arriver par la réflexion:

// 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); 
1

En supposant que vous voulez dire sélectionner un texte et permet à l'utilisateur de taper sur ce texte:

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

J'éviterais la réflexion. La solution la plus propre est la suivante:

EditingCommands.ToggleInsert.Execute (null, myTextBox);

0

Heyho, Je sais que cette question est super vieux, mais je cherchais une solution pour archiver le comportement « prioritaire » par modèle MVVM. J'ai donc écrit le DependencyProperty suivant, j'espère que cela aidera quelqu'un.

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 
} 

Utilisation:

<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>