Cài đặt MessageBox xác nhận trước khi thoát

Cài đặt MessageBox xác nhận trước khi thoát

Khi lập trình nói chung và Windows Phone nói riêng, thì việc hỏi để người dùng xác nhận một cái gì đấy là điều cần thiết. Ví dụ như khi bạn làm một cái form để người dùng nhập status rồi post lên Facebook, sẽ rất khó chịu nếu người dùng lỡ tay chạm phải nút Back (mà thực tế là mình cứ bị hoài) và lại phải gõ lại status từ đầu :v

Việc này rất đơn giản, khi người dùng nhấn Back, sẽ xuất hiện 1 hộp thoại hỏi người dùng có muốn thoát không, nếu người dùng nhấp Ok thì thoát, nếu ngược lại thì không.

Bởi vì {php}MessageBox{/php} bình thường chỉ hỗ trợ một button, nhưng chúng ta lại cần đến tận 2 button, nên {php}CustomMessageBox{/php} trong bộ Windows Phone Toolkit sẽ là một lựa chọn hợp lý.

Chúng ta sẽ làm như sau:

//Override event OnBackKeyPress
protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
    //Không back như thông lệ
    e.Cancel = true;
    //Tạo một CustomMessageBox với các thông tin tương ứng
    CustomMessageBox myCustomMessageBox = new CustomMessageBox()
    {
        Title = "ê này",
        Content = "không muốn post gì nữa thật à?",
        LeftButtonContent = "ừ không",
        RightButtonContent = "post tiếp"
    };
    //Ra lệnh cho nó phải làm gì sau khi người dùng quyết định xong
    myCustomMessageBox.Dismissed += (sender, args) =>
    {
        switch (args.Result)
        {
            //Nếu người dùng chọn "ừ không" thì quay lại trang trước
            case CustomMessageBoxResult.LeftButton:
                NavigationService.GoBack();
                break;
        }
    };
    //Cài đặt hết rồi thì show nó ra
    myCustomMessageBox.Show();
}

Tuy nhiên, mọi chuyện hoàn toàn không hề đơn giản như vậy, rắc rối ở đây là nếu nhét nó vào sự kiện {php}OnBackKeyPress{/php}, ngay khi người dùng nhấn Back, {php}CustomMessageBox{/php} sẽ hiện ra, nhưng ngay sau đó lại biến mất luôn, hoàn toàn không để lại dấu vết gì hay có bất cứ cơ hội nào cho người dùng có thể đưa ra lựa chọn của mình.

Giải pháp ở đây khá đơn giản, đó là chỉ việc nhét hết đống code liên quan đến cái {php}CustomMessageBox{/php} đấy vào một cái {php}Dispatcher{/php} là xong :v

//Override event OnBackKeyPress
protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
    //Không back như thông lệ
    e.Cancel = true;
    Deployment.Current.Dispatcher.BeginInvoke(() =>
    {
        //Tạo một CustomMessageBox với các thông tin tương ứng
        CustomMessageBox myCustomMessageBox = new CustomMessageBox()
        {
            Title = "ê này",
            Content = "không muốn post gì nữa thật à?",
            LeftButtonContent = "ừ không",
            RightButtonContent = "post tiếp"
        };
        //Ra lệnh cho nó phải làm gì sau khi người dùng quyết định xong
        myCustomMessageBox.Dismissed += (sender, args) =>
        {
            switch (args.Result)
            {
                    //Nếu người dùng chọn "ừ không" thì quay lại trang trước
                case CustomMessageBoxResult.LeftButton:
                    NavigationService.GoBack();
                    break;
            }
        };
        //Cài đặt hết rồi thì show nó ra
        myCustomMessageBox.Show();
    });
}

Và bây giờ thì mọi thứ sẽ hoạt động ngon lành  cho các bạn :v

Chúc các bạn thành công :3

Dzô lô \m/

Leave a Reply

Your email address will not be published. Required fields are marked *