Захват вкладки в Silverlight TextBox - PullRequest
7 голосов
/ 02 апреля 2009

Как захватить вкладку, введенную в текстовом поле Silverlight, и отобразить на ней 4 пробела (или вкладку)?

Не могу понять, как заблокировать навигацию по вкладкам.

Ответы [ 3 ]

8 голосов
/ 08 мая 2009

Вот что я делаю (похоже на код Йоханнеса):

        private const string Tab = "    ";
    void textBox_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Tab)
        {
            int selectionStart = textBox.SelectionStart;
            textBox.Text = String.Format("{0}{1}{2}", 
                textBox.Text.Substring(0, textBox.SelectionStart),
                Tab,
                textBox.Text.Substring(textBox.SelectionStart + textBox.SelectionLength, (textBox.Text.Length) - (textBox.SelectionStart + textBox.SelectionLength))
                );
            e.Handled = true;
            textBox.SelectionStart = selectionStart + Tab.Length;
        }
    }

Это ведет себя так, как вы ожидаете, даже если вы выделите какой-нибудь текст и нажмете клавишу "Tab".

Еще одна вещь: я пытался использовать строку табуляции как "\ t", но безрезультатно. Вкладка отображается, но имеет ширину одного пробела - следовательно, значение для const Tab равно четырем пробелам.

1 голос
/ 24 июля 2010

Мне показалось, что это хорошо работает и не требует второго обработчика событий или жесткого кодирования имени текстового поля:

void TabbableTextBox_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Tab)
            {
                e.Handled = true;

                var tb = ((TextBox)sender);
                tb.Text += "\t";
                tb.Select(tb.Text.Length, 0);
            }
        }
1 голос
/ 06 мая 2009

Я не уверен, как решить вашу проблему, я взломал решение, хотя, похоже, оно работает.

Установите событие KeyDown, как показано ниже.

expenses.KeyDown += new KeyEventHandler(expenses_KeyDown);

В этом случае я поставил следующий код:

void expenses_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Tab)
            {
                expenses.Text += "    ";
                expenses.Focus();
                expenses.LostFocus += new RoutedEventHandler(expenses_LostFocus);
            }
        }

А потом в LostFocus:

void expenses_LostFocus(object sender, RoutedEventArgs e)
        {
            expenses.Focus();
            expenses.Select(expenses.Text.Length - 1, 0);
        }

Последняя строка в LostFocus устанавливает курсор редактирования в конец текста, в противном случае, когда он получает фокус, позиция курсора находится в начале текстового поля

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