एक टोस्ट सूचना प्राप्त करते समय वर्तमान पृष्ठ प्राप्त करना(डब्ल्यूएनएस टोस्ट नोटिफिकेशन प्राप्त करते हुए WP8.1 Silverlight)




windows-phone-8 windows-phone-8.1 (2)

ठीक। इसे इस्तेमाल करे। App.xaml.cs. पर एक स्थिर संपत्ति बनाएं।

public static object CurrentPageInfo { get; set; }

और प्रत्येक पृष्ठ पर 'OnNavigatedTo' पद्धति पर प्रॉपर्टी के लिए पृष्ठ प्रकार या पेज नाम असाइन करें

protected override void OnNavigatedTo(NavigationEventArgs e)
{
  base.OnNavigatedTo(e);
  var currentPage = ((PhoneApplicationFrame)Application.Current.RootVisual).Content;
  App.CurrentPageInfo = currentPage.GetType() is BC_Menu.StartUp.SecondScreen;
}

ताकि आप App.CurrentPageInfo संपत्ति को एक्सेस करके सूचना प्राप्त करने पर पृष्ठ स्रोत प्रकार की पहचान कर सकें। आशा करता हूँ की ये काम करेगा!

मेरे पास एक इवेंट है, जब ऐप लाइव होता है और मुझे एक नोटिफिकेशन प्राप्त होता है, जो कि वर्तमान CurrentChannel_PushNotificationReceived । इस फ़ंक्शन में मुझे यह पता लगाना है कि पृष्ठ को वर्तमान में पृष्ठ पर सामग्री अपडेट करना चाहिए या नहीं, यह जानने के लिए कि यह पृष्ठ किस प्रकार दिखाया गया है। इसलिए सवाल दो गुना है, यह जानने के लिए कि वर्तमान में कौन सा पृष्ठ प्रदर्शित है और टोस्ट नोटिफिकेशन के साथ इंटरैक्ट करते हैं।

अपडेट समस्या यह है कि मैं ओएस थ्रेडिंग (डिस्पैचर) के साथ संघर्ष के कारण तत्वों से बात नहीं कर सकता।

इसलिए नीचे दिए गए कोड का उपयोग करके मुझे संदेश की सामग्री का उपयोग करने की अनुमति मिलती है। लेकिन मैं अभी भी current_page की जानकारी प्राप्त करने में सक्षम नहीं हूं

  _channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
_channel.PushNotificationReceived += OnPushNotificationReceived;

निजी शून्य OnPushNotificationReceived (PushNotificationChannel प्रेषक, PushNotificationReceivedEventArgs args) {स्विच (args.NotificationType) {case PushNotificationType.Badge: this.OnBadgeNotificationReceived (args.BadgeNotification.Content.GetXml ()); टूटना;

        case PushNotificationType.Tile:
            this.OnTileNotificationReceived(args.TileNotification.Content.GetXml());
            break;

        case PushNotificationType.Toast:
            this.OnToastNotificationReceived(args.ToastNotification.Content.GetXml());
            break;

        case PushNotificationType.Raw:
            this.OnRawNotificationReceived(args.RawNotification.Content);
            break;
    }

    args.Cancel = true;
}

private void OnBadgeNotificationReceived(string notificationContent)
{
    // Code when a badge notification is received when app is running
}

private void OnTileNotificationReceived(string notificationContent)
{
    // Code when a tile notification is received when app is running
}

private void OnToastNotificationReceived(string notificationContent)
{
    // Code when a toast notification is received when app is running

    // Show a toast notification programatically

    var xmlDocument = new XmlDocument();
    xmlDocument.LoadXml(notificationContent);
    var toastNotification = new ToastNotification(xmlDocument);

    //toastNotification.SuppressPopup = true;
    ToastNotificationManager.CreateToastNotifier().Show(toastNotification);
}

private void OnRawNotificationReceived(string notificationContent)
{
    // Code when a raw notification is received when app is running
}

सवाल

मैं वर्तमान पृष्ठ जानकारी को onXXXXNotificationReceived पर अलग-अलग onXXXXNotificationReceived में कैसे प्राप्त कर सकता हूं। वर्तमान स्निपेट्स काम करते हैं लेकिन इन कार्यों में नहीं:

var currentPage = ((PhoneApplicationFrame)Application.Current.RootVisual).Content;
        var tempBool = currentPage.GetType() is BC_Menu.StartUp.SecondScreen;

या

RootFrame.CurrentSource;

मेरा अनुमान है कि यूआई-थ्रेड के कारण है तो मैं सूचना प्राप्त करने के लिए डिस्पैचर का उपयोग कैसे कर सकता हूं? मैंने डिस्पैचर के साथ कुछ समाधानों की कोशिश की है, लेकिन मैं जानकारी का इंतजार नहीं कर सकता, और इसलिए यह लागू नहीं है।

System.Windows.Threading.DispatcherOperation op = App.RootFrame.Dispatcher.BeginInvoke(new Func<Uri>(() =>  
            {
                return RootFrame.CurrentSource;
            })
        );
        await op; //Not awaitable.

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

घटना को पंजीकृत करें ...

var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
channel.PushNotificationReceived += Channel_PushNotificationReceived;

ईवेंट हैंडलर पर, सूचना प्रदर्शित करने को रद्द करें और उसके बाद यूआई थ्रेड पर भेजें ...

private void Channel_PushNotificationReceived(PushNotificationChannel sender, PushNotificationReceivedEventArgs args)
{
    // Make sure you cancel displaying the toast on this thread (not on UI thread)
    // since cancellation needs to be set before this thread/method returns
    args.Cancel = true;

    // Then dispatch to the UI thread
    App.RootFrame.Dispatcher.BeginInvoke(delegate
    {
        var currPage = ((PhoneApplicationFrame)Application.Current.RootVisual).Content;

        switch (args.NotificationType)
        {
            case PushNotificationType.Toast:
                // TODO
                break;
        }
    });
}

डिस्पैचर के प्रतिनिधि के अंदर अपने सभी कोड करें। आपके सभी कोड UI थ्रेड पर निष्पादित होंगे ... आप पृष्ठों को नेविगेट करने, वर्तमान पृष्ठ प्राप्त करने में सक्षम होंगे।