2010-05-20 16 views
43

विंडोज फोन 7 एमुलेटर पर, जब हार्डवेयर बैक बटन दबाया जाता है, तो डिफ़ॉल्ट व्यवहार आपके वर्तमान एप्लिकेशन को बंद करने के लिए होता है। मैं इस डिफ़ॉल्ट व्यवहार को ओवरराइड करना चाहता हूं ताकि यह मेरे आवेदन में पिछले पृष्ठ पर जा सके।विंडोज फोन 7 पर वापस बटन को कैसे संभालें

कुछ शोध करने के बाद, ऐसा लगता है यह OnBackKeyPress विधि अधिभावी, इसलिए तरह से यह करने के लिए संभव हो जाना चाहिए:

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e) 
{ 
    // do some stuff ... 

    // cancel the navigation 
    e.Cancel = true; 
} 

हालांकि, वापस बटन पर क्लिक अभी भी अपने आवेदन बंद कर देता है। उपर्युक्त विधि पर ब्रेकपॉइंट डालने से पता चलता है कि इसे कभी नहीं कहा जाता है। मेरे पास मेरे आवेदन निकास कोड पर एक और ब्रेकपॉइंट है, और यह ब्रेकपॉइंट हिट है।

क्या बैक बटन को रोकने के लिए मुझे कुछ और करने की ज़रूरत है?

+2

मेरे मेनपेज.एक्सएएमएल से ऑनबैककेप्रेस() को ओवरराइड करना और ईकेलेल को कॉल करना मेरे लिए ठीक काम करता है। – BrokeMyLegBiking

+0

आप वापस बटन संभाल कर सकते हैं, [मेरे इस पोस्ट जवाब की जांच] [1] [1]: http://stackoverflow.com/questions/8975822/prompt-confirmation-dialog-when-exit -एप/8977078 # 8977078 – Santhu

उत्तर

29

ऐसा लगता है कि जब तक आप अपने आवेदन में पृष्ठों के बीच स्थानांतरित करने के लिए Navigate विधि का उपयोग नहीं करते हैं, तब तक बैक कुंजी को रोकने के लिए OnBackKeyPress विधि को ओवरराइड करना संभव नहीं है।

नेविगेशन की मेरे पिछले विधि की तरह दृश्य जड़ को बदलने के लिए, था:

App.Current.RootVisual = new MyPage(); 

इसका मतलब था मैं स्मृति में मेरे सभी पृष्ठों को रखने ताकि मैं उनके लिए संग्रहीत डेटा कैश करने के लिए जरूरत नहीं थी सकता है (कुछ डेटा नेट पर एकत्र किया जाता है)।

अब ऐसा लगता है कि मुझे वास्तव में पृष्ठ फ्रेम पर नेविगेट विधि का उपयोग करने की आवश्यकता है, जो उस पृष्ठ का एक नया उदाहरण बनाता है जिसे मैं नेविगेट कर रहा हूं।

(App.Current.RootVisual as PhoneApplicationFrame).Navigate(
            new Uri("/MyPage.xaml", UriKind.Relative)); 

एक बार मैं इस पद्धति का उपयोग, मैं तो जिस तरह से मेरे सवाल में वर्णित में वापस बटन से निपटने रद्द कर सकते थे नेविगेट करना आरंभ ...

+0

वास्तव में यदि आप नेविगेट का उपयोग करते हैं तो बैक बटन को ओवरराइड करें, तो आप इसके लिए एक नया व्यवहार लागू कर सकते हैं (इसे स्वयं जांचें!)। – RoguePlanetoid

+0

क्या ऐसा करने के लिए कोई * अन्य तरीका है? क्या होगा यदि एक पृष्ठ पर सभी इंटरैक्शन किए जा रहे हैं? क्या बैक बटन को ओवरराइड करना असंभव है? –

+0

मैं सुझाव देता हूं कि "डमी" -पृष्ठ जो एप्लिकेशन शुरू होने पर आपके मुख्य पृष्ठ पर नेविगेट करता है, इस तरह आप अपने मुख्य पृष्ठ में बैक बटन ओवरराइड कर सकते हैं। – Pking

3

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

<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ControlScroller" Storyboard.TargetProperty="(UIElement.Visibility)"> 
<ObjectAnimationUsingKeyFrames.KeyFrames> 
    <DiscreteObjectKeyFrame KeyTime="00:00:00"> 
     <DiscreteObjectKeyFrame.Value> 
      <Visibility>Visible</Visibility> 
     </DiscreteObjectKeyFrame.Value> 
    </DiscreteObjectKeyFrame> 
</ObjectAnimationUsingKeyFrames.KeyFrames> 

फिर पेज के कोड में

:

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e) 
{ 

    if(ControlScroller.Visibility == Visibility.Visible && StoryboardHideControlSlider.GetCurrentState() != ClockState.Active) 
    { 
     StoryboardHideControlSlider.Begin(); 

     ContentGrid.IsHitTestVisible = true; 

     e.Cancel = true; 
    } 
} 

नोट: स्टोरीबोर्ड में ContentScroller (जो एक ग्रिड है) छुपाता है, KeyTime है "00:00:01" पर सेट करें क्योंकि मैं इसे दृश्यमान रहना चाहता हूं, जबकि यह स्लाइडिंग (और लुप्तप्राय) दृश्य से बाहर है।

नोट 2: कारण StoryboardHideControlSlider.GetCurrentState() != ClockState.Active को अगर कथन में शामिल किया गया है क्योंकि उपयोगकर्ता दो बार बैक बटन हिट करता है और स्टोरीबोर्ड पूरा नहीं हुआ है तो यह फिर से चला जाएगा। यह बैकबटन को पिछले पृष्ठ पर नेविगेशन को रद्द करने से रोकता है। तो दूसरे शब्दों में, यदि स्टोरीबोर्ड सक्रिय है, तो कोड "जानता है" कि उपयोगकर्ता ने इसे पहले ही छुपाया है और पिछले पृष्ठ पर नेविगेट करना चाहता है। (ठीक है, कम से कम वह व्यवहार है जिसे वे प्राप्त करने जा रहे हैं ... और वे एनीमेशन दो बार नहीं देख पाएंगे)!

23

यदि आप डिफ़ॉल्ट बैक कुंजी व्यवहार नहीं चाहते हैं, तो OnBackKeyPress में CancelEventArgs पैरामीटर में रद्द = सत्य सेट करें। मेरे पृष्ठ में, मैंने वापस नेविगेट करने के बजाए एक वेब ब्राउज़र नियंत्रण बंद करने के लिए बैक बटन को ओवरराइड कर दिया है।

protected override void OnBackKeyPress(CancelEventArgs e) 
    { 
     if (Browser.Visibility == Visibility.Visible) 
     { 
      Browser.Visibility = Visibility.Collapsed; 
      e.Cancel = true; 
     } 
    } 
संबंधित मुद्दे