2011-02-23 17 views
8

मैं अपने एप्लिकेशन के लिए एक सिस्टम रखरखाव स्क्रीन विकसित करने की कोशिश कर रहा हूं जिसमें मेरे पास एक अलग रखरखाव विकल्प का प्रतिनिधित्व करने वाले कई टैब हैं यानी सिस्टम उपयोगकर्ता और कैटर बनाए रखें। एक बार जब उपयोगकर्ता मौजूदा रिकॉर्ड को बदलने के लिए संपादन/नया पर क्लिक करता है तो मैं वर्तमान टैब से नेविगेटिंग को रोकना चाहता हूं जब तक कि उपयोगकर्ता या तो सहेजें या रद्द नहीं करता।WPF टैब नियंत्रण टैब को रोकें

कुछ googling के बाद मुझे एक लिंक मिला है http://joshsmithonwpf.wordpress.com/2009/09/04/how-to-prevent-a-tabitem-from-being-selected/ जो मेरी समस्या को हल करने लग रहा था, या तो मैंने सोचा।

मैंने इसे लागू करने का प्रयास किया है, लेकिन मेरी घटना कभी भी आग लगती नहीं है। नीचे मेरा एक्सएएमएल है।

<TabControl Name="tabControl"> 
    <TabItem Header="Users"> 
     <DockPanel> 
      <GroupBox Header="Existing Users" Name="groupBox1" DockPanel.Dock="Top" Height="50"> 
       <StackPanel Orientation="Horizontal"> 
        <Label Margin="3,3,0,0">User:</Label> 
        <ComboBox Width="100" Height="21" Margin="3,3,0,0"></ComboBox> 
        <Button Width="50" Height="21" Margin="3,3,0,0" Name="btnUsersEdit" Click="btnUsersEdit_Click">Edit</Button> 
        <Button Width="50" Height="21" Margin="3,3,0,0" Name="btnUsersNew" Click="btnUsersNew_Click">New</Button> 
       </StackPanel> 
      </GroupBox> 
      <GroupBox Header="User Information" Name="groupBox2"> 
       <Button Content="Cancel" Height="21" Name="btnCancel" Width="50" Click="btnCancel_Click" /> 
      </GroupBox> 
     </DockPanel> 
    </TabItem> 
    <TabItem Header="User Groups"> 

    </TabItem>   
</TabControl> 

और ये मेरे कोड

public partial class SystemMaintenanceWindow : Window 
{ 

    private enum TEditMode { emEdit, emNew, emBrowse } 

    private TEditMode _EditMode = TEditMode.emBrowse;   

    private TEditMode EditMode 
    { 
     get { return _EditMode; } 
     set 
     { 
      _EditMode = value; 
     } 
    }   

    public SystemMaintenanceWindow() 
    { 
     InitializeComponent(); 

     var view = CollectionViewSource.GetDefaultView(tabControl.Items.SourceCollection); 
     view.CurrentChanging += this.Items_CurrentChanging; 
    }   

    void Items_CurrentChanging(object sender, CurrentChangingEventArgs e) 
    { 
     if ((e.IsCancelable) && (EditMode != TEditMode.emBrowse)) 
     { 
      var item = ((ICollectionView)sender).CurrentItem; 
      e.Cancel = true; 
      tabControl.SelectedItem = item; 

      MessageBox.Show("Please Save or Cancel your work first.", "Error", MessageBoxButton.OK, MessageBoxImage.Error); 
     } 
    }   

    private void btnUsersNew_Click(object sender, RoutedEventArgs e) 
    { 
     EditMode = TEditMode.emNew; 
    } 

    private void btnUsersEdit_Click(object sender, RoutedEventArgs e) 
    { 
     EditMode = TEditMode.emEdit; 
    } 

    private void btnCancel_Click(object sender, RoutedEventArgs e) 
    { 
     EditMode = TEditMode.emBrowse; 
    } 
} 
है अब

क्षमा याचना अगर मैं बेवकूफ जा रहा हूँ, लेकिन मुझे के जीवन के लिए मैं कसरत नहीं देख सकते हैं क्यों मेरे घटना उपयोगकर्ता टैब के बीच क्लिक करता है आग नहीं करता है ।

आपकी सभी मदद के लिए धन्यवाद।

Emlyn

+0

जोश विधि काम नहीं कर रहा मेरे लिए भी – Bolu

उत्तर

13

मैं एक ऐसे समाधान के साथ आया हूं जो मेरी आवश्यकताओं के अनुरूप है। थोड़ा पीछे की ओर लगता है लेकिन अन्य विकल्पों की तुलना में मुझे अच्छा और साफ लगता है।

असल में मैं वर्तमान टैब का एक निजी चर रखता हूं और टैबकंट्रोल की "चयन चेंज" घटना पर मैं कुछ चेक कर रहा हूं और tabControl.SelectedIndex को इस मान पर वापस सेट करता हूं यदि उपयोगकर्ता ब्राउज़ मोड में नहीं है।

private void tabControl_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) 
    { 
     if (e.OriginalSource == tabControl) 
     { 
      if (EditMode == TEditMode.emBrowse) 
      { 
       _TabItemIndex = tabControl.SelectedIndex; 
      } 
      else if (tabControl.SelectedIndex != _TabItemIndex) 
      { 
       e.Handled = true; 

       tabControl.SelectedIndex = _TabItemIndex; 

       MessageBox.Show("Please Save or Cancel your work first.", "Error", MessageBoxButton.OK, MessageBoxImage.Error); 
      } 

     } 
    } 
0

जोश tab.ItemsSource उपयोग कर रहा है। आप tab.Items.SourceCollection का उपयोग कर रहे हैं। यह समस्या हो सकती है।

+0

इस सुझाव के लिए धन्यवाद, लेकिन चूंकि मेरे टैब xaml में "हार्ड कोडेड" हैं और संग्रह द्वारा नहीं बनाए गए हैं, यह मेरे लिए काम नहीं लगता है। – Emlyn

8

मैं भी इसके साथ संघर्ष कर रहा था। बस इसे

IsSynchronizedWithCurrentItem="True" 

टैबकंट्रोल पर सेट करके बस काम कर रहा है। उसके बाद एक आकर्षण की तरह काम किया।

+1

उत्कृष्ट ... हम यहां एक ही समस्या के साथ संघर्ष कर रहे थे और इसने इसका ख्याल रखा। धन्यवाद! – MetalMikester

0

या यह अपने आप को लागू ...

public delegate void PreviewSelectionChangedEventHandler(object p_oSender, PreviewSelectionChangedEventArgs p_eEventArgs); 

public class PreviewSelectionChangedEventArgs 
{ 
    internal PreviewSelectionChangedEventArgs(IList p_lAddedItems, IList p_lRemovedItems) 
    { 
     this.AddedItems = p_lAddedItems; 
     this.RemovedItems = p_lRemovedItems; 
    } 
    public bool Cancel { get; set; } 
    public IList AddedItems { get; private set; } 
    public IList RemovedItems { get; private set; } 
} 

public class TabControl2: TabControl 
{ 
    public event PreviewSelectionChangedEventHandler PreviewSelectionChanged; 

    private int? m_lLastSelectedIndex; 

    protected override void OnSelectionChanged(SelectionChangedEventArgs e) 
    { 
     base.OnSelectionChanged(e); 

     // déterminer si on doit annuler la sélection 
     PreviewSelectionChangedEventArgs eEventArgs = new PreviewSelectionChangedEventArgs(e.AddedItems, e.RemovedItems); 
     if (m_lLastSelectedIndex.HasValue) 
      if (PreviewSelectionChanged != null) 
       PreviewSelectionChanged(this, eEventArgs); 

     // annuler (ou pas) la sélection 
     if (eEventArgs.Cancel) 
      this.SelectedIndex = m_lLastSelectedIndex.Value; 
     else 
      m_lLastSelectedIndex = this.SelectedIndex; 
    } 
} 
+0

मैं इस तकनीक का उपयोग कर रहा हूं, और ऐसा लगता है कि यह अच्छी तरह से काम करता है। चूंकि मैं उपयोगकर्ता को बताना चाहता हूं कि वे टैब क्यों नहीं बदल सकते हैं, मैंने इसे पूर्वावलोकन चयन में जोड़ा गया हैंडलर हैंडलर: 'if (dontAllowTabChange) { eventargs.Cancel = true; डिस्पैचर.बिनजिन इनवोक (नई क्रिया (() => { संदेशबॉक्स। दिखाएं ("कृपया इस टैब को छोड़ने से पहले परिवर्तनों को सहेजें।", \t \t" चेतावनी ", संदेशबॉक्स बॉक्स.ओके, संदेशबॉक्स Image.Exclamation); }); }' – Number8

0

इस पोस्ट

https://social.msdn.microsoft.com/Forums/vstudio/en-US/d8ac2677-b760-4388-a797-b39db84a7e0f/how-to-cancel-tabcontrolselectionchanged?forum=wpf

यह मेरे लिए काम किया के अनुसार:

<TabControl> 
    <TabControl.Resources> 
    <Style TargetType="TabItem"> 
     <EventSetter Event="PreviewMouseLeftButtonDown" 
      Handler="OnPreviewMouseLeftButtonDown"/> 
    </Style> 
    </TabControl.Resources> 
    <TabItem Header="Tab1"/> 
    <TabItem Header="Tab2"/> 
</TabControl> 
private void OnPreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    if (e.Source is TabItem) //do not handle clicks on TabItem content but on TabItem itself 
    { 
     var vm = this.DataContext as MyViewModel; 
     if (vm != null) 
     { 
      if (!vm.CanLeave()) 
      { 
       e.Handled = true; 
      } 
     } 
    } 
} 
संबंधित मुद्दे