MoveFocus не будет срабатывать при событии щелчка заголовка TabItem - PullRequest
0 голосов
/ 18 октября 2018

DataGrid находится на Tab1.Если я нахожусь на Tab2 и нажимаю на заголовок Tab1, программа переключается на Tab1 и DataGrid прокручивается в правильном положении, но выбранный Row не будет сфокусирован (выделен), если я снова не нажму на заголовок Tab1.Остальная часть кода срабатывает просто отлично.

CS

private void Tab1_Clicked(object sender, MouseButtonEventArgs e)
{
    if (dg_address.SelectedIndex > -1)
    {
        dg_address.ScrollIntoView(dg_address.Items[dg_address.SelectedIndex]);
        DataGridRow row = (DataGridRow)dg_address.ItemContainerGenerator.ContainerFromIndex(dg_address.SelectedIndex);
        row.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
    }
}

XAML

<TabControl x:Name="tab_control"
            HorizontalAlignment="Stretch"
            VerticalAlignment="Stretch"
            Background="#FFE5E5E5">

    <TabItem>
        <TabItem.Header>
            <Label Content="Seznam"
                   MouseLeftButtonDown="Tab1_Clicked"/>
        </TabItem.Header>

1 Ответ

0 голосов
/ 18 октября 2018

Нашел решение здесь: https://social.msdn.microsoft.com/Forums/vstudio/en-US/3baa240a-c687-449e-af77-989ff4d78333/how-to-move-focus-to-a-textbox-in-a-tabcontrol-on-a-button-click?forum=wpf

private void Tab1_Clicked(object sender, MouseButtonEventArgs e)
{
    if (dg_address.SelectedIndex > -1)
    {
        dg_address.ScrollIntoView(dg_address.Items[dg_address.SelectedIndex]);
        Dispatcher.InvokeAsync(() =>
        {
            DataGridRow row = (DataGridRow)dg_address.ItemContainerGenerator.ContainerFromIndex(dg_address.SelectedIndex);
            row.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
        }
        );
    }
}

или

private void Tab1_Clicked(object sender, MouseButtonEventArgs e)
{
    if (dg_address.SelectedIndex > -1)
    {
        dg_address.ScrollIntoView(dg_address.Items[dg_address.SelectedIndex]);
        Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
        {
            DataGridRow row = (DataGridRow)dg_address.ItemContainerGenerator.ContainerFromIndex(dg_address.SelectedIndex);
            row.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
        }
        ));
    }
}

Редактировать: Оптимизирована и устранена ошибка в коде.

...