Я создаю Приложение отделов организации, которое имеет основной раздел и TabControl с различным TabItems в нем. На ударе сохраняют идею, то, что любые поля по ошибке выделяются, и первое поле по ошибке получает фокус.
Если первое, и только, поле по ошибке находится на вкладке Unselected, вкладка должна затем стать выбранной, и поле по ошибке должно стать выделенным и сфокусироваться. Но я не могу заставить это работать.
То, что, кажется, происходит, - то, что вкладка Unselected не находится в визуальном дереве, таким образом, Вы не можете переместиться назад к владению по TabItem и сделать это в настоящее время выбираемым TabItem в TabControl.
Кто-либо понял то, как это может быть done\achieved?
Как я решил эту проблему (спросив ведущего архитектора) ...
Создайте интерфейс ITabActivator с помощью одного метода Activate.
Создайте класс, производный от Grid и ITabActivator, под названием TabPageActivator. Конструктор которого принимает TabITem и TabControl.
Вместо добавления простой сетки в TabItem.Contents добавьте TabPageActivator.
Измените определение родителя, чтобы использовать ...
DependencyObject parent = _Control.Parent;
... вместо использования VisualTreeHelper.
Итак, когда вы перемещаетесь по тесту Иерархии для ...
if (parent - TabActivator) (родительский как ITabActivator) .Activate ()
... поэтому, когда Activate вызывается
m_TabControl.SelectedItem = m_TabItem; // Из параметров конструктора.
... и не забывайте, что у вас могут быть вложенные вкладки, поэтому вам нужно продолжать подниматься по Иерархии.
Я знаю способ, но он уродливый. Он включает использование DispatcherTimer с интервалом в несколько миллисекунд. В Page_Loaded вы должны запустить таймер. Затем на каждом тике он устанавливает IsSelected = true для одного из элементов вкладки. При следующей отметке выбирается следующая вкладка и т. Д., Пока не будут выбраны все вкладки. Тогда вам придется снова выбрать первый элемент и убить таймер. Это заставит загружать визуальные элементы в элементах вкладки.
Вам также придется закрыть TabControl рамкой или чем-то еще во время этой операции. В противном случае пользователь увидит, что все элементы вкладки быстро пролистывают.
Я использую TabControls для навигации на одном из моих сайтов (YinYangMoney) и создал несколько методов расширения, которые помогают мне выбирать вкладки, используя имена тегов. Вот фрагменты, которые должны сработать для вас.
Класс Extensions:
using System;
using System.Linq;
using System.Windows.Controls;
namespace MyApplication
{
internal static class Extensions
{
// Extension for TabControl
internal static void SelectTab(this TabControl tabControl, this TabItem tabItem)
{
if (tabControl == null || tabItem == null)
return null;
SelectTab(tabControl, tabItem.Tag);
}
// Extension for TabControl
internal static void SelectTab(this TabControl tabControl, string tabTagName)
{
if (tabControl == null)
return null;
// Find the TabItem by its Tag name
TabItem mainTabItem = tabControl.FindByTag(tabTagName);
if (mainTabItem == null)
return;
// Check to see if the tab needs to be selected
if (tabControl.SelectedItem != mainTabItem)
tabControl.SelectedItem = mainTabItem;
}
// Extension for TabControl
internal static TabItem FindByTag(this TabControl tabControl, string tagFragment)
{
if (tabControl == null || tagFragment == null)
return null;
return tabControl.Items
.OfType<TabItem>()
.Where(item => item.Tag != null && item.Tag.ToString().StartsWithIgnoreCase(tagFragment))
.FirstOrDefault();
}
// Extension for string
internal static bool StartsWithIgnoreCase(this string source, string target)
{
return source.StartsWith(target, StringComparison.CurrentCultureIgnoreCase);
}
}
}
XAML для вашего TabControl и TabItems будет выглядеть примерно так:
<Controls:TabControl x:Name="x_TabControl">
<Controls:TabItem Header="Welcome" Tag="/Home/Welcome" x:Name="x_WelcomeTab" />
<Controls:TabItem Header="FAQ" Tag="/Home/FAQ" />
<Controls:TabItem Header="Contact Us" Tag="/Home/Contact_Us" />
<Controls:TabItem Header="Privacy Policy" Tag="/Home/Privacy_Policy" />
<Controls:TabItem Header="My Account" Tag="/Home/My_Account" />
</Controls:TabControl>
И вы можете выбрать Welcome TabItem следующим образом:
x_TabControl.SelectTab("/Home/Welcome");
или
x_TabControl.SelectTab(x_WelcomeTab);