好的,我知道这个标题看起来好像在Stack Overflow上有很多答案,但是我在这里找到的答案都不适用于我。所以,接下来就是我的问题。
我有这个布局:
<Window>
<Grid>
<DockPanel>
<TabControl>
<TabItem>
<Page x:Name="p">
<Grid x:Name="g2">
<TabControl x:Name="tc">
<TabItem x:Name="ti1">
<StackPanel x:Name="sp">
<C:TextBox x:Name="txt"/>
</StackPanel>
</TabItem>
<TabItem x:Name="ti2">
<C:DataGrid x:Name="dg"/>
</TabItem>
</TabControl>
</Grid>
</Page>
</TabItem>
</TabControl>
</DockPanel>
</Grid>
</Window>
现在,我的目标是在选中 ti1
TabItem
时将焦点放在 txt
TextBox
上,在选中 ti2
TabItem
时将焦点放在 dg
DataGrid
上。此外,我非常希望能够在 XAML
中设置这些。
注意:我只能使用这里提到的控件,所以仅限于 Page
控件。
我已经尝试过:
- 在
txt
控件的父级树中 (直到Page
控件),设置FocusManager.FocusedElement="{Binding ElementName=txt}"
。 - 在
txt
和dg
控件上,设置FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"
。 通过
TabControl
的SelectionChanged
事件,在代码中设置焦点:- if ( ti1.IsSelected ) { tc.UpdateLayout(); FocusManager.SetFocusedElement( sp, txt ); }
- 和
- if ( ti1.IsSelected ) { tc.UpdateLayout(); txt.Focus(); }
TextBox
和 DataGrid
控件像这样创建为 UserControl
,但实际上是继承自 TextBox
和 DataGrid
的类:
<TextBox ... </TextBox>
并且
public partial class TextBox : System.Windows.Controls.TextBox
就像我之前说的一样,希望使用XAML
语言来解决问题,但如果无法实现,也可以采用代码方式。
SetFocusedElement
之外的所有解决方案都没有任何效果。但是使用FocusManager
可以在TextBox
中看到可见的Caret
,但焦点不在那里,我无法输入。而且这只在页面最初打开时有效,当我选择其他选项卡,然后返回第一个选项卡时,即使Caret
也不可见。 - Adder