Как программно установить порядок вкладок

Я строю окно из кода. Я добавляю заголовок TextBlock, а затем несколько различных элементов для listBox, в котором каждый элемент состоит из Grid ---> children[0] TextBlock, чтобы объяснить, что представляет собой элемент ---> children 1 TextBox или комбинированный список для ввода данные. В конце кнопка.

После генерации поместите фокус на первый элемент (обычно первый TextBox), чтобы пользователь мог сразу же ввести данные. До этого все работает.

--ADD-- Я забыл упомянуть, что каждый элемент = Grid = Textblock + TextBox или combobox, является элементом родительского listBox. Поэтому я бы хотел перейти от каждого текстового поля или поля со списком независимо от элемента списка, в котором они находятся.

После этого я хочу, чтобы пользователь мог перейти к следующему элементу (текстовое поле или поле со списком) через TAB. Поэтому при создании предыдущих окон я использую счетчик и устанавливаю

tb.TabIndex = tabIndex++;

или ComboBox.TabIndex = tabIndex++;

Теперь проблема в том, что после ввода данных в первом TextBox, когда я нажимаю TAB, каретка теряется и фокус...

--- ADD2 --- Вот код:

 private void PreparareTraceFieldGrid(ListBox lbTracefields, ObservableCollection<Tuple<string, object, object>> obc, bool IsReadOnly)
 {
        bool IsFocusSet = false;
        /*---TITOLO---*/
        OutlinedTextBlock otbTitle = CreateOtbForTraceFieldInputWindow(Languages.Word(eWords.InsertTracefields));
        lbTracefields.Items.Add(otbTitle);
        /*----CICLO----*/
        int tabIndex = 0;
        foreach (var item in obc)
        {
            Grid gridInternal = new Grid();
            gridInternal.Background = Brushes.Transparent;

            ColumnDefinition cd1 = new ColumnDefinition();
            cd1.Width = new GridLength(300, GridUnitType.Pixel);
            ColumnDefinition cd2 = new ColumnDefinition();
            cd2.Width = new GridLength(1.0, GridUnitType.Star);
            gridInternal.ColumnDefinitions.Add(cd1);
            gridInternal.ColumnDefinitions.Add(cd2);

            OutlinedTextBlock otb = CreateOtbForTraceFieldInputWindow(item.Item1);
            otb.FontSize = easyRunData.OptionsGraphical.FontSize;
            otb.Stroke = new SolidColorBrush(easyRunData.OptionsGraphical.StrokeColour);
            otb.StrokeThickness = easyRunData.OptionsGraphical.StrokeSize;
            Grid.SetColumn(otb, 0);
            gridInternal.Children.Add(otb);

            string strDataType = item.Item2.ToString();
            eTraceFieldDataTypes eDataType = (eTraceFieldDataTypes)Enum.Parse(typeof(eTraceFieldDataTypes), strDataType);

            switch (eDataType)
            {
                case eTraceFieldDataTypes.STRING:
                case eTraceFieldDataTypes.FLOAT:
                case eTraceFieldDataTypes.INTEGER:
                case eTraceFieldDataTypes.STRING_READONLY:
                    TextBox tb = new TextBox();
                    tb.CaretBrush = Brushes.White;
                    tb.FontSize = easyRunData.OptionsGraphical.FontSize;
                    tb.MinWidth = 200;
                    tb.Height = easyRunData.OptionsGraphical.FontSize + 15;
                    tb.VerticalAlignment = VerticalAlignment.Center;
                    tb.Background = Brushes.Transparent;
                    tb.Margin = new Thickness(10);
                    tb.TabIndex = tabIndex++;
                    tb.KeyDown += (senderEvent, args) => { AnalyzeTraceFields_IF_EMPTY(easyRunData.Tracefields.TraceFieldsUser, (Grid)lbTracefields.Parent); };

                    if (eDataType == eTraceFieldDataTypes.STRING_READONLY && !IsReadOnly)
                        tb.BorderBrush = Brushes.Yellow;
                    else
                        tb.BorderBrush = Brushes.Gainsboro;
                    Grid.SetColumn(tb, 1);
                    gridInternal.Children.Add(tb);
                    lbTracefields.Items.Add(gridInternal);
                    if (!IsFocusSet)
                    {
                        tb.Focus();
                        IsFocusSet = true;
                    }
                    break;
                case eTraceFieldDataTypes.BOOL:
                case eTraceFieldDataTypes.BOOL_READONLY:
                    Border brd = new Border();
                    brd.Margin = new Thickness(10);
                    brd.MinWidth = 200;
                    brd.Height = easyRunData.OptionsGraphical.FontSize + 15;
                    if (eDataType == eTraceFieldDataTypes.BOOL_READONLY && !IsReadOnly)
                        brd.BorderBrush = Brushes.Yellow;
                    else
                        brd.BorderBrush = Brushes.Gainsboro;
                    brd.BorderThickness = new Thickness(3);
                    ComboBox cmb = new ComboBox();
                    cmb.VerticalAlignment = VerticalAlignment.Center;
                    cmb.Background = Brushes.Transparent;
                    cmb.Items.Add(Languages.Word(eWords.True));
                    cmb.Items.Add(Languages.Word(eWords.False));
                    cmb.BorderBrush = Brushes.Gainsboro;
                    cmb.BorderThickness = new Thickness(3);
                    cmb.Margin = new Thickness(0);
                    cmb.TabIndex = tabIndex++;
                    cmb.DropDownClosed += (senderEvent, args) => { AnalyzeTraceFields_IF_EMPTY(easyRunData.Tracefields.TraceFieldsUser, (Grid)lbTracefields.Parent); };
                    Grid.SetColumn(brd, 1);
                    brd.Child = cmb;
                    gridInternal.Children.Add(brd);
                    lbTracefields.Items.Add(gridInternal);
                    if (!IsFocusSet)
                    {
                        cmb.Focus();
                        IsFocusSet = true;
                    }
                    break;
                default:
                    break;
            }
}

0 ответов

Другие вопросы по тегам