2011-09-06 7 views
5

का कारण बन रहा है, मैं थोड़ी देर के लिए इस मुद्दे पर तेज़ी से बढ़ रहा हूं, और केवल समाधान का हिस्सा पाया है।टैबकंट्रोल- उपयोगकर्ता को चयनित टैब को बदलने से रोकना: संदेशबॉक्स बग

मैं एक टैबकंट्रोल स्थापित करने की कोशिश कर रहा हूं ताकि मैं कुछ मामलों में उपयोगकर्ता को वर्तमान में चयनित टैब को बदलने से रोक सकूं। जब उपयोगकर्ता को वर्तमान में चयनित टैब को बदलने से रोका जाता है, तो उन्हें एक संवाद बॉक्स दिखाया जाता है।

मैं पहले से ही निम्नलिखित दस्तावेजों को पढ़ लिया है:

मैं समाधान 3 लिंक में संकेत को लागू किया है (हालांकि सभी उपरोक्त में से एक ही त्रुटि बनाते हैं नीचे ईन)। और यह काम करता है, लेकिन ...

हालात गंदगी उपयोगकर्ता निम्न करता है अच्छी तरह से करता है, तो: जब इस तरह की कार्रवाई की अनुमति नहीं है टैब बदलने के लिए

  • प्रयास। संदेशबॉक्स त्रुटि के साथ पॉप अप करता है।
  • उपयोगकर्ता "ठीक" पर क्लिक करता है और मूल विंडो पर वापस आ जाता है।
  • उपयोगकर्ता टैब को बदलने के लिए फिर से प्रयास करता है। कोई संदेश बॉक्स प्रकट होता है।
  • यदि उपयोगकर्ता विंडो को कम करता है, और उसके बाद इसे फिर से अधिकतम करता है, तो संदेशबॉक्स जो पहले प्रकट होता था प्रकट होता है।
  • उपयोगकर्ता "ओके" पर क्लिक करता है और मूल विंडो पर वापस आ जाता है ... लेकिन टैब को पहले से चुने गए एक में बदल दिया गया है, भले ही वे टैब को बदलने में सक्षम न हों।

यह स्पष्ट रूप से नहीं आदर्श व्यवहार है। संदेशबॉक्स दूसरी बार क्यों नहीं दिख रहा है, और टैब को तब से क्यों बदल रहा है जब इसे ऐसा करने से मना किया जाना चाहिए?

यदि मैं संदेशबॉक्स भाग को हटा देता हूं, तो यह ठीक काम करता है।

bool _isChanging = false; 

    private void tabControlForNavigation_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if (!_isChanging && canChangeTabs.IsChecked.HasValue) 
     { 
      _isChanging = true; 


      bool canLeave = canChangeTabs.IsChecked.Value; //normally this would be replaced by a check in the ViewModel 

      if (!canLeave) 
      { 
       int prevIndex = tabControlForNavigation.Items.IndexOf(tabControlForNavigation.SelectedContent); 
       tabControlForNavigation.SelectedIndex = prevIndex; 
       MessageBox.Show("Can't change tabs!"); //if I comment out this line, everything works fine. 
      } 

      _isChanging = false; 
     } 
    } 

मैं MVVM उपयोग कर रहा हूँ इस लागू करने के लिए:

यहाँ TabControl.SelectionChanged ईवेंट हैंडलर के लिए कोड है। खिड़की इस तरह दिखता है:

<Window x:Class="TestTabControlSwitching.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" 
    Height="350" 
    Width="525"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 
    <CheckBox x:Name="canChangeTabs" 
       Content="Can Change Tabs" 
       IsChecked="True" /> 
    <TabControl x:Name="tabControlForNavigation" 
       Grid.Row="1" 
       IsSynchronizedWithCurrentItem="True" 
       ItemsSource="{Binding Collection}" 
       SelectedItem="{Binding SelectedItem}" 
       SelectionChanged="tabControlForNavigation_SelectionChanged" 
       Margin="4" 
       HorizontalAlignment="Stretch"> 
     <TabControl.ItemTemplate> 
      <DataTemplate> 
       <ContentPresenter Content="{Binding Path=Name}" /> 
      </DataTemplate> 
     </TabControl.ItemTemplate> 

    </TabControl> 
</Grid> 

मैं brevity- की खातिर कोड के बाकी को छोड़ते हुए कर रहा हूँ वहाँ एक बहुत सीधी-सपाट ViewModel संरचना खिड़की का समर्थन कर रहा है।

उत्तर

5

जैसा कि आपने देखा, समस्या ईवेंट हैंडलर के अंदर MessageBox है। फोकस MessageBox में बदल जाएगा और आप सभी तरह के अवांछित प्रभाव प्राप्त कर सकते हैं। मुझे इसके साथ अपनी समस्याएं थीं।

यहाँ एक ही विषय पर तो सवाल की एक जोड़ी है
WPF: Does MessageBox Break PreviewMouseDown?
Wpf stop routing event when MessageBox appear?

आप उपयोगकर्ता के लिए संदेश प्रदर्शित करना चाहिए तो एक वैकल्पिक दृष्टिकोण एक नई Window एक तरह है जो आप शैली बनाने के लिए हो सकता है MessageBox और उसके बाद ईवेंट हैंडलर के अंदर Show (ShowDialog) पर कॉल करें।

+0

क्या हम जानते हैं कि यह WPF में एक बग है या नहीं? या यह "डिजाइन द्वारा" कुछ अजीब कारण के लिए है? – skybluecodeflier

+0

मुझे यकीन नहीं है, इसने मेरे लिए कुछ साल पहले कारण खोजा लेकिन कभी भी कोई जानकारी नहीं मिली। बस इसे परावर्तक के साथ देखा लेकिन यह जटिल है कि क्या हो रहा है .. –

+0

ओह ठीक है। आपका काम-आसपास गैर-आदर्श है, लेकिन करने योग्य है। दुर्भाग्य से मुझे कुछ प्रकार की पॉप-अप विंडो की आवश्यकता है। – skybluecodeflier

0

मैं जानता हूँ कि इस पोस्ट थोड़ा पुराना है, लेकिन मैं एक बहुत ही आसान तरीका यह है, है:

tab_Enter घटना का उपयोग करें और एक विधि है कि आपका चेक कैसा प्रदर्शन करता है और उपयोगकर्ता के लिए एक MessageBox को प्रदर्शित करता है और फिर सेट myTabs.SelectedIndex पूर्व सूचकांक में। एक साधारण उदाहरण:

private void someTab_Enter(object sender, EventArgs e) 
    { 
     if (myCondition) 
     { 
      MessageBox.Show("Sorry, myCondition will not let you move to this tab."); 
      myTabs.SelectedIndex = someOtherTabIndex; 
     } 
    } 
0

यह एक बहुत ही विस्तृत सवाल था। मेरे पास वही समस्या थी (यानी संदेश बॉक्स 2 या 3 चयन पर प्रदर्शित नहीं होता है जब तक कि आप खिड़की को कम और अधिकतम नहीं करते) और बहुत से डिबगिंग और कई Google खोजों के बाद, नीचे दिए गए एमएसडीएन फोरम पोस्ट पर ठोकर खाई गई।

[TabControl SelectionChanged Strange Behaviour?]

कृपया खराब स्वरूपित सवाल-जवाब की उपेक्षा। लेकिन जैसा कि उत्तर में बताया गया है, इसे एक प्रेषक के अंदर डालने और सूचकांक को सेट करने के बाद चयनित टैब पर ध्यान केंद्रित करने के लिए मेरे लिए समस्या का समाधान किया।

0

आप एक आसान चाल लापता हैं। टैब हेडर के लिए बस फोकस करने योग्य = गलत करें।

<TabItem Header="MY TAB" Focusable="False"> 

आप अपने दृश्य मॉडल के लिए इस संपत्ति के लिए बाध्य कर सकता है।

<TabItem Header="MY TAB" Focusable="{Binding Bool_CanHasCheeseBurger}"> 
संबंधित मुद्दे