我正在开发一个silverlight web应用程序。它与发送短信的模块交互。我想将文本限制为160,并显示一个计数器。我是这样做的:
public partial class SendSMSView
{
public SendSMSView()
{
InitializeComponent();
ApplyTheme();
}
protected void tbMessage_KeyDown(object sender, KeyEventArgs e)
{
count = 160 - this.tbMessage.Text.Length;
this.lblCount.Content = count.ToString();
}
}
这对除backspace和delete之外的所有键都很有效。当然,它的功能是这样的。我深入研究了这一点,并尝试重写keydown事件,因此我添加了以下代码片段:
public class CustomTextBox : TextBox
{
public CustomTextBox(): base()
{
}
protected override void OnKeyDown(KeyEventArgs e)
{
e.handler=false;
base.OnKeyDown(e);
//this place
}
}
在OnKeyDown函数中,我注册了所有的击键。在这里将Handler设置为false无济于事,而且我仍然无法使用backspace来触发tbMessage_KeyDow。
我想以某种方式从//这个地方强制调用tbMessage_KeyDow函数作为退格键。
我搜索了MSDN,发现可以重写IsInputKey以返回true,这样onKeyDown也可以响应它,但我的框架既没有IsInputKey也没有PreviewKeyPress。有没有办法让退格键注册为输入键,或者调用tbMessage_KeyDow,这是非常粗糙的方法?请帮帮忙。
发布于 2011-10-27 22:36:00
试试这个..。
如果要检测在文本框中按下的键上的退格键。我们建议您可以尝试在textbox的KeyUp事件而不是KeyDown事件中执行此操作。例如:
<TextBox x:Name="txt" KeyDown="txt_KeyDown" Text="Hello" KeyUp="txt_KeyUp"></TextBox>
代码背后:
private void txt_KeyUp(object sender, KeyEventArgs e)
{
if (e.Key == Key.Back)
{
MessageBox.Show(this.txt.Text);
}
}
或者你可以像this...by一样创建一个用户控件……
public partial class Page : UserControl {
private TextBox TextBox1;
public Page() {
InitializeComponent();
TextBox1 = new TextBox();
Width = 300;
Height = 100;
LayoutRoot.Children.Add(textbox);
OnTextChanged(((object)(sender)), ((TextChangedEventArgs)(e)));
TextBox1.TextChanged;
if (e.Key == Key.Back) {
e.Handled = true;
}
else if (e.Key == Key.Delete) {
e.Handled = true;
}
}
}
发布于 2018-06-09 08:34:15
我正在为一个WPF应用程序寻找类似的东西,KeyDown事件没有捕捉到退格键和Delete键。KeyUp事件不可用,因为它将在操作发生后捕获按键。
但是,我发现PreviewKeyDown事件可以捕获按键,这样我就可以防止按键发生,如下所示:
private void txtRight_PreviewKeyDown(object sender, KeyEventArgs e)
{
if ((e.Key == Key.Delete) || (e.Key == Key.Back))
{
// Stop the character from being entered into the control since it is illegal.
e.Handled = true;
}
}
发布于 2011-10-28 02:42:14
我会这样做(我前面没有VS,所以这是纯pseduo代码)
public class SendSMSViewModel : INotifyPropertyChanged
{
string _text;
public string Text
{
get { return _text; }
set {
// or allow it and implement IDataErrorInfo to give the user a nifty error message
if (value != null & value.Length > 160)
return;
_text = value;
OnPropertyChanged(vm => vm.Text);
OnPropertyChanged(vm => vm.NumberOfCharactersRemaining);
}
}
public string NumberOfCharactersRemaining
{
get { return Text == null ? 160 : 160 - Text.Length; }
}
}
..and然后从视图中使用双向数据绑定,并记住在绑定上使用"PropertyChanged“的UpdateSourceTrigger。
https://stackoverflow.com/questions/7917388
复制相似问题