WPF DataGrid, кажется, игнорирует настройку IsTabStop при нажатии Enter - PullRequest
0 голосов
/ 25 мая 2018

У меня есть таблица данных с несколькими столбцами.Теперь обычно пользователь может нажимать TAB для переключения между элементами управления в ячейках DataGrid.Ячейки сетки данных были установлены в IsTabStop = false, поэтому он пропускает фокусировку на самой ячейке и просто проваливается до тех пор, пока фокус не будет отдан фактическому элементу управления.

Кажется, что это НЕ РАБОТАЕТ, если пользователь нажимает Enterпотому что они хотят работать в том же столбце.DataGrid передаст фокус следующей ячейке в COLUMN, НО также будет игнорировать настройку IsTabStop, поэтому он просто фокусирует внимание на самой ячейке, а не на элементе управления внутри.

Любые идеи, как это исправить.

Краткий пример

<DataGrid AutoGenerateColumns="False" Name="grid1" >
    <DataGrid.Resources>
        <Style TargetType="{x:Type Border}" x:Key="coloredBorder">
            <Setter Property="Background" Value="Yellow"/>
        </Style>
        <Style TargetType="DataGridCell">
            <Setter Property="IsTabStop" Value="False"/>
        </Style>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding A, Mode=OneWay}" Header="A"/>
        <DataGridTemplateColumn Header="B">
            <DataGridTemplateColumn.CellStyle>
                <Style TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource {x:Type DataGridCell}}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type DataGridCell}">
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition/>
                                    </Grid.ColumnDefinitions>
                                    <Border BorderBrush="Black" BorderThickness="0,0,1,0" Width="20" Height="20" Style="{DynamicResource coloredBorder}"/>
                                    <ComboBox Grid.Column="1" SelectedItem="{Binding A, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                                                ItemsSource="{Binding MenuItems, ElementName=window}"></ComboBox>
                                </Grid>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </DataGridTemplateColumn.CellStyle>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

Также я добавил пример приложения WPF для этого здесь .Чтобы воспроизвести, нажмите на один из выпадающих списков, чтобы сосредоточиться.На вкладке Pres вы увидите, что следующее поле со списком фокусируется нормально.Если бы я добавил более одного столбца со списком, поле со списком справа получило бы фокус.

НО, если вы нажмете ввод, фокус перейдет к ячейке ниже, но затем не пропустит ячейку и не перейдетдля содержимого клетки.Вместо ячейки подсвечивается.Вот так:

enter image description here

1 Ответ

0 голосов
/ 17 июня 2018

Основано на ответе , который я получил на MSDN :

Я решил эту проблему с помощью присоединенного свойства:

using System.Windows;
using System.Windows.Input;

namespace GridTabbing
{
    public class EnterKeySample
    {
        public static bool GetIsEnabled(DependencyObject obj)
        {
            return (bool)obj.GetValue(IsEnabledProperty);
        }

        public static void SetIsEnabled(DependencyObject obj, bool value)
        {
            obj.SetValue(IsEnabledProperty, value);
        }

        static void ue_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
            var ue = e.OriginalSource as FrameworkElement;

            if (e.Key == Key.Enter)
            {
                e.Handled = true;
                ue.MoveFocus(new TraversalRequest(FocusNavigationDirection.Down));
            }
        }

        private static void ue_Unloaded(object sender, RoutedEventArgs e)
        {
            var ue = sender as FrameworkElement;
            if (ue == null) return;

            ue.Unloaded -= ue_Unloaded;
            ue.PreviewKeyDown -= ue_PreviewKeyDown;
        }

        public static readonly DependencyProperty IsEnabledProperty =
            DependencyProperty.RegisterAttached("IsEnabled", typeof(bool),
            typeof(EnterKeySample), new UIPropertyMetadata(false, IsEnabledChanged));

        static void IsEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var ue = d as FrameworkElement;
            if (ue == null) return;

            if ((bool)e.NewValue)
            {
                ue.Unloaded += ue_Unloaded;
                ue.PreviewKeyDown += ue_PreviewKeyDown;
            }
            else
            {
                ue.PreviewKeyDown -= ue_PreviewKeyDown;
            }
        }
    }
}

Странный бит - единственное, что этоделает, говорит WPF, чтобы передать фокус ВНИЗ, когда пользователь нажимает Enter, что, я бы предположил, уже происходило, но, очевидно, нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...