web-dev-qa-db-ja.com

プログラムでWPF TabControlのTabItemを選択する方法

WPF TabControlで特定のTabItemを選択する方法を知りたいです。

私はこれらのベローズを試しましたが、何も動作しません!

MyTabControl.SelectedIndex = x

MyTabControl.SelectedItem = MyTabItem

MyTabControl.SelectedValue = MyTabItem

MyTabItem.IsSelected = True
34
Pierre Toutant

@Chrisが言うように、最初の3つのことshouldのいずれかが機能し、@ Phyxxが言うように、それは常に実際に機能するとは限りません。問題は、プロパティの変更順序に関する微妙な問題です。この問題を回避するには、WPFが独自の時間にタブ選択コードを呼び出すようにする必要があります。

Dispatcher.BeginInvoke((Action)(() => MyTabControl.SelectedIndex = x));

これはPhyxxのタイマーが行うこととまったく同じですが、少し極端な方法で行います。

41

3番目以外のすべての例は正しく、動作します。問題は別の場所にある必要があります。設定後にアイテムをリセットしたり、コードが呼び出されないことがありますか?

有効

MyTabControl.SelectedIndex = x   
MyTabControl.SelectedItem = MyTabItem    
MyTabItem.IsSelected = True 

無効

MyTabControl.SelectedValue = MyTabItem 
22
HCL

TabItemsをループし、選択するタブに対して設定します

tabItem.IsSelected = true

バインディングの変更により他の場所がある場合、問題が発生します。それ以外の場合、上記のコードは動作するはずです。

14
kishhr

上記で言及されていないこと:

このようなことが機能しない主な理由は、タブ項目に「名前」プロパティが設定されていないことです。プログラムでナビゲートするタブコントロールの各タブ項目には、上記のコードのいずれかが機能するようにnameプロパティが設定されている必要があります。

<tabItem Name="tab1"></tabItem>
12
user2976441

タブパネルを実用的に選択するための小さなMVVMバインディングベースのソリューションを実装しました。

  1. ビューモデルでプロパティを定義する-選択したint型

  2. ビューでプロパティをバインドします

    <TabControl
        x:Name="TabsCandidate" 
        VerticalAlignment="Stretch" 
        TabStripPlacement="Top"
        SelectedIndex="{Binding Selected}"
    
  3. private int _selected;

    public int Selected
    {
        get { return _selected; }
        set
        {
            _selected = value;
            OnPropertyChanged("Selected");
        }
    }
    
  4. 値をSelectプロパティに設定します。単にバインドするとタブパネルがアクティブになります。

    親タブパネル内のタブパネルからナビゲートしたい場合、このソリューションは簡単に機能します。あなたがする必要があるのは、コントロールのデータコンテキストにアクセスして設定するだけです

    // set the property value of the view model which points the index of the tab controller.
    ((CandidateViewModel)((System.Windows.FrameworkElement)candidateTab.Content).DataContext).Selected = CandidateLogTabIndex;
    
5
Shanjee

shouldが機能するすべてのメソッドを試しましたが、選択したタブを実際に変更したものは何もありませんでした。最後に、タブ選択コードをDispatcherTimerティックに入れることで動作するようにしました。

       DispatcherTimer switchTabTimer = new DispatcherTimer();
       switchTabTimer.Interval = new TimeSpan(0);
       switchTabTimer.Tick += (object timerSender, EventArgs timerE) =>
       {
           myTabControl.SelectedIndex = 0;
           switchTabTimer.Stop();
       };
       switchTabTimer.Start(); 
1
Phyxx

MyTabControl.SelectedIndex = xのUIのDataContextChangedまたはLoadedのイベントハンドラー内。これがうまくいくことを願っています。

1
Debasis

タブのインデックスがわからない場合(ヒントnotTabIndex):

    private async Task ChangeTabTo(TabItem wantedTab) {
        int index = 0;
        for (var i = 0; i < TabControl.Items.Count; i++) {
            var tab = TabControl.Items[i];
            var t = tab as TabItem;
            if (t == null) continue;
            if (t == wantedTab) {
                index = i;
                break;
            }
        }

        await Dispatcher.BeginInvoke((Action)(() => TabControl.SelectedIndex = index));
    }

または、タブへの参照を保持したくない場合は、名前で検索するように変更します

0
GreyCloud