نواجه كيفية التعامل مع زر العودة على Windows Phone 7




مشاكل لوميا 535 (3)

على المحاكي الخاص بـ windows phone 7 ، عند الضغط على زر العودة ، يكون السلوك الافتراضي هو إغلاق التطبيق الحالي. أرغب في تجاوز هذا السلوك الافتراضي بحيث ينتقل إلى الصفحة السابقة في طلبي.

بعد إجراء بعض الأبحاث ، يبدو أنه من الممكن إجراء ذلك عن طريق تجاوز طريقة OnBackKeyPress ، مثل:

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

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

ومع ذلك ، فإن النقر على زر الرجوع لا يزال يغلق طلبي. وضع نقطة توقف على الطريقة المذكورة أعلاه يكشف أنه لم يتم استدعاؤه مطلقًا. لدى نقطة توقف أخرى على رمز إنهاء التطبيق الخاص بي ، ويتم ضرب نقطة الإيقاف هذه.

هل هناك شيء آخر أحتاج إلى القيام به لاعتراض زر الرجوع؟


Answer #1

لقد تمكنت من استخدام هذه التقنية لفعل ما أردت ، وهو منع التنقل الخلفي أثناء إخفاء عنصر التحكم الذي ينزلق داخل النافذة وخارجها. بشكل افتراضي ، يتم تصغير رؤية عنصر التحكم. يتم استخدام القصص المصورة للتحكم عندما يصبح مرئيًا أو مطويًا. في 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 يتم تضمينه في العبارة if لأنه إذا قام المستخدم بالضغط على الزر الخلف مرتين ولم يكمل Storyboard سيتم تشغيله مرة أخرى. هذا يمنع backbutton إلغاء التنقل إلى الصفحة السابقة. وبعبارة أخرى ، إذا كانت Storyboard نشطة ، فإن الرمز "يعلم" أن المستخدم قد بدأ بالفعل في إخفائه ويعتزم الانتقال مرة أخرى إلى الصفحة السابقة. (حسنا ، على الأقل هذا السلوك الذي سيحصلون عليه ... ولن يروا الرسوم المتحركة مرتين)!


Answer #2

يبدو أنه من غير الممكن تجاوز أسلوب OnBackKeyPress لاعتراض مفتاح العودة ما لم تستخدم أسلوب Navigate للتنقل بين الصفحات في التطبيق الخاص بك.

كانت طريقة التنقل السابقة الخاصة بي هي تغيير الصورة الجذرية ، مثل:

App.Current.RootVisual = new MyPage(); 

وهذا يعني أن بإمكاني الاحتفاظ بكل الصفحات في الذاكرة لذا لم أكن بحاجة إلى تخزين البيانات المخزنة عليها (يتم جمع بعض البيانات عبر الشبكة).

يبدو الآن أنني بحاجة إلى استخدام طريقة التنقل في إطار الصفحة ، مما يؤدي إلى إنشاء نسخة جديدة من الصفحة التي أنتقل إليها.

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

بعد أن بدأت في التنقل باستخدام هذه الطريقة ، يمكنني عندئذٍ تجاوز معالجة الزر الخلفي بالطريقة الموضحة في سؤالي ...


Answer #3

إذا كنت لا تريد سلوك مفتاح الرجوع الافتراضي ، فاضبط Cancel = true في المعلمة CancelEventArgs في OnBackKeyPress. في صفحتي ، تجاوزت الزر الخلفي لإغلاق عنصر تحكم في متصفح الويب بدلاً من التنقل مرة أخرى.

    protected override void OnBackKeyPress(CancelEventArgs e)
    {
        if (Browser.Visibility == Visibility.Visible)
        {
            Browser.Visibility = Visibility.Collapsed;
            e.Cancel = true;
        }
    }