1

我有两个UserControls一个有一个TreeView,另一个有一个Button和一个DataGrid

我想要实现的是什么时候应该TabTreeViewItem第二个 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);            
    }

请随时添加任何更好的解决方案。提前致谢。

4

1 回答 1

2

创建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);            
    }
于 2015-11-24T20:28:51.650 回答