WPF TabControlで特定のTabItemを選択する方法を知りたいです。
私はこれらのベローズを試しましたが、何も動作しません!
MyTabControl.SelectedIndex = x
MyTabControl.SelectedItem = MyTabItem
MyTabControl.SelectedValue = MyTabItem
MyTabItem.IsSelected = True
@Chrisが言うように、最初の3つのことshouldのいずれかが機能し、@ Phyxxが言うように、それは常に実際に機能するとは限りません。問題は、プロパティの変更順序に関する微妙な問題です。この問題を回避するには、WPFが独自の時間にタブ選択コードを呼び出すようにする必要があります。
Dispatcher.BeginInvoke((Action)(() => MyTabControl.SelectedIndex = x));
これはPhyxxのタイマーが行うこととまったく同じですが、少し極端な方法で行います。
3番目以外のすべての例は正しく、動作します。問題は別の場所にある必要があります。設定後にアイテムをリセットしたり、コードが呼び出されないことがありますか?
有効
MyTabControl.SelectedIndex = x
MyTabControl.SelectedItem = MyTabItem
MyTabItem.IsSelected = True
無効
MyTabControl.SelectedValue = MyTabItem
TabItemsをループし、選択するタブに対して設定します
tabItem.IsSelected = true
バインディングの変更により他の場所がある場合、問題が発生します。それ以外の場合、上記のコードは動作するはずです。
上記で言及されていないこと:
このようなことが機能しない主な理由は、タブ項目に「名前」プロパティが設定されていないことです。プログラムでナビゲートするタブコントロールの各タブ項目には、上記のコードのいずれかが機能するようにnameプロパティが設定されている必要があります。
<tabItem Name="tab1"></tabItem>
タブパネルを実用的に選択するための小さなMVVMバインディングベースのソリューションを実装しました。
ビューモデルでプロパティを定義する-選択したint型
ビューでプロパティをバインドします
<TabControl
x:Name="TabsCandidate"
VerticalAlignment="Stretch"
TabStripPlacement="Top"
SelectedIndex="{Binding Selected}"
private int _selected;
public int Selected
{
get { return _selected; }
set
{
_selected = value;
OnPropertyChanged("Selected");
}
}
値を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;
shouldが機能するすべてのメソッドを試しましたが、選択したタブを実際に変更したものは何もありませんでした。最後に、タブ選択コードをDispatcherTimer
ティックに入れることで動作するようにしました。
DispatcherTimer switchTabTimer = new DispatcherTimer();
switchTabTimer.Interval = new TimeSpan(0);
switchTabTimer.Tick += (object timerSender, EventArgs timerE) =>
{
myTabControl.SelectedIndex = 0;
switchTabTimer.Stop();
};
switchTabTimer.Start();
MyTabControl.SelectedIndex = x
のUIのDataContextChanged
またはLoaded
のイベントハンドラー内。これがうまくいくことを願っています。
タブのインデックスがわからない場合(ヒント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));
}
または、タブへの参照を保持したくない場合は、名前で検索するように変更します