各タブにフレームが含まれるタブ付きGUIがあります。これらのフレームの1つにDataGridがあります。ユーザーがこのタブを選択すると、データグリッドをソートする必要があるため、TabControl SelectionChangedイベントを使用してソートをトリガーします。ただし、タブ自体は変更されないままであっても、DataGridから項目が選択されるたびに、このイベントがトリガーされます。
さまざまなイベントを試しました:TabItemのGotFocus TabItemのRequestBringIntoView
しかし、彼らは皆この問題に苦しんでいるようです。これは何が原因ですか?
TabControl.SelectionChanged
はComboBox.SelectionChanged
と同じイベントです
Selector.SelectionChanged
から始まります。
そのため、イベントハンドラでイベントを処理済みとしてマークしないと、ツリーがバブルアップし、最終的にTabControl
に到達するため、この「頻繁に起動する」問題が発生します。
ComboBox
/ListBox
/ListView
// DataGridで使用する他のセレクターのSelectionChangedでイベントを処理済みとしてマークします。
private void MyComboBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
e.Handled = true;
}
そして、この不便はなくなります;)。
private void tabControlName_SelectionChanged(object sender、SelectionChangedEventArgs e) { if(e.Source is TabControl)//このイベントがTabControlから発生した場合、enter { if(tabItemName.IsSelected) { //ここで仕事をする } } }
親要素にAddHandlerを使用してハンドラーを追加した場合、すべての選択変更によりSelectionChangedイベントが発生します。この場合、TabControlに名前を付け、OriginalSourceの名前がTabControlの名前であるかどうかをEventHandlerでチェックインできます。