WPF and KeyboardNavigation.TabNavigation="Local"

In my WPF projects I use a lot of data templates, and some of this templates require a custom tab order. To do this I set the "TabIndex" property on the relevant items inside the data template.

When I used the same template multiple times in the same page I noticed that the tab navigation didn't behave the way I wished it to (instead of jumping between indexes 1, 2, 3... in each template, and jumped between index 1 in every template, then index 2 and so forth).

After some googling I tried to set the attached property "KeyboardNavigation.TabNavigation" to "Local" (on the container in the data template). According to MSDN this way the TabIndex property inside the container is only considered within the container.

Setting the attached property worked, but with an annoying side-effect, for example, if we have a ContentPresenter (to incorporate another data template) and a button:

  <ContentPresenter 
    Content={Binding Something} 
    KeyboardNavigation.TabIndex="0" />
  <Button KeyboardNavigation.TabIndex="1">Ok</Button>

And the container in the data template of the content presenter has the "TabNavigation" property set to "Local", this will make the button focus first, and the contents of the ContentPresenter afterwards (I'm not sure why).

To fix this use the following code:

  <ContentControl 
    Content={Binding Something} 
    Focusable="False"
    KeyboardNavigation.TabNavigation="Local"
    KeyboardNavigation.TabIndex="0" />
  <Button KeyboardNavigation.TabIndex="1">Ok</Button>

Comments

Popular posts from this blog

Restart the Windows File Sharing Service to fix weird problems

WPF, ImageSource and Embedded Resources

SharpDevelop dark color scheme