2013-09-12 3 views
1

Когда, скажем, TextBox и Button, как показано ниже, все в порядке. Вы можете использовать табуляцию, чтобы идти назад и вперед между обоими элементами управления.Tab stop не работает для шаблонов управления текстовыми полями, когда тема Windows классическая - что я могу сделать?

<StackPanel> 
    <TextBox>Type Here</TextBox> 
    <Button>Click Me</Button> 
</StackPanel> 

Но если переопределить TextBox макет, который вы не можете использовать табуляции для перехода к кнопке.

<Style TargetType="TextBox"> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate> 
     <StackPanel> 
      <ScrollViewer x:Name="PART_ContentHost" /> 
      <Button>Template-Button</Button> 
     </StackPanel> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

То есть, вы можете перемещаться назад и вперед между текстовой областью и «Нажмите Me' кнопку (которая до сих пор отдельный контроль), но вы не достигнете„Template-Button“(которая является частью TextBox):

enter image description here

Эта проблема не возникает с ОС Windows 7 Основной стиль.

Кажется, что это верно для шаблонов TextBox, но не обязательно для каких-либо элементов управления. При шаблонизации Button вы можете добраться до любой части элемента управления. В следующем примере вы можете достичь ComboBox, а также TextBox.

<Style TargetType="Button"> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate> 
     <StackPanel> 
      <ComboBox>ComboBox</ComboBox> 
      <TextBox>TextBox</TextBox> 
     </StackPanel> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

Интересно, почему это так, и если есть какие-либо обходной путь кроме не используя ControlTemplate и «злоупотребление» другого контроля (например, Button), как я теряю TextBox -Особенности и должны повторно реализовать их.

К сожалению, я ничего не нашел при поиске в Интернете. Я нашел несколько источников, заявляющих, что классические шаблоны Windows по-разному реализованы, чем соответствующие шаблоны Aero (например, padding issue), но я не уверен, что это относится и к табуляции (хотя есть свойство IsTabStop - по крайней мере, я wasn не удалось исправить эту проблему, явно установив это свойство на True).

Итак, что я могу сделать?


Некоторых дополнительные примечания:

  • Это еще хуже для PasswordBox, как вы не можете достичь каких-либо шаблонных элементов как для Windows 7 классических и основную темы.

  • Этот вопрос является воспроизводимым в системе Windows 7, но AFAIK это также появляется на Windows 8.

ответ

2

Я нашел ответ на свой вопрос прямо здесь, по другому вопросу Tab stop not working for textboxes inside data template.

Я не нашел его в первую очередь, поскольку я сосредоточил свой поиск на классическом стиле Windows 7.

Итак, все, что мне нужно сделать, чтобы исправить эту проблему, - это добавить установщик в мой стиль, который устанавливает значение KeyboardNavigation.TabNavigation в Continue.

<Setter Property="KeyboardNavigation.TabNavigation" Value="Continue" /> 

Благодаря этому значению каждый элемент получает фокус клавиатуры:

Continue: Каждый элемент получает фокус ввода с клавиатуры, до тех пор, как это навигационная остановка. Навигация выходит из содержащего элемента, когда достигнут край.

По MSDN значение по умолчанию Continue, но это не относится к классической теме, где значение по умолчанию на самом деле является None. К сожалению, никаких намеков нет.

+0

Спасибо ... это было действительно полезно –

0

Вы пробовали настройки Control.IsTabStop свойство на вашем TextBox в True? Пожалуйста, зайдите на страницу Control.IsTabStop Property в MSDN для получения дополнительной информации.

<TextBox IsTabStop="True" ... /> 
+0

«хотя есть свойство IsTabStop - по крайней мере, я не смог исправить эту проблему, явно установив это свойство в True» - под этим я имею в виду, что я попробовал что-нибудь – Em1

+0

@ Em1 umm, что? – Matt