私は 2UserControls
つ持ってTreeView
いButton
ますDataGrid
。
私が達成しようとしているのは、2 番目の UserControl で KeyBoard フォーカスを DataGrid に与える必要がある場合Tab
ですTreeViewItem
。
さまざまな投稿を調べましたが、運がありません。以下の私の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);
}
}
しかし、これにより、上記のように DataGrid ではなく USerControl に焦点が当てられます。
にしようと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);
}
より良い解決策を自由に追加してください。前もって感謝します。