我在WPF中有一個應用程序專門由鍵盤使用,所以我們對焦點行爲真的很挑剔。WPF焦點管理在.Net 4.0中
因此,我們在文本框中獲得了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是壞的重點管理,檢查http://joshsmithonwpf.wordpress.com/2010/03/16/control-input-focus-from-viewmodel-objects/,您可能會找到解決問題的方法。 – Matthieu
有一個優雅的解決方案,將不得不明天答覆答案,因爲我現在沒有可用的代碼。在此之前... – Dennis
我很高興看到你想出了什麼。謝謝。 –