Проблема при попытке изменить выбранный индекс tabControl

Проблема, с которой я сталкиваюсь, довольно раздражает.

У меня есть tabControl с двумя элементами tabItems (Home, Show). Вкладка «Главная» начинается как «Видимый» и «Показать как скрытый».

В доме у меня есть изображение, для которого я обрабатываю событие MouseLeftButtonDown. Это событие должно изменить видимость Show TabItem и сделать его выбранным.

В коде у меня есть tabControl.SelectedIndex = 1; который вызывает tabControl SelectionChangeEvent (который я использую для изменения переднего плана Show и Home TabItems).

Проблема, с которой я сталкиваюсь, заключается в том, что вместо того, чтобы фокус переходить в Show, он остается на Home. У меня нет проблем с кодом, потому что на последнем шаге обработчика события SelectionChange, который является последней функцией, выполняемой моим кодом, то, что я вижу в пользовательском интерфейсе, правильно.

Так что же выполняется после этого? Кто-нибудь может помочь?


private void Main_clientImage_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)  
{  
         showMenu.Visibility = Visibility.Visible;  
         setTabSelected("showMenu");  
}   



public void setTabSelected(String name)  
{  
   for (int i = 0; i  tabControl.Items.Count ; i++)  
   {  
         TabItem item = tabControl.Items.GetItemAt(i) as TabItem;  
         if (item.Name.Equals(name))  
         {  
             selectedTab=i;  
             tabControl.SelectedIndex = i;  
             item.Foreground = new SolidColorBrush(Colors.Black);  
         }  
         else  
         {  
             item.Foreground = new SolidColorBrush(Colors.White);  
         }  
     }  
}  

private void tabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
      for (int i = 0; i  tabControl.Items.Count; i++)
      {
          TabItem item = tabControl.Items.GetItemAt(i) as TabItem;
           if (tabControl.SelectedIndex == i)
           {
               item.Foreground = new SolidColorBrush(Colors.Black);
           }
           else
           {
               item.Foreground = new SolidColorBrush(Colors.White);
           }
       }
}

// РЕДАКТИРОВАТЬ: я решил это, добавив простой e.Handler = true в событие MouseLeftButtonDown. Что не так с этой штукой???


person Fotis    schedule 19.04.2011    source источник
comment
Вы устанавливаете свою видимость перед изменением SelectedIndex? Я думаю, что для параметра «Видимость» установлено значение «Скрытый», когда SelectedIndex изменяется, и вы не можете установить фокус на невидимый элемент.   -  person Rachel    schedule 19.04.2011
comment
Можете ли вы опубликовать код? Мы не знаем, что (что я использую для изменения переднего плана Show и Home TabItems). является. Вы устанавливаете видимость вкладки, которую пытаетесь установить в качестве выбранной вкладки?   -  person Stealth Rabbi    schedule 19.04.2011
comment
Я разместил код в своем посте. Спасибо за помощь. Как вы можете видеть, я установил видимость вкладки перед изменением selectedIndex.   -  person Fotis    schedule 19.04.2011
comment
Это звучит как очень странный пользовательский интерфейс.   -  person djdanlib    schedule 19.04.2011
comment
@Fotis, добавление e.Handler=true не будет распространять событие MouseLeftButtonDown на визуальные элементы, присутствующие внутри TabControl. Я думаю, что это событие действительно не требуется. Пожалуйста, опубликуйте также часть XAML.   -  person Karthik Mahalingam    schedule 19.04.2011
comment
Ответы не относятся к вопросу, удалите свое редактирование оттуда и опубликуйте его как ответ, пожалуйста (также примите его, как только вам будет разрешено, чтобы завершить этот вопрос)   -  person H.B.    schedule 19.04.2011
comment
@ Х.Б. как это сделать? @ Prince Coder: .xaml составляет около 1000 строк, не могли бы вы сказать, какая часть? ВкладкаКонтроль? предметы?   -  person Fotis    schedule 19.04.2011


Ответы (3)


Я изменил SelectedItem из TabControl в методе
void open_Click(object sender, RoutedEventArgs e)
и сделал это из <Button Click="open_Click" и из <DataGrid MouseDoubleClick="open_Click".

Только добавив

e.Handled = true;

в конце метода open_Click это сработало для MouseDoubleClick, как упомянул Фотис в вопросе.

person Gerard    schedule 06.12.2013
comment
как 7 лет спустя у меня была похожая проблема, я исправил ее с помощью b.handled=true. почему это работает? - person NappingRabbit; 01.07.2020
comment
Это совершенно смешно, но handled=true помогло! - person Vincent; 04.07.2021

Проблема с вашим кодом.

private void Main_clientImage_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)  
{  
    showMenu.Visibility = Visibility.Visible;  
    homeMenu.Visibility = Visibility.Hidden;
    setTabSelected("showMenu");  
}   

public void setTabSelected(String name)  
{  
    for (int i = 0; i < tabControl.Items.Count; i++)  
    {  
        TabItem item = tabControl.Items.GetItemAt(i) as TabItem;  
        if (item.Header.Equals(name))  
        {  
            selectedTab = i;  
            item.IsSelected = true; 
            item.Foreground = new SolidColorBrush(Colors.Black);  
        }
        else  
        {  
            item.Foreground = new SolidColorBrush(Colors.White);  
        }  
    }  
}  

private void tabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    for (int i = 0; i < tabControl.Items.Count; i++)
    {
        TabItem item = tabControl.Items.GetItemAt(i) as TabItem;
        if (tabControl.SelectedIndex == i)
        {
            item.Foreground = new SolidColorBrush(Colors.Black);
        }
        else
        {
            item.Foreground = new SolidColorBrush(Colors.White);
        }
    }
}

В приведенном выше коде я проверяю item.Header.Equals(name) и устанавливаю item.IsSelected = true. Иногда selectionindex не работает должным образом. Приведенный выше код должен решить вашу проблему.

person kishhr    schedule 03.06.2012

После изменения свойства SelectedItem у TabControl необходимо убедиться, что SelectedItem.IsFocused = true. Если не просто использовать SelectedItem.Focus() сразу после изменения свойства SelectedItem. В моем случае помогло.

person skrskr    schedule 22.08.2017
comment
Вызов Focus() не помогает. - person Vincent; 04.07.2021