KeyBoard焦点wpf:当从不同的UserControls TreeView按下TAB时,将KeyBoard焦点设置为DataGrids第一行

时间:2015-09-28 19:59:21

标签: c# wpf xaml keyboardfocusmanager

我有两个UserControls一个有TreeView,另一个有ButtonDataGrid

我想要实现的是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上。 this thread给出了输入。


解决了:)

创建了上面线程中提到的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);            
    }

请随意添加更好的解决方案。在此先感谢。

1 个答案:

答案 0 :(得分:0)

创建了上面线程中提到的Ñ并修改了回调方法,将焦点设置为AttachedProperty第一行,如下所示,

DataGrids