考虑Win Phone 7中的XAML TextBox。
<TextBox x:Name="UserNumber" />
这里的目标是当用户按下屏幕键盘上的Enter
按钮时,这将启动一些逻辑以刷新屏幕上的内容。
我想专门针对Enter
举办活动。这可能吗?
Enter
?即一些类似于ASCII 13?
答案 0 :(得分:71)
文本框中的直接方法是
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
Debug.WriteLine("Enter");
}
}
答案 1 :(得分:13)
您将要查看特定于该文本框的KeyDown事件,并检查KeyEventArgs是否按下了实际的Key(如果它与Key.Enter匹配,请执行某些操作)
<TextBox Name="Box" InputScope="Text" KeyDown="Box_KeyDown"></TextBox>
private void Box_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key.Equals(Key.Enter))
{
//Do something
}
}
请注意,在WP7仿真器的Beta版本中,虽然使用软件屏幕键盘正确检测到Enter键,但如果您正在使用硬件键盘(通过按暂停/中断激活),则按Enter键似乎是Key.Unknown - 或者至少它是在我的电脑上这样做...
答案 2 :(得分:9)
如果您不想将任何代码添加到XAML的代码隐藏文件中并使您的设计从MVVM架构点清除,则可以使用以下方法。在你的XAML中,在这样的绑定中定义你的命令:
<TextBox
Text="{Binding Text}"
custom:KeyUp.Command="{Binding Path=DataContext.DoCommand, ElementName=root}" />
其中 KeyUp 类:
using System.Windows; using System.Windows.Controls; using System.Windows.Input; namespace PhoneGuitarTab.Controls { public static class KeyUp { private static readonly DependencyProperty KeyUpCommandBehaviorProperty = DependencyProperty.RegisterAttached( "KeyUpCommandBehavior", typeof(TextBoxCommandBehavior), typeof(KeyUp), null); /// /// Command to execute on KeyUp event. /// public static readonly DependencyProperty CommandProperty = DependencyProperty.RegisterAttached( "Command", typeof(ICommand), typeof(KeyUp), new PropertyMetadata(OnSetCommandCallback)); /// /// Command parameter to supply on command execution. /// public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.RegisterAttached( "CommandParameter", typeof(object), typeof(KeyUp), new PropertyMetadata(OnSetCommandParameterCallback)); /// /// Sets the to execute on the KeyUp event. /// /// TextBox dependency object to attach command /// Command to attach [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters", Justification = "Only works for buttonbase")] public static void SetCommand(TextBox textBox, ICommand command) { textBox.SetValue(CommandProperty, command); } /// /// Retrieves the attached to the . /// /// TextBox containing the Command dependency property /// The value of the command attached [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters", Justification = "Only works for buttonbase")] public static ICommand GetCommand(TextBox textBox) { return textBox.GetValue(CommandProperty) as ICommand; } /// /// Sets the value for the CommandParameter attached property on the provided . /// /// TextBox to attach CommandParameter /// Parameter value to attach [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters", Justification = "Only works for buttonbase")] public static void SetCommandParameter(TextBox textBox, object parameter) { textBox.SetValue(CommandParameterProperty, parameter); } /// /// Gets the value in CommandParameter attached property on the provided /// /// TextBox that has the CommandParameter /// The value of the property [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters", Justification = "Only works for buttonbase")] public static object GetCommandParameter(TextBox textBox) { return textBox.GetValue(CommandParameterProperty); } private static void OnSetCommandCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) { TextBox textBox = dependencyObject as TextBox; if (textBox != null) { TextBoxCommandBehavior behavior = GetOrCreateBehavior(textBox); behavior.Command = e.NewValue as ICommand; } } private static void OnSetCommandParameterCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) { TextBox textBox = dependencyObject as TextBox; if (textBox != null) { TextBoxCommandBehavior behavior = GetOrCreateBehavior(textBox); behavior.CommandParameter = e.NewValue; } } private static TextBoxCommandBehavior GetOrCreateBehavior(TextBox textBox) { TextBoxCommandBehavior behavior = textBox.GetValue(KeyUpCommandBehaviorProperty) as TextBoxCommandBehavior; if (behavior == null) { behavior = new TextBoxCommandBehavior(textBox); textBox.SetValue(KeyUpCommandBehaviorProperty, behavior); } return behavior; } } }
该课程使用其他课程,所以我也提供了。 TextBoxCommandBehavior 类:
using System; using System.Windows.Controls; using System.Windows.Input; namespace PhoneGuitarTab.Controls { public class TextBoxCommandBehavior : CommandBehaviorBase { public TextBoxCommandBehavior(TextBox textBoxObject) : base(textBoxObject) { textBoxObject.KeyUp += (s, e) => { string input = (s as TextBox).Text; //TODO validate user input here **//ENTER IS PRESSED!** if ((e.Key == Key.Enter) && (!String.IsNullOrEmpty(input))) { this.CommandParameter = input; ExecuteCommand(); } }; } } }
CommandBehaviorBase 类:
using System; using System.Windows.Controls; using System.Windows.Input; namespace PhoneGuitarTab.Controls { /// /// Base behavior to handle connecting a to a Command. /// /// The target object must derive from Control /// /// CommandBehaviorBase can be used to provide new behaviors similar to . /// public class CommandBehaviorBase where T : Control { private ICommand command; private object commandParameter; private readonly WeakReference targetObject; private readonly EventHandler commandCanExecuteChangedHandler; /// /// Constructor specifying the target object. /// /// The target object the behavior is attached to. public CommandBehaviorBase(T targetObject) { this.targetObject = new WeakReference(targetObject); this.commandCanExecuteChangedHandler = new EventHandler(this.CommandCanExecuteChanged); } /// /// Corresponding command to be execute and monitored for /// public ICommand Command { get { return command; } set { if (this.command != null) { this.command.CanExecuteChanged -= this.commandCanExecuteChangedHandler; } this.command = value; if (this.command != null) { this.command.CanExecuteChanged += this.commandCanExecuteChangedHandler; UpdateEnabledState(); } } } /// /// The parameter to supply the command during execution /// public object CommandParameter { get { return this.commandParameter; } set { if (this.commandParameter != value) { this.commandParameter = value; this.UpdateEnabledState(); } } } /// /// Object to which this behavior is attached. /// protected T TargetObject { get { return targetObject.Target as T; } } /// /// Updates the target object's IsEnabled property based on the commands ability to execute. /// protected virtual void UpdateEnabledState() { if (TargetObject == null) { this.Command = null; this.CommandParameter = null; } else if (this.Command != null) { TargetObject.IsEnabled = this.Command.CanExecute(this.CommandParameter); } } private void CommandCanExecuteChanged(object sender, EventArgs e) { this.UpdateEnabledState(); } /// /// Executes the command, if it's set, providing the /// protected virtual void ExecuteCommand() { if (this.Command != null) { this.Command.Execute(this.CommandParameter); } } } }
您可以在我的开源项目(解决方案中的 PhoneGuitarTab.Controls 项目)中找到工作示例: http://phoneguitartab.codeplex.com
答案 3 :(得分:6)
如果您使用的是模拟器,您也可以执行以下操作来检测物理键盘上的回车键。
private void textBox1_KeyUp(object sender, KeyEventArgs e) {
var isEnterKey =
e.Key == System.Windows.Input.Key.Enter ||
e.PlatformKeyCode == 10;
if (isEnterKey) {
// ...
}
}
答案 4 :(得分:5)
面临同样的问题;以上示例仅提供有关的详细信息 如何捕获键盘按下事件(回答问题),但要 禁用键盘,onclick或输入,我只是将焦点设置为另一个 完全控制。
这将导致禁用键盘。
private void txtCodeText_KeyDown(object sender, KeyEventArgs e)
{
if(e.Key.Equals(Key.Enter))
{
//setting the focus to different control
btnTransmit.Focus();
}
}