Еще несколько слов о различиях в обработке фокуса в WPF и WindowsForms. Не могу удержаться, т.к. мои коллеги убеждают меня в том, что переходя на WPF, разработчик обязательно столкнется с неразрешимыми проблемами вроде той, что я описал в предыдущем посте.
Итак, снова приложение с несколькими вкладками. Понятно, что для быстрой и комфортной работы пользователя необходимо устанавливать фокус ввода на какой-то элемент при выборе вкладки, да и при запуске приложения тоже.
В старом добром WindowsForms как бы мы не расставляли значения своств TabIndex и TabStop, фокус все равно придется ставить вручную в каком-то обработчике событий (например, в SelectedIndexChanged элемента TabControl). Получается что вроде этого:
private void tabControl_SelectedIndexChanged(object sender, EventArgs e)
{
if (tabControl.SelectedTab == myPage)
{
textBoxFromMyPage.Focus();
}
}
В WPF все несколько иначе (и на мой взгляд логичнее), если у элемента расположенного на TabItem самый маленький TabIndex, то на него и будет установлен фокус ввода при выборе вкладки. Т.е. поведение фокуса ввода можно полностью задать в дизайнере, без единой строчки кода.
Единственное в чем может возникнуть затруднение это в установке фокуса в момент запуска приложения, но эта проблема также решается без обработки событий. Просто для одного из контейнеров (обычного того, содержимое которого будет видеть пользователь при запуске) следует установить свойство FocusManager.FocusedElement. Получится следующий код на XAML:
<TabControl>
<TabItem Header="MyFirstTab">
<WrapPanel FocusManager.FocusedElement="{Binding ElementName=myTextBox}">
<Button TabIndex="1">The Button</Button>
<TextBox x:Name="myTextBox" TabIndex="0">The Text Box</TextBox>
</WrapPanel>
</TabItem>
<TabItem Header="MySeccondTab">
<WrapPanel>
<Button TabIndex="1">The Button</Button>
...
И все без единой строчки на С# или VB.Net.