当前位置: 首页 > 编程语言 > C#

如何取消WPFTabControl中的选项卡更改Share

时间:2023-04-10 12:39:58 C#

如何取消WPFTabControl中的选项卡更改这是我在阅读答案后想到的。XAML:代码背面:publicpartialclassMainWindow:Window{publicMainWindow(){InitializeComponent();vartabs=newObservableCollection{"Tab1","Tab2","Tab3"};Tabs=CollectionViewSource.GetDefaultView(tabs);Tabs.CurrentChanging+=OnCurrentChanging;Tabs.CurrentChanged+=OnCurrentChanged;Tabs.MoveCurrentToFirst();CurrentTab=tabs.First();}privatevoidOnCurrentChanging(objectsender,CurrentChangingEventArgse){//只有在用户输入更改选项卡时才显示消息框if(!_cancelTabChange){if(MessageBox.Show("Changetab?","Message",MessageBoxButton.YesNo)==MessageBoxResult.No){_cancelTabChange=true;返回;}}_cancelTabChange=false;}privatevoidOnCurrentChanged(objectsender,EventArgse){if(!_cancelTabChange){//更新当前选项卡属性,如果用户没有取消转换CurrentTab=(string)Tabs.CurrentItem;}else{//导航回当前选项卡否则Dispatcher.BeginInvoke(newAction(()=>;Tabs.MoveCurrentTo(CurrentTab)));}}publicstringCurrentTab{get;放;}publicstaticreadonlyDependencyPropertyTabsProperty=DependencyProperty.Register("Tabs",typeof(ICollectionView),typeof(MainWindow),newFrameworkPropertyMetadata(ICollectionView)));publicICollectionViewTabs{get{return(ICollectionView)GetValue(TabsProperty);}set{SetValue(TabsProperty,value);}}私有布尔_cancelTabChange;基本上我想在用户导航到不同的选项卡时显示确认消息,如果他单击“否”-中止转换但此代码不起作用。如果我多次单击“Tab2”,每次我在消息框中选择“否”时,它都会在某个时候停止工作:事件停止触发。如果单击“Tab3”,事件将再次触发,但如果选择“是”,则会打开第二个选项卡而不是第三个选项卡。我不知道发生了什么事。?有人在我的解决方案中看到错误吗?或者,是否有更简单的方法在用户切换标签时显示确认消息?我也愿意使用任何具有适当SelectionChanging事件的开源选项卡控件。我找不到任何东西。我正在使用.Net4.0。编辑:如果我评论消息框:privatevoidOnCurrentChanging(objectsender,CurrentChangingEventArgse){//仅在用户输入更改选项卡时显示消息框if(!_cancelTabChange){//if(MessageBox.Show("Changetab?","Message",MessageBoxButton.YesNo)==MessageBoxResult.No)//{Debug.WriteLine("Canceled");_cancelTabChange=真;返回;//}}_cancelTabChange=false;一切正常。奇怪的。此解决方案http://coderelief.net/2011/11/07/fixing-issynchronizedwithcurrentitem-and-icollectionview-cancel-bug-with-an-attached-property/似乎工作得很好privatevoidOnCurrentChanging(objectsender,CurrentChangingEventArgse){if(MessageBox.Show("Changetab?","Message",MessageBoxButton.YesNo)==MessageBoxResult.No){e.Cancel=true;}}publicstaticclassSelectorAttachedProperties{privatestaticType_ownerType=typeof(SelectorAttachedProperties);#regionIsSynchronizedWithCurrentItemFixEnabledpublicstaticreadonlyDependencyPropertyIsSynchronizedWithCurrentItemFixEnabledProperty=DependencyProperty.RegisterAttached("IsSynchronizedWithCurrentItemFixEnabled",typeof(bool),_ownerType,newPropertyMetadata(false,OnIsSynchronizedWithCurrentItemFixEnabledChanged));复制代码publicstaticboolGetIsSynchronizedWithCurrentItemFixEnabled(DependencyObjectobj){return(bool)obj.GetValue(IsSynchronizedWithCurrentItemFixEnabledProperty);}公共静态voidSetIsSynchronizedWithCurrentItemFixEnabled(DependencyObjectobj,boolvalue){obj.SetValue(IsSynchronizedWithCurrentItemFixEnabledProperty,值);}privatestaticvoidOnIsSynchronizedWithCurrentItemFixEnabledChanged(DependencyObjectd,DependencyPropertyChangedEventArgse){Selectorselector=dasSelector;if(selector==null||!(e.OldValueisbool&&e.NewValueisbool)||e.OldValue==e.NewValue)返回;boolenforceCurrentItemSync=(bool)e.NewValue;ICollectionViewcollectionView=null;EventHandleritemsSourceChangedHandler=null;itemsSourceChangedHandler=delegate{collectionView=selector.ItemsSourceasICollectionView;如果(collectionView==null)collectionView=CollectionViewSource.GetDefaultView(选择器);};SelectionChangedEventHandlerselectionChangedHanlder=null;selectionChangedHanlder=delegate{if(collectionView==null)返回;如果(选择器.IsSynchronizedWithCurrentItem==true&&选择器.SelectedItem!=collectionView.CurrentItem){选择器.IsSynchronizedWithCurrentItem=false;选择器.SelectedItem=collectionView.CurrentItem;选择器.IsSynchronizedWithCurrentItem=true;}};如果(enforceCurrentItemSync){TypeDescriptor.GetProperties(选择器)[“ItemsSource”].AddValueChanged(选择器,itemsSourceChangedHandler);选择器.SelectionChanged+=selectionChangedHanlder;}else{TypeDescriptor.GetProperties(selector)["ItemsSource"].RemoveValueChanged(selector,itemsSourceChangedHandler);selector.SelectionChanged-=selectionChangedHanlder;}}#endregionIsSynchronizedWithCurrentItemFixEnabled}由于某些原因,添加TabControl.Focus()修复了一些情况:privatevoidOnCurrentChanged(objectsender,EventArgse){if(!_cancelTabChange){//更新当前选项卡属性,如果用户没有取消转换CurrentTab=(string)Tabs.CurrentItem;}else{//导航回当前选项卡否则Dispatcher.BeginInvoke(newAction(()=>{Tabs.MoveCurrentTo(Cur租金标签);TabControl.Focus();}));我仍然不知道地球上到底发生了什么,所以我很乐意接受这个问题的答案。强制性人员要求应用程序询问用户是否希望离开页面,因此这里是稍微修改过的代码:privateObject_selectedTab;公共对象SelectedTab{得到{返回_selectedTab;}set{if(!(_selectedTabisADR_Scanner.ViewModel.ConfigurationViewModel)||!_configurationViewModel.HasChanged||(System.Windows.Forms.MessageBox.Show("您确定要离开此页面而不保存配置更改吗",ADR_Scanner.App.Current.MainWindow.Title,System.Windows.Forms.MessageBoxButtons.YesNo,System.Windows.Forms.MessageBoxIcon.Error)==System.Windows.Forms.DialogResult.Yes)){_selectedTab=value;}OnPropertyChanged("SelectedTab");我认为这个小变体正是你所需要的。privatevoidMainTabControl_OnSelectionChanged(objectsender,SelectionChangedEventArgse){if(ReasonBecauseLeaveTabItemIsForbidden){if(MainTabControl.SelectedIndex==IndexOfTabItem){MessageBox.Show(SomeMessageWhyLeaveTabItemIsForbidden);}MainTabControl.SelectedIndex=IndexOfTabItem;}}IndexOfTabItem–禁止使用离开的TabItem的搜索。在tabControl_SelectionChanged事件处理程序中:if(e.OriginalSource==tabControl)//如果此事件从您的tabControl触发{e.Handled=true;if(!forbiddenPage.IsSelected)//用户离开标签{if(forbiddenTest()){forbiddenPage.IsSelected=true;MessageBox.Show("你不能离开这个页面");请注意,设置forbiddenPage.IsSelected=true将导致循环并重新进入此事件处理程序。但是,这一次,我们退出,因为所选页面是禁止页面。有一个更简单的解决方案。将绑定添加到XAML中的选定项:然后在视图模型中:privateObject_selectedTab;公共对象SelectedTab{得到{返回_selectedTab;}set{if(_selectedTabisADR_Scanner.ViewModel.ConfigurationViewModel&&_configurationViewModel.HasChanged){System.Windows.Forms.MessageBox.Show("请保存配置更改",ADR_Scanner.App.ResourceAssembly.GetName().Name,System.Windows.Forms.MessageBoxButtons.OK,System.Windows.Forms.MessageBoxIcon.Error);}else{_selectedTab=值;}OnPropertyChanged("SelectedTab");显然,您将ADR_Scanner.ViewModel.ConfigurationViewModel替换为您自己的视图模型类。最后确保在构造函数中初始化_selectedTab,否则TabControl将没有初始选择。以上是C#学习教程:如何在WPFTabControl中取消tab改变所有共享的内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: