gpt4 book ai didi

.net - .Net 4.0 中的 WPF 焦点管理

转载 作者:行者123 更新时间:2023-12-01 02:44:45 25 4
gpt4 key购买 nike

我在 WPF 中有一个专门由键盘使用的应用程序,所以我们对焦点行为非常挑剔。

因此,我们在文本框上获得了 PreviewLostKeyboardFocus。在某些情况下,我们禁用接下来的 5 个字段,并希望焦点转到之后的字段。人们可能会假设焦点会这样做,找到下一个可聚焦的字段,如果我没有禁用预览事件中的字段,就会发生这种情况。它没有,它将焦点放在第一个文本框上。

我试过用 Keyboard.Focus(uielement) 强制聚焦但什么也没有发生。看来下一个焦点目标已经提交了。

我怎样才能做到这一点,或者我“做错了”?我无法更改指定此行为的要求;我知道这有些奇怪。

谢谢。

编辑:这是一个显示此行为的小应用程序。
XAML:

<Window x:Class="WpfApplication4.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
FocusManager.FocusedElement="{Binding ElementName=textBox0}"
>
<StackPanel>
<TextBox Height="23" Margin="5" Name="textBox0" Width="120" />
<TextBox Height="23" Margin="5" Name="textBox1" Width="120" PreviewLostKeyboardFocus="textBox1_PreviewLostKeyboardFocus"/>
<TextBox Height="23" Margin="5" Name="textBox2" Width="120" />
<TextBox Height="23" Margin="5" Name="textBox3" Width="120" />
<TextBox Height="23" Margin="5" Name="textBox4" Width="120" />
</StackPanel>
</Window>

代码隐藏:
using System.Windows;
using System.Windows.Input;

namespace WpfApplication4 {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
private void textBox1_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) {
textBox2.IsEnabled = false;
textBox3.IsEnabled = false;
}
}
}

一个明显的尝试(至少对我来说)是把 Keyboard.focus(textBox4);PreviewLostKeyboardFocus事件处理程序。它当然没有用,它导致循环触发 PreviewLostKeyboardFocus又来事件了....

另一个编辑:
我发现在 textBox1_PreviewLostKeyboardFocus() 中使用断点有时会导致它的行为,有时甚至不会禁用第二个和第三个文本框。我在考虑种族/线程问题。

最佳答案

我不确定究竟是什么导致了这种行为,但根据过去的经验,WPF 焦点系统在以任何方式更改控件或手动设置焦点后非常不可靠。

但是,在 WPF catch 控件的更改后使用 Dispatcher 执行焦点更改,通常可以解决问题。

这在我的测试中工作正常

private void textBox1_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) {
textBox2.IsEnabled = false;
textBox3.IsEnabled = false;

this.Dispatcher
.BeginInvoke(new Action(() => Keyboard.Focus(textBox4)),
System.Windows.Threading.DispatcherPriority.Input, null);
}

关于.net - .Net 4.0 中的 WPF 焦点管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7163411/

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