2010-04-12 2 views
0

J'ai cette zone de texte personnalisée sur laquelle je travaille et je peux l'utiliser dans xaml, mais lorsque je lance mon application, je ne peux pas la sélectionner ou la taper. Voici mon code:WPF- Pourquoi ma zone de texte personnalisée ne peut-elle pas être sélectionnée?

public class ModdedTextBox : TextBox 
{ 
    private bool selectionStartChangeFromUI; 
    private bool selectionLengthChangeFromUI; 
    private bool selectedTextChangeFromUI; 

    static ModdedTextBox() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(ModdedTextBox), new FrameworkPropertyMetadata(typeof(ModdedTextBox))); 
     //this.SelectionChanged += this.OnSelectionChanged; 
     //PropertyDescriptor VerticalOffsetProperty = TypeDescriptor.GetProperties(typeof(ModdedTextBox))["VerticalOffset"]; 
     //VerticalOffsetProperty.AddValueChanged(this, this.OnVerticalOffsetChanged); 
    } 
    public static readonly DependencyProperty BindableSelectionStartProperty = 
    DependencyProperty.Register(
    "BindableSelectionStart", 
    typeof(int), 
    typeof(ModdedTextBox), 
    new PropertyMetadata(OnBindableSelectionStartChanged)); 

    public static readonly DependencyProperty BindableSelectionLengthProperty = 
     DependencyProperty.Register(
     "BindableSelectionLength", 
     typeof(int), 
     typeof(ModdedTextBox), 
     new PropertyMetadata(OnBindableSelectionLengthChanged)); 

    public static readonly DependencyProperty BindableSelectedTextProperty = 
     DependencyProperty.Register(
     "BindableSelectedText", 
     typeof(string), 
     typeof(ModdedTextBox), 
     new PropertyMetadata(OnBindableSelectedTextChanged)); 
    public static readonly DependencyProperty DelayedTextProperty = 
     DependencyProperty.Register(
     "DelayedText", 
     typeof(string), 
     typeof(ModdedTextBox), 
     new PropertyMetadata(OnDelayedTextChanged)); 

    public int BindableSelectionStart 
    { 
     get 
     { 
      return (int)this.GetValue(BindableSelectionStartProperty); 
     } 

     set 
     { 
      this.SetValue(BindableSelectionStartProperty, value); 
     } 
    } 

    public int BindableSelectionLength 
    { 
     get 
     { 
      return (int)this.GetValue(BindableSelectionLengthProperty); 
     } 

     set 
     { 
      this.SetValue(BindableSelectionLengthProperty, value); 
     } 
    } 
    public string BindableSelectedText 
    { 
     get 
     { 
      return (string)this.GetValue(BindableSelectedTextProperty); 
     } 

     private set 
     { 
      this.SetValue(BindableSelectedTextProperty, value); 
     } 
    } 
    public string DelayedText 
    { 
     get 
     { 
      return (string)this.GetValue(DelayedTextProperty); 
     } 

     private set 
     { 
      this.SetValue(DelayedTextProperty, value); 
     } 
    } 

    private static void OnBindableSelectionStartChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args) 
    { 
     var textBox = dependencyObject as ModdedTextBox; 

     if (!textBox.selectionStartChangeFromUI) 
     { 
      int newValue = (int)args.NewValue; 
      textBox.SelectionStart = newValue; 
     } 
     else 
     { 
      textBox.selectionStartChangeFromUI = false; 
     } 
    } 

    private static void OnBindableSelectionLengthChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args) 
    { 
     var textBox = dependencyObject as ModdedTextBox; 

     if (!textBox.selectionLengthChangeFromUI) 
     { 
      int newValue = (int)args.NewValue; 
      textBox.SelectionLength = newValue; 
     } 
     else 
     { 
      textBox.selectionLengthChangeFromUI = false; 
     } 
    } 
    private static void OnBindableSelectedTextChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args) 
    { 
     var textBox = dependencyObject as ModdedTextBox; 

     if (!textBox.selectedTextChangeFromUI) 
     { 
      string newValue = (string)args.NewValue; 
      textBox.BindableSelectedText = newValue; 
     } 
     else 
     { 
      textBox.selectedTextChangeFromUI = false; 
     } 
    } 
    private static void OnDelayedTextChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args) 
    { 
    } 
    private void OnSelectionChanged(object sender, RoutedEventArgs e) 
    { 
     if (this.BindableSelectionStart != this.SelectionStart) 
     { 
      this.selectionStartChangeFromUI = true; 
      this.BindableSelectionStart = this.SelectionStart; 
     } 

     if (this.BindableSelectionLength != this.SelectionLength) 
     { 
      this.selectionLengthChangeFromUI = true; 
      this.BindableSelectionLength = this.SelectionLength; 
     } 
     if (this.BindableSelectedText != this.SelectedText) 
     { 
      this.selectedTextChangeFromUI = true; 
      this.BindableSelectedText = this.SelectedText; 
     } 
    } 
    private void OnVerticalOffsetChanged(object sender, EventArgs e) 
    { 
     MessageBox.Show("hello the vertical offset works"); 
    } 
} 

Répondre

1

votre contrôle a besoin d'un style pour s'afficher. commentaire sur cette seule ligne du constructeur, d'utiliser le style par défaut

DefaultStyleKeyProperty.OverrideMetadata(typeof(ModdedTextBox), new FrameworkPropertyMetadata(typeof(ModdedTextBox))); 

Fait!

modifier: Sinon cela fera explicitement votre utilisation style TextBox

DefaultStyleKeyProperty.OverrideMetadata(
    typeof(ModdedTextBox), 
    new FrameworkPropertyMetadata(typeof(TextBox))); 
+0

Merci Majocha! Je savais qu'il me manquait quelque chose de simple. – Justin

Questions connexes