我有这个要求,当用户按Tab键时,我需要将第一个元素聚焦在扩展器中。
当前(默认行为)焦点转到扩展器,我试图通过在扩展器中创建一个焦点事件处理程序来聚焦扩展器的第一个元素,如下所示:
private void ExpanderGotFocus(object sender, RoutedEventArgs e)
{
var expander = (Expander) sender;
if (!expander.IsExpanded)
{
expander.IsExpanded = true;
this._someText.Focus();
}
}
哪个不起作用。
我也试图将焦点放在下一个元素上:
var tRequest = new TraversalRequest(FocusNavigationDirection.Next);
var keyboardFocus = Keyboard.FocusedElement as UIElement;
keyboardFocus.MoveFocus(tRequest);
但仅在第二次工作时(当扩展器至少打开一次时)
我试图把它放在一个线程和其他一些疯狂的想法中。
如何关注扩展器中的第一个元素 ? (第一次关闭扩展器)
答案 0 :(得分:6)
我尝试了几种方法,但没有一种方法有效,基本上问题是当扩展器扩展时(早期),TextBox仍在渲染。
所以我发现将IsVisibleChanged
事件添加到文本框中,以便当扩展器完成后,文本框变为可见并请求焦点
XAML
<Expander GotFocus="ExpanderGotFocus">
<Expander.Header>
<TextBlock Text="{x:Static Client:Strings.XYZ}" />
</Expander.Header>
<Expander.Content>
<StackPanel>
<TextBox IsVisibleChanged="ControlIsVisibleChanged" Name="txtBox" />
</StackPanel>
</Expander.Content>
</Expander>
背后的代码
private void ExpanderGotFocus(object sender, RoutedEventArgs e)
{
var expander = (Expander) sender;
if (!expander.IsExpanded )
{
expander.IsExpanded = true;
}
}
private void ControlIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
Keyboard.Focus((IInputElement)sender);
}
答案 1 :(得分:0)
请查看以下内容,
XAML代码:
<StackPanel>
<Expander Header="Expander"
Name="expander"
Collapsed="OnCollapsed"
IsExpanded="True" >
<StackPanel>
<TextBox Text="Text1" Name="textBox1" />
<TextBox Text="Text2" Name="textBox2" />
<TextBox Text="Text3" Name="textBox3" />
</StackPanel>
</Expander>
<TextBox Text="Text4" Name="textBox4" />
</StackPanel>
in the code behind:
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
this.Loaded += delegate
{
textBox2.Focus();
};
}
private void OnCollapsed(object sender, RoutedEventArgs e)
{
var element = Keyboard.FocusedElement;
if (element != null)
{
//now is the ToggleButton inside the Expander get keyboard focus
MessageBox.Show(element.GetType().ToString());
}
//move focus
Keyboard.Focus(textBox4);
}
}