简体   繁体   中英

Message box in UWP not working

Please help me, I have ran into a problem. I'm new in UWP coding problem : I have build a simple application which consists of a button. When the button is pressed it will display a message

Error : Cannot find typre System.Collections.CollectionBase in module CommonLanguageRuntimeLibrary

Here is my code

using System;    
using System.Collections.Generic;   
using System.IO;   
using System.Linq;   
using System.Runtime.InteropServices.WindowsRuntime;  
using Windows.Foundation;  
using Windows.Foundation.Collections;  
using Windows.UI.Xaml;  
using Windows.UI.Xaml.Controls;  
using Windows.UI.Xaml.Controls.Primitives;  
using Windows.UI.Xaml.Data;  
using Windows.UI.Xaml.Input;  
using Windows.UI.Xaml.Media;  
using Windows.UI.Xaml.Navigation;  
using System.Windows.MessageBox;  
using System.Windows.Forms;  

// The Blank Page item template is documented at     https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409

namespace App1  
{   
/// <summary>   
/// An empty page that can be used on its own or navigated to within a Frame.   
/// </summary>   
public sealed partial class MainPage : Page  
{    
    public MainPage()   
    {    
        this.InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("HI");
    }
}
}

There is no MessageBox in UWP but there is a MessageDialog :

using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Windows.UI.Popups;
using System;

namespace App1
{
    /// <summary>   
    /// An empty page that can be used on its own or navigated to within a Frame.   
    /// </summary>   
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            var dialog = new MessageDialog("Hi!");
            await dialog.ShowAsync();
        }
    }
}

I strongly recommend you to use a separate, function to display a popup message.

UWP uses the namespace Windows.UI.Popups and not System.Windows.MessageBox , since it's only used for Win32 or WinForms applications

Here's a good way to display your desired message:

// Other namespaces (essential)
...

// Required namespaces for this process
using Windows.UI.Popups;
using System.Runtime.InteropServices;

namespace PopupMessageApp
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        // I will only comment those that are not obvious to comprehend.
        private async void ShowMessage(string title, string content, [Optional] object[][] buttons)
        {
            MessageDialog dialog = new MessageDialog(content, title);

            // Sets the default cancel and default indexes to zero. (incase no buttons are passed)
            dialog.CancelCommandIndex   = 0;
            dialog.DefaultCommandIndex  = 0;

            // If the optional buttons array is not empty or null.
            if (buttons != null)
            {
                // If there's multiple buttons
                if (buttons.Length > 1)
                {
                    // Loops through the given buttons array
                    for (Int32 i = 0; i < buttons.Length; i++)
                    {
                        /* Assigns text and handler variables from the current index subarray.
                         * The first object at the currentindex should be a string and 
                         * the second object should be a "UICommandInvokedHandler" 
                         */
                        string text = (string)buttons[i][0];

                        UICommandInvokedHandler handler = (UICommandInvokedHandler)buttons[i][1];

                        /* Checks whether both variables types actually are relevant and correct.
                         * If not, it will return and terminate this function and not display anything.
                         */
                        if (handler.GetType().Equals(typeof(UICommandInvokedHandler)) &&
                            text.GetType().Equals(typeof(string)))
                        {
                            /* Creates a new "UICommand" instance which is required for
                             * adding multiple buttons.
                             */
                            UICommand button = new UICommand(text, handler);

                            // Simply adds the newly created button to the dialog
                            dialog.Commands.Add(button);
                        }
                        else return;
                    }
                }
                else
                {
                    // Already described
                    string text = (string)buttons[0][0];

                    UICommandInvokedHandler handler = (UICommandInvokedHandler)buttons[0][1];

                    // Already described
                    if (handler.GetType().Equals(typeof(UICommandInvokedHandler)) &&
                        text.GetType().Equals(typeof(string)))
                    {
                        // Already described
                        UICommand button = new UICommand(text, handler);

                        // Already described
                        dialog.Commands.Add(button);
                    }
                    else return;
                }

                /* Sets the default command index to the length of the button array.
                 * The first, colored button will become the default button or index.
                 */
                dialog.DefaultCommandIndex = (UInt32)buttons.Length;
            }

            await dialog.ShowAsync();
        }

        private async void MainPage_Load(object sender, EventArgs e)
        {
            /* Single object arrays with a string object and a "UICommandInvokedHandler" handler.
             * The ShowMessage function will only use the first and second index of these arrays.
             * Replace the "return" statement with a function or whatever you desire.
             * (The "return" statemnet will just return and do nothing (obviously))
             */
            object[] button_one = { "Yes", new UICommandInvokedHandler((e) => { return; }) };
            object[] button_two = { "No", new UICommandInvokedHandler((e) => { return; }) };

            /* Object arrays within an object array.
             * The first index in this array will become the first button in the following message.
             * The first button will also get a different color and will become the default index.
             * For instance, if you press on the "enter" key, it will press on the first button.
             * You can add as many buttons as the "Windows.UI.Popups.MessageDialog" wants you to.
             */
            object[][] buttons = new object[][]
            {
                button_one,
                button_two
            };

            // Displays a popup message with multiple buttons
            ShowMessage("Title", "Content here", buttons);

            /* Displays a popup message without multiple buttons.
             * The last argument of the ShowMessage function is optional.
             * because of the definition of the namespace "System.Runtime.InteropServices".
             */
            ShowMessage("Title", "Content here");

            // PS, I have a life, just trying to get points xD // BluDay
        }
    }
}

This way, you can display a message dialog with or without passing an object array with subarrays that contains of buttons. This method is extremely efficient. If you like this, make sure you fully understand it!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM