2

タブの選択が変更されないように、次のようなことをしています。

 tabControl.Items.CurrentChanging += new CurrentChangingEventHandler(Items_CurrentChanging);

 void Items_CurrentChanging(object sender, CurrentChangingEventArgs e)
 {
     if( dataIsInvalid )
     {
          // Show some popup message
          var item = ((ICollectionView)sender).CurrentItem;
          e.Cancel = true;
          tabControl.SelectedItem = item; // !! This causes the CurrentChanging event to happen twice !! 
                                          // But without this the visual tree does not update! :( 
     }
}

ただし、現在私が見ている問題は、上の最後の行でCurrentChangingイベントが2回発生し、ポップアップメッセージが2回表示されることです。それだけでなく、最初に別のウィンドウにフォーカスを合わせてから、タブコントロールのウィンドウにフォーカスを戻した後、2回目に表示されます。なぜこれが起こる可能性があるのか​​、何か考えはありますか?

-編集-私は本当に必要なだけで、再度e.Cancel更新する必要はないようです。SelectedItemただし、これを行わない限り、ビジュアルツリーは更新されません。タブコントロールのビジュアルツリーがe.Cancel発生後に更新されるように、更新する必要がない方法はありますSelectedItemか?

4

2 に答える 2

2

PreviewMouseDownはい、これは少し奇妙です... onタブコントロールで、現在変更中のイベントハンドラーを決定論的にフック解除してフックすることができます。

また、CurrentChanging自体でハンドラーのフックを解除して、少なくとも複数回呼び出されないようにします。

    private void MyTabControl_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        var tabControl = sender as TabControl;

        if (tabControl != null)
        {
            var temp = new CurrentChangingEventHandler((sender1, e1) => { });
            var handler = new CurrentChangingEventHandler(
                (sender1, e1) =>
                    {
                        var item = ((ICollectionView) sender1).CurrentItem;
                        if (item != null && dataIsInvalid)
                        {
                            e1.Cancel = true;
                            Dispatcher.BeginInvoke(
                                new Action(() =>
                                   {
                                       tabControl.SelectedItem = item;
                                   }));
                        }

                        tabControl.Items.CurrentChanging -= temp;
                    });

            temp = handler;
            tabControl.Items.CurrentChanging -= handler;
            tabControl.Items.CurrentChanging += handler;
        }
    }

これがお役に立てば幸いです。

于 2011-10-04T09:47:45.577 に答える
0

この質問は古いですが、タブコントロールでこの問題に遭遇しました。私がしたのは、それを呼び出す前にハンドラーのフックを外すだけでした。

InsturmentTabs.Items.CurrentChanging -= new CurrentChangingEventHandler(Items_CurrentChanging);
InsturmentTabs.Items.CurrentChanging += new CurrentChangingEventHandler(Items_CurrentChanging);

private void Items_CurrentChanging(object sender, CurrentChangingEventArgs e)
    {
        if (condition)
        {
            var item = ((ICollectionView)sender).CurrentItem;
            e.Cancel = true;

            InsturmentTabs.SelectedItem = item;              
        }                                          
    }      
于 2015-06-11T20:38:11.727 に答える