使用FocusManager.FocusedElement聚焦文本框的问题

4
我试图设置键盘焦点到一个包含在StackPanel中的文本框上。当IsEditMode变为true时,我希望文本框默认成为焦点。
我尝试过以下代码:
<DataTemplate x:Key="LibraryItemTemplate">
<StackPanel Orientation="Vertical">
    <StackPanel.Style>
       <Style TargetType="StackPanel">
          <Style.Triggers>
               <DataTrigger Binding="{Binding IsEditMode}" Value="True">
                   <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=TxtB}"/>
               </DataTrigger>
          </Style.Triggers>
       </Style>
    </StackPanel.Style>

    <TextBlock x:Name="TxtA" Text="A" />
    <TextBox x:Name="TxtB" Text="B" Visibility="{Binding IsEditMode, Converter={StaticResource BoolVisibilityCollapsed}}"/>
</StackPanel>
</DataTemplate>
....
<ListView x:Name="LibraryListView" SelectedItem="{Binding SelectedItem,   UpdateSourceTrigger=PropertyChanged}" >
<ListView.View>
    <GridView>
        <GridViewColumn CellTemplate="{StaticResource LibraryItemTemplate}"  Width="Auto"/>
    </GridView>
</ListView.View>

但问题在于鼠标没有标记,似乎键盘焦点不在文本框中,我必须再次单击鼠标到文本框,才能在文本框中输入一些文本。有什么想法吗?

如果TxtB始终可见,您是否仍然遇到此问题?(暂时删除可见性绑定。)我想知道当您尝试将其聚焦时,TxtB是否尚未可见。您是否看过这篇SO帖子?https://dev59.com/QXA75IYBdhLWcg3wxsNn - Darlene
好的,我去掉了可见性并且它可以工作了,但是我仍然需要以某种方式隐藏它,并且在IsEditMode为false时显示TextBlock,反之亦然。那么如何实现这个功能呢? - artos
看看这篇StackOverflow的帖子,讨论了当文本框变为可见时如何聚焦。https://dev59.com/QXA75IYBdhLWcg3wxsNn - Darlene
我也尝试过那个方法,它也有效,所以我们有两种实现方式,非常感谢。 - artos
如果问题已经解决,那么考虑添加一个答案吧? - Sheridan
1个回答

3

在FocusManager设置完焦点后,您需要处理此事件,在事件中您需要添加以下内容:

<TextBox x:Name="TxtB" 
         Text="B" 
         GotFocus="TxtB_GotFocus"  
         Visibility="{Binding IsEditMode
             , Converter={StaticResource BoolVisibilityCollapsed}}"/>

....
private void TxtB_GotFocus(object sender, RoutedEventArgs e)
{
    this.Dispatcher.BeginInvoke((Action)delegate
    {
       Keyboard.Focus(TxtB);
    }, DispatcherPriority.Render);
}

非常感谢 Darlene

我自己添加了答案,以满足 Sheridan 的建议 非常感谢


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接