Табулирането не работи за шаблони за контрол на текстово поле, когато темата на Windows е класическа - какво мога да направя?

Когато имате, да кажем, TextBox и Button като по-долу, всичко е наред. Можете да използвате tab stop, за да се движите напред и назад между двата контрола.

<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>

Тоест все още можете да навигирате напред-назад между текстовата област и бутона „Щракнете върху мен“ (който все още е отделна контрола), но няма да достигнете до „Бутона за шаблон“ (който е част от TextBox) :

въведете описание на изображението тук

Този проблем не възниква при стил Windows 7 Basic.

Изглежда, че това е вярно за шаблони 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 (например проблемът с подплънките), но Не съм сигурен дали това се отнася и за спирането на табулатора (въпреки че има свойство IsTabStop - поне не можах да коригирам този проблем, като изрично задам това свойство на True).

И така, мога ли да направя нещо?


Някои допълнителни бележки:

  • Още по-лошо е за PasswordBox, тъй като не можете да достигнете никакви шаблонни елементи както за класическата, така и за основната тема на Windows 7.

  • Този проблем може да се възпроизведе на система Windows 7, но AFAIK се появява и на Windows 8.


person Em1    schedule 12.09.2013    source източник


Отговори (2)


Намерих отговора на въпроса си точно тук, на друг въпрос Стоп на раздели не работи за текстови полета в шаблон за данни.

Първоначално не го намерих, тъй като съсредоточих търсенето си върху Windows 7 classic style.

И така, всичко, което трябва да направя, за да поправя този проблем, е да добавя сетер към моя стил, който задава стойността KeyboardNavigation.TabNavigation на Continue.

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

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

Продължи: Всеки елемент получава фокус от клавиатурата, стига да е спиране на навигацията. Навигацията напуска съдържащия елемент, когато се достигне ръб.

Според MSDN стойността по подразбиране е Continue, но това не е вярно за класическата тема, където стойността по подразбиране всъщност е None. За съжаление никъде няма подсказка.

person Em1    schedule 13.09.2013
comment
Благодаря... наистина беше полезно - person Mohini Mhetre; 25.02.2016

Опитвали ли сте да настроите свойството Control.IsTabStop на вашия TextBox на True? Моля, разгледайте свойството Control.IsTabStop в MSDN за повече информация.

<TextBox IsTabStop="True" ... />
person Sheridan    schedule 12.09.2013
comment
въпреки че има свойство IsTabStop - поне аз не успях да коригирам този проблем, като изрично зададох това свойство на True - с което имам предвид, че опитах каквото и да било - person Em1; 12.09.2013