Silverlight TabControl - Нахождение и выбор TabItem от данного Контроля в TabItem

Я создаю Приложение отделов организации, которое имеет основной раздел и TabControl с различным TabItems в нем. На ударе сохраняют идею, то, что любые поля по ошибке выделяются, и первое поле по ошибке получает фокус.

Если первое, и только, поле по ошибке находится на вкладке Unselected, вкладка должна затем стать выбранной, и поле по ошибке должно стать выделенным и сфокусироваться. Но я не могу заставить это работать.

То, что, кажется, происходит, - то, что вкладка Unselected не находится в визуальном дереве, таким образом, Вы не можете переместиться назад к владению по TabItem и сделать это в настоящее время выбираемым TabItem в TabControl.

Кто-либо понял то, как это может быть done\achieved?

6
задан David Gray Wright 3 May 2010 в 00:47
поделиться

3 ответа

Как я решил эту проблему (спросив ведущего архитектора) ...

Создайте интерфейс 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; // Из параметров конструктора.

... и не забывайте, что у вас могут быть вложенные вкладки, поэтому вам нужно продолжать подниматься по Иерархии.

1
ответ дан 17 December 2019 в 00:05
поделиться

Я знаю способ, но он уродливый. Он включает использование DispatcherTimer с интервалом в несколько миллисекунд. В Page_Loaded вы должны запустить таймер. Затем на каждом тике он устанавливает IsSelected = true для одного из элементов вкладки. При следующей отметке выбирается следующая вкладка и т. Д., Пока не будут выбраны все вкладки. Тогда вам придется снова выбрать первый элемент и убить таймер. Это заставит загружать визуальные элементы в элементах вкладки.

Вам также придется закрыть TabControl рамкой или чем-то еще во время этой операции. В противном случае пользователь увидит, что все элементы вкладки быстро пролистывают.

0
ответ дан 17 December 2019 в 00:05
поделиться

Я использую 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);
1
ответ дан 17 December 2019 в 00:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: