2016-12-09 4 views
2

В течение TabControl с 3 вкладки:Почему мой WPF TabControl автоматически переключает вкладку?

  1. Tab1 содержит кнопку "Далее".
  2. Когда «Next» нажата TabControl настроен на отображение Tab2 и А запускается таймер (2 секунды)
  3. После того, как таймер заканчивается TabControl настроен на отображение Tab3.

Если окно, содержащее TabControl не имеет фокус, когда # 3 происходит, он переключится на отображение Tab2, когда он получает фокус. Зачем?

MainWindow код:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void NextBtn_Click(object sender, RoutedEventArgs e) 
     { 
      DoStuff(); 
     } 

     private async void DoStuff() 
     { 
      MainTabControl.SelectedItem = Tab2; 

      await Task.Factory.StartNew((Action)(() => 
      { 
       Thread.Sleep(2000); 
      })); 

      MainTabControl.SelectedItem = Tab3; 
     } 
    } 
} 

WPF код:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" Topmost="True"> 
    <TabControl Name="MainTabControl"> 
     <TabItem Name="Tab1"> 
      <TabItem.Header> 
       <TextBlock Text="Tab 1" /> 
      </TabItem.Header> 
      <StackPanel> 
       <TextBlock Text="Tab 1 content" /> 
       <Button Name="NextBtn" Click="NextBtn_Click" Content="Next tab" Width="50" HorizontalAlignment="Right" /> 
      </StackPanel> 
     </TabItem> 

     <TabItem Name="Tab2"> 
      <TabItem.Header> 
       <TextBlock Text="Tab 2" /> 
      </TabItem.Header> 
      <StackPanel> 
       <TextBlock Text="Tab 2 content" /> 
      </StackPanel> 
     </TabItem> 

     <TabItem Name="Tab3"> 
      <TabItem.Header> 
       <TextBlock Text="Tab 3" /> 
      </TabItem.Header> 
      <StackPanel> 
       <TextBlock Text="Tab 3 content" /> 
      </StackPanel> 
     </TabItem> 
    </TabControl> 
</Window> 

Полный проект: https://ufile.io/165121

+0

Возможно, это не связано напрямую, но вы используете 'async void' как нечто, отличное от обработчика событий, это большой анти-шаблон. «DoStuff» также выглядит более сложным, чем нужно. вы можете просто «ждать Task.Delay (2000); MainTabControl.SelectedItem = Tab3; 'вместо того, чтобы возиться с потоками. –

+0

'DoStuff()' - это фиктивный метод (который воспроизводит проблему) для того, что по существу «нажмите кнопку, начните длительную работу фона, дождитесь окончания работы, результат отображения». Я не _actually_ вызывая 'Thread.Sleep()' без видимых причин. – Woodgnome

ответ

1

Я debuged программу с Snoop, и я увидел, что, когда вы звоните в MainTabControl.SelectedItem = Tab3; и вы имел фокус в другом окне, tab2 - сфокусированный поэтому, когда вы выбираете окно программы, отображается tab2.

Я установил его, добавив вторую строку:

MainTabControl.SelectedItem = Tab3; 
((TabItem) MainTabControl.SelectedItem).Focus(); 

Я надеюсь, что это может помочь вам.

+0

Это не работает, когда изменение вкладки происходит, когда окно минимизировано, но лучше, чем никогда не работает;) – Woodgnome

Смежные вопросы