gpt4 book ai didi

wpf - 如何防止输入控件从 TextCompositionManager 窃取空格字符?

转载 作者:行者123 更新时间:2023-12-02 04:28:10 24 4
gpt4 key购买 nike

与此问题相关(但不是欺骗!):Help with the WPF TextCompositionManager events

使用TextCompositionManager时,我遇到一个问题,如果文本框等输入控件具有焦点,则文本框将在我有机会执行操作之前“窃取”空格字符就在上面。

例如,我们有以下代码:

public Window1()
{
TextCompositionManager.AddPreviewTextInputStartHandler
(this, PreviewTextInputStartHandler);
}

private void PreviewTextInputHandler(object sender, TextCompositionEventArgs e)
{
CaptureTextBlock.Text += e.Text;
e.Handled = true;
}

Window1 的样子:

<!--standard window crap above here-->
<StackPanel>
<TextBlock Name="CaptureTextBlock" />
<TextBox Name="ThievingBastard" />
</StackPanel>
<!-- snip -->

现在,如果我运行此应用程序并立即输入“我讨厌小偷 SCSS ”,则 TextBlock 将包含文本“我讨厌小偷 SCSS ”,并且文本框将为空。

但是,如果我聚焦文本框(即文本框具有键盘焦点),则在输入上述行后,文本 block 将包含文本“Ihaetthifyingbastards”,并且文本框将包含文本“”(3 个空格)。

<小时/>

我有两个问题:
1) 我可以仅使用 TextCompositionManager 提供的功能来防止这种情况发生吗?
2)如果没有,我到底应该在哪里插入文本输入堆栈,以便我可以完全控制我的WPF应用程序中的文本输入(甚至考虑p/调用的缺点)(你只是想关于它,添加了负分)?

<小时/>

更新

我正在使用一种巧妙的解决方法,仅处理来自 InputManager 的空格隧道 KeyDown 事件。这种方法非常笨拙,效率低下,而且基本上很臭。仍在寻找更好的方法。

最佳答案

为了他人的利益,我的黑客代码。

我的特定应用程序正在等待读卡器刷卡。以下内容存在于监视刷卡的对象的构造函数中(这是一个副项目;大多数评论咒骂已被删除):

// this is where we handle the space and other keys wpf f*s up.
System.Windows.Input.InputManager.Current.PreNotifyInput +=
new NotifyInputEventHandler(PreNotifyInput);
// This is where we handle all the rest of the keys
TextCompositionManager.AddPreviewTextInputStartHandler(
Application.Current.MainWindow,
PreviewTextInputHandler);

两种方法:

/// <summary>
/// Handles the PreNotifyInput event of the input manager.
/// </summary>
/// <remarks>Because some controls steal away space (and other) characters,
/// we need to intercept the space and record it when capturing.</remarks>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The
/// <see cref="System.Windows.Input.NotifyInputEventArgs"/>
/// instance containing the event data.</param>
private void PreNotifyInput(object sender, NotifyInputEventArgs e)
{
// I'm only interested in key down events
if (e.StagingItem.Input.RoutedEvent != Keyboard.KeyDownEvent)
return;
var args = e.StagingItem.Input as KeyEventArgs;
// I only care about the space key being pressed
// you might have to check for other characters
if (args == null || args.Key != Key.Space)
return;
// stop event processing here
args.Handled = true;
// this is my internal method for handling a keystroke
HanleKeystroke(" ");
}


/// <summary>
/// This method passes the event to the HandleKeystroke event and turns
/// off tunneling depending on whether or not Capturing is true.
/// Also calls StopCapturing when appropriate.
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The
/// <see cref="System.Windows.Input.TextCompositionEventArgs"/>
/// instance containing the event data.</param>
private void PreviewTextInputHandler(object sender,
TextCompositionEventArgs e)
{
HanleKeystroke(e.Text);
}

当有人按下某个键(或向系统发送击键)时,将触发 PreNotifyInput 事件。在这种情况下,我确定它是否是一个特殊的键(对我来说,我必须担心空格,但其他键显然需要特别注意)。如果它是一个特殊键,我将“处理”该事件,停止对该击键的所有进一步处理。然后,我调用传入空格的内部处理方法(或我刚刚截获的任何特殊键)。

所有其他键均由 PreviewTextInputHandler 方法处理。

这段代码去掉了很多东西。确定滑动事件何时发生、确定滑动何时完成、防护措施(超时,以防我永远不会停止捕获滑动)等都被删除。您如何执行此操作将取决于您的代码要求。

关于wpf - 如何防止输入控件从 TextCompositionManager 窃取空格字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1053533/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com