将焦点放在扩展器内的组件上

Osc*_*Ryz 2 c# wpf

我有这个要求,当用户按Tab键时我需要将第一个元素聚焦在扩展器内.

当前(默认行为)焦点转到扩展器,我试图通过在扩展器中创建焦点事件处理程序来聚焦扩展器的第一个元素,如下所示:

private void ExpanderGotFocus(object sender, RoutedEventArgs e)
{
    var expander = (Expander) sender;

    if (!expander.IsExpanded)
    {
        expander.IsExpanded = true;
        this._someText.Focus();
    }        
}
Run Code Online (Sandbox Code Playgroud)

哪个不起作用.

我也尝试将焦点放在下一个元素上:

var tRequest = new TraversalRequest(FocusNavigationDirection.Next);
var keyboardFocus = Keyboard.FocusedElement as UIElement;
keyboardFocus.MoveFocus(tRequest);
Run Code Online (Sandbox Code Playgroud)

但只能第二次工作(当扩展器至少打开一次时)

我试图把它放在一个线程和其他一些疯狂的想法.

如何将焦点放在扩展器的第一个元素上?(膨胀机第一次关闭)

Osc*_*Ryz 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>
Run Code Online (Sandbox Code Playgroud)

代码背后

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);
}
Run Code Online (Sandbox Code Playgroud)