当我在UWP应用程序中有一个TextBox时,对我来说是个奇怪的行为。
<TextBox Text="There's not much spam in it" Name="textBox" />
插入了一个标签。
导致此行为的原因是什么?
我试图通过将处理程序挂钩到Window.Current.CoreWindow.KeyDown
来尝试在Windows 10应用程序中设置窗口级快捷方式,但我认为在事件游戏中抓住控件太晚了 - 我的标签插入并调用它处理。那,我认为TextBox的KeyDown在CoreWindow事件发生之前就完全处理了。
所以现在,只要有人选择Control,我就会决定在每个 TextBox上处理事件 - 我喜欢这个...
将XAML编辑为:
<TextBox Text="There's not much spam in it"
Name="textBox" KeyDown="textBox_KeyDown" AcceptsReturn="True" />
添加事件处理程序:
private void textBox_KeyDown(object sender, KeyRoutedEventArgs e)
{
if (e.OriginalKey.Equals(VirtualKey.I)
&& Window.Current.CoreWindow.GetKeyState(VirtualKey.Control)
.HasFlag(CoreVirtualKeyStates.Down))
{
this.textBox.SelectedText += "X";
e.Handled = true;
}
}
...这似乎工作正常,除了现在我必须打我的&#34;窗口&#34;将Control-I的范围事件处理程序放入每个TextBox (或扩展TextBox,这两个对于看似非标准的键盘快捷方式看起来都很疯狂)。
所以主要是我在询问按下Control-I时将Tab插入TextBox是什么动作,以及是否有更好的方法可以避免在CoreWindow级别执行该操作。在CoreWindow级别捕获键盘快捷键的更好方法(例如,Ctrl-K意味着插入一个链接)也会受到赞赏,但不会真正回答真实的&#34;真实的&#34;问题
答案 0 :(得分:1)
我迄今为止发现的最佳解决方案是为KeyDown
插入一个会占用Ctrl-I的事件处理程序。
我在GitHub上有一个更全面的解决方案可以解决这个问题以及其他一些问题here,但这里是有效的Ctrl-I吃代码:
public UWPBox() : base()
{
this.KeyDown += this.KeyDownHandler;
}
public virtual async void KeyDownHandler(object sender, KeyRoutedEventArgs e)
{
bool isCtrlDown = Window.Current.CoreWindow.GetKeyState(VirtualKey.Control)
.HasFlag(CoreVirtualKeyStates.Down);
try
{
switch (e.OriginalKey)
{
case VirtualKey.I:
// First, kill the default "Ctrl-I inserts a tab" action.
if (isCtrlDown)
{
e.Handled = true;
this.HandleCtrlI(); // Just in case we want to do
// something different with Ctrl-I
}
break;
// "Fixes" for Ctrl-V and Tab removed.
// Fuller solution here: https://github.com/ruffin--/UWPBox
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(
DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + ": "
+ ex.Message);
}
}
public virtual void HandleCtrlI()
{
System.Diagnostics.Debug.WriteLine("Ctrl-I pressed.");
}