Silverlight AutoCompleteBox大写输入

我需要在Silverlight 4应用程序中强制AutoCompleteBox内的大写输入。

在TextBox中,这可以通过替换KeyDown事件上的Text属性来完成,如:

control.Text += enteredChar; control.Select(control.Text.Length, 0); //To maintain caret position 

但是AutoCompleteBox不提供文本选择function,我发现没有办法将插入符号移到字符串结尾。

您需要更改AutoCompleteBox模板并将UpperCaseBehavior添加到TextBox中:

      

其中UpperCaseBehavior是:

 public class UpperCaseBehavior: Behavior { protected override void OnAttached() { base.OnAttached(); AssociatedObject.TextChanged += AssociatedObject_TextChanged; } private void AssociatedObject_TextChanged(object sender, TextChangedEventArgs args) { var selectionStart = AssociatedObject.SelectionStart; var selectionLength = AssociatedObject.SelectionLength; AssociatedObject.Text = AssociatedObject.Text.ToUpper(); AssociatedObject.SelectionStart = selectionStart; AssociatedObject.SelectionLength = selectionLength; } protected override void OnDetaching() { AssociatedObject.TextChanged -= AssociatedObject_TextChanged; base.OnDetaching(); } } 

您可以使用绑定并立即将键入的值转换为大写。 添加自定义样式以使用textchanged事件。 我测试了这个,所以如果你需要我可以发给你一个样品,如果你不能让它工作。

XAML:

添加资源:

  

添加AutoCompleteBox并引用以前的样式:

  

代码背后:

绑定键入的文本:

 private string _typedText; public string TypedText { get { return _typedText; } set { _typedText = value.ToUpper(); NotifyPropertyChanged("TypedText"); } } 

TextSelection事件:

 private void Text_SelectionChanged(object sender, System.Windows.RoutedEventArgs e) { TextBox tb = sender as TextBox; if (tb != null && !String.IsNullOrEmpty(TypedText) && tb.SelectionStart != TypedText.Length) { tb.SelectionStart = TypedText.Length; tb.SelectionLength = 0; } } 

HTH

它并不完美,但它确实有效! 丢失焦点事件使文本大写

 
 private void AutoCompleteTextBox_LostFocus(object sender, RoutedEventArgs e) { var a = (AutoCompleteTextBox)sender; a.Text = a.Text.ToUpper(); } 

我结束了,只用大写器创建字体并使用它。

MSDN:AutoCompleteBox样式和模板

基本上只需在TextBox.CharacterCasing属性上使用样式设置器,如下所示:

       

这避免了在调整文本的情况时不得不破解插入位置问题的解决方案的麻烦。

当然还有其他选择设置Style和Setter的位置和设置方法(我忘记了这些细节,但上面似乎完成了工作)

注意:我在WPF .Net v4.0中使用它,使用AutoCompleteBox执行异步列表填充(控件不进行过滤)。