WPF focus DataGrid во время события GotFocus другой проблемы управления - PullRequest
0 голосов
/ 16 октября 2019

В соответствии с ответом на Событие, когда происходит цикл KeyboardNavigation.TabNavigation , решение состоит в том, чтобы добавить невидимый элемент управления в качестве последнего TabIndex области фокуса детализации, обрабатывая GotFocus() для этого фиктивного элемента,В рамках обработки этого «события» я хотел бы переместить фокус обратно в основную сетку MasterDG.Focus():

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="2*"/>
        <RowDefinition Height="1*"/>
    </Grid.RowDefinitions>
    <DataGrid Name="MasterDG" ItemsSource="{Binding Items}" FocusManager.IsFocusScope="True"/>
    <StackPanel Name="Detail" Grid.Row="1"  FocusManager.IsFocusScope="True">
        <TextBox/>
        <TextBox/>
        <TextBox/>
        <Control Name="DummyControl" 
                 GotFocus="DummyControl_GotFocus"/>
    </StackPanel>
</Grid>

Обработчик событий

private void DummyControl_GotFocus(object sender, RoutedEventArgs e)
{
    Save(); //save when done editing last element of detail
    MasterDG.Focus();
}

Однако это вызывает не только MasterDGбыть сфокусированным, но также войти в режим редактирования на текущую ячейку и вставить символ \t, перезаписывая содержимое любой ячейки. Как я могу исправить проблему?
Обратите внимание, что фактическое содержимое Detail генерируется динамически.

1 Ответ

1 голос
/ 16 октября 2019

Простой обходной путь - вызвать Focus() в следующем цикле диспетчеризации:

private void DummyControl_GotFocus(object sender, RoutedEventArgs e)
{
    Save(); //save when done editing last element of detail
    Dispatcher.BeginInvoke(new Action(() => MasterDG.Focus()));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...