I have this custom textbox that I am working on and I can use it in xaml, but when I run my app I cannot select it or type in it. Here is my code:
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);
}
开发者_如何学Go}
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");
}
}
your control needs a style to display itself. comment out this one line from the constructor, to use default style
DefaultStyleKeyProperty.OverrideMetadata(typeof(ModdedTextBox), new FrameworkPropertyMetadata(typeof(ModdedTextBox)));
Done!
edit: Alternatively this will explicitly make your control use TextBox style
DefaultStyleKeyProperty.OverrideMetadata(
typeof(ModdedTextBox),
new FrameworkPropertyMetadata(typeof(TextBox)));
精彩评论