我有两个UserControls
一个有一个TreeView
,另一个有一个Button
和一个DataGrid
。
我想要实现的是什么时候应该Tab
在TreeViewItem
第二个 UserControl 中将 KeyBoard Focus 赋予 DataGrid。
我看过不同的帖子,但没有运气。在下面找到我的 XAML,
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<UC:ExplorerView DataContext="{Binding ExplorerViewModel}" Grid.Row="0"/>
<UCs:TableOfContentView DataContext="{Binding TableOfContentViewModel}" x:Name="TOCView" Grid.Row="1"/>
</Grid>
该问题的简化 XAML。
我试图UserControl
通过添加事件将焦点设置为第二个PreviewKeyDown
private void ExplorerView_KeyDown(object sender, KeyEventArgs e)
{
if(e.Key == Key.Tab)
{
Keyboard.Focus(TOCView);
}
}
但这将重点放在 USerControl 上,而不是上面提到的 DataGrid 上。
试过Attach
了。Property
_ DataGrid
它按预期工作,但没有将重点放在first row
. 这个线程给出了输入。
解决了:)
创建AttachedProperty
上面线程中提到的并修改回调方法以将焦点设置到DataGrids
第一行,如下所示,
private static object OnCoerceValue(DependencyObject d, object baseValue)
{
if (((DataGrid)d).HasItems)
{
DataGridRow row = ((DataGrid)d).ItemContainerGenerator.ContainerFromIndex(0) as DataGridRow;
if(row !=null)
{
if ((bool)baseValue)
{
FocusManager.SetIsFocusScope(row, true);
FocusManager.SetFocusedElement(row, row);
}
else if (((UIElement)d).IsFocused)
Keyboard.ClearFocus();
}
}
return ((bool)baseValue);
}
请随时添加任何更好的解决方案。提前致谢。