В случае, если кто-то еще находится в той же ситуации, вот решение, которое я закончил. Это, на мой взгляд, ужасно уродливо, насколько просто проблема, а также довольно неудовлетворительная. Если у кого-то есть лучшее решение, я хотел бы услышать об этом.
Общая идея - переопределить событие KeyDown для Tab, чтобы вставить символ '\ t'. Было бы замечательно также переопределить событие KeyDown для Ctrl + Tab, но это не представляется возможным, поскольку какой-то hardcoding в TextBox поглощает событие Ctrl + Tab KeyDown, и он даже не срабатывает. Поэтому событие KeyUp для Ctrl + Tab переопределяется.
KeyDown(Platform::Object^ sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs^ e)
{
if (e->Key == VirtualKey::Control) m_CtrlKeyPressed = true;
else if (e->Key == VirtualKey::Tab) {
// There is no need to test for if Ctrl is pressed here, since Ctrl-Tab appears to
// be hardcoded into TextBox.
// When Ctrl is pressed, a KeyDown event for Tab is never fired by TextBox.
// Normally TextBox will try to give up focus when Tab is pressed - this prevents
// that.
e->Handled = true;
// Platform::Strings support almost no operations, so we will need to cast the
// TextBox's text into a wstring to insert.
TextBox^ textBox = static_cast<TextBox^>(sender);
std::wstring modifiedString(textBox->Text->Data());
// SelectionStart works as current cursor position even when no text is selected.
int cursorPosition = textBox->SelectionStart;
// Unfortunately, casting into a wstring reveals Windows line-endings as \r\n,
// which count as two characters now.
// Therefore, every time we run into a line-ending our cursorPosition will become
// off by one, so we need to compensate.
int offsetDueToLineEndings = 0;
for (int i = 0; i < cursorPosition + offsetDueToLineEndings; i++)
{
if (modifiedString[i] == '\r') offsetDueToLineEndings++;
}
modifiedString.insert(cursorPosition + offsetDueToLineEndings, 1, '\t');
// Unfortunately, this text replacement wipes TextBox's built-in undo data.
textBox->Text = ref new String(modifiedString.c_str());
textBox->SelectionStart = cursorPosition + 1;
}
}
KeyUp(Platform::Object^ sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs^ e)
{
if (e->Key == VirtualKey::Control) m_CtrlKeyPressed = false;
else if (m_CtrlKeyPressed)
{
if (e->Key == VirtualKey::Tab) {
// See KeyDown for Tab for comments on this code.
TextBox^ textBox = static_cast<TextBox^>(sender);
std::wstring modifiedString(textBox->Text->Data());
int cursorPosition = textBox->SelectionStart;
int offsetDueToLineEndings = 0;
for (int i = 0; i < cursorPosition + offsetDueToLineEndings; i++)
{
if (modifiedString[i] == '\r') offsetDueToLineEndings++;
}
modifiedString.erase(cursorPosition + offsetDueToLineEndings - 1, 1);
textBox->Text = ref new String(modifiedString.c_str());
textBox->SelectionStart = cursorPosition - 1;
// Do something with Ctrl+Tab
}
}
}
С этой реализацией существует ряд серьезных проблем.
Для простого Tab печати:
- Вставка из Tab приводит данные отмены для TextBox протирать.
Для печати Ctrl + Tab:
Если пользователь удерживает Ctrl + Tab, несколько вкладок будут вставлены, пока он не освободит Tab.
При запуске в течение сплит-момента открывается и удаляется вкладка, которая выглядит дрянной.
Использование Ctrl + Tab приводит к уничтожению данных отмены для TextBox.
Недостатки, вероятно, означают, что это решение непригодно. Опять же, если есть лучшее решение, я хотел бы услышать об этом. По крайней мере, возможно, увидев результаты моего подхода, вы можете спасти кого-то еще от проблемы внедрения и обнаружения всех этих проблем.
Возможно, это помогает: http: // stackoverflow.com/questions/12654213/allow-user-to-use-tab-in-richeditbox-in-windows-8-app – sibbl
@sibbl К сожалению, этот подход не работает для TextBox, потому что нет эквивалента, который могут быть доступны напрямую, насколько я могу рассказать объектной модели документа RichEditBox. –
Я делаю то же, что и ваш ответ. Интересный факт: [Ctrl-I вставляет вкладку] (http://stackoverflow.com/questions/35045514/how-to-stop-control-i-from-inserting-a-tab-in-a-uwp-textbox- в-corewindow-сферы). Не знаю, откуда появился этот странный TextBox (см. Также [weird newline management] (http://stackoverflow.com/questions/35138047/textbox-text-substringtextbox-selectionstart-doesnt-work-because-selectedtext) в [' SelectedText', 'SelectionLength' и т. Д.] (Https://social.msdn.microsoft.com/Forums/en-US/f31f34ed-8751-4792-99d6-7c080582d899)), но я надеюсь, что Microsoft приходит в себя и рефакторирует Это./sigh – ruffin