Как вернуть результат, если пользователь не нажимает на окно сообщения

Фон: я хочу показать пользователю пользовательское окно сообщения с кнопками "Да/Нет", и если пользователь нажмет каждую из этих кнопок, я верну результат вызывающему абоненту. Кроме того, если пользователь снова не проявляет никакой реакции, я хочу вернуть третий результат (используя событие Timer). Короче говоря, либо по прошествии некоторого времени, либо после нажатия кнопки метод (Display в моем коде) должен возвращать значение; и я хочу дождаться любого из них.

Проблема: пользовательский интерфейс выглядит замороженным, и срабатывает только событие Timer.

Код, который будет использоваться в реальном проекте (с родственными именами!):

namespace MessageBox
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            MyForm.Display();
        }
    }
    public class MyForm : Form
    {
        public MyForm()
        {
             List<Button> _buttonCollection = new List<Button>();

            FlowLayoutPanel _flpButtons = new FlowLayoutPanel();
            Panel _plFooter = new Panel();

            _plFooter.Dock = DockStyle.Bottom;
            _plFooter.Padding = new Padding(5);
            _plFooter.BackColor = Color.FromArgb(41, 47, 139);
            _plFooter.Height = 75;
            this.FormBorderStyle = FormBorderStyle.None;
            this.BackColor = Color.FromArgb(20, 37, 105);
            this.StartPosition = FormStartPosition.CenterScreen;
            this.Padding = new Padding(3);
            this.Width = 400;
            _flpButtons.FlowDirection = FlowDirection.RightToLeft;
            _flpButtons.Dock = DockStyle.Fill;
            _plFooter.Controls.Add(_flpButtons);
            this.Controls.Add(_plFooter);
            Button btnYes = new Button();
            btnYes.Click += ButtonClick;
            btnYes.Text = "Yes";
            Button btnNo = new Button();
            btnNo.Click += ButtonClick;
            btnNo.Text = "No";
            _buttonCollection.Add(btnYes);
            _buttonCollection.Add(btnNo);
            foreach (Button btn in _buttonCollection)
            {
                btn.ForeColor = Color.FromArgb(170, 170, 170);
                btn.Font = new System.Drawing.Font("Eurostile", 12, FontStyle.Bold);
                btn.Padding = new Padding(3);
                btn.FlatStyle = FlatStyle.Flat;
                btn.Height = 60;
                btn.Width = 150;
                btn.FlatAppearance.BorderColor = Color.FromArgb(99, 99, 98);
                _flpButtons.Controls.Add(btn);
            }


        }
        static Task taskA;
        private  void ButtonClick(object sender, EventArgs e)
        {
            _event.Set();
            Button btn = (Button)sender;
            if (btn.Text == "Yes")
                Result = 1;
            else
            {
                Result = 2;
            }
            this.Close();
            this.Dispose();
        }
        static AutoResetEvent _event = new AutoResetEvent(false);
        private static MyForm form;
        public static int Display()
        {
            form = new MyForm();
            StartTimer();
            form.Show();
            _event.WaitOne();
            form.Close();
            form.Dispose();
            return Result;
        }

        private static void StartTimer()
        {
            _timer = new System.Timers.Timer(10000);
            _timer.Elapsed += SetEvent;

            _timer.AutoReset = false;
            _timer.Enabled = true;
        }

        private static System.Timers.Timer _timer;
        public static int Result { get; set; }

        private static void SetEvent(Object source, System.Timers.ElapsedEventArgs e)
        {
            _timer.Start();
            Result = -1;
            var timer = (System.Timers.Timer) source;
            timer.Elapsed -= SetEvent;
            _event.Set();
        }
    }
}

Примечание. Я знаю, что проблема в том, что элемент управления пользовательского интерфейса создается в замороженном потоке, но каково решение?


person mok    schedule 25.01.2017    source источник
comment
Мок, я думаю, это то, что ты хочешь. Проверьте здесь для ответа.   -  person Marc Lyon    schedule 25.01.2017
comment
@MarcLyon На самом деле, когда я реализовывал этот код, я смотрел на этот код, во-первых, он использует хуки, которые я не хочу использовать (хотя я пытался, и это слишком усложняло), во-вторых, там SO не не нужно возвращать значение, если пользовательский интерфейс бездействует.   -  person mok    schedule 25.01.2017


Ответы (1)


Создайте диалоговое окно для MessageBox в конце вашего процесса и покажите предупреждение, которое вы хотите показать пользователю.

Вы можете просмотреть источники например и решить проблему с Поток

person Masoud Andalibi    schedule 25.01.2017