我目前正在实现 MessageDialog 控件。它在那里可以完全替换MessageBox,并显示为“窗口内弹出窗口”(需要正确的UX术语)。

当前,其构造函数是私有(private)的,并且有一个Show方法,就像MessageBox.Show中一样。但是,MessageBox阻止UI线程并返回结果。

我的MessageDialog控件当前所做的是具有Action<MessageDialogResult> callback参数,该参数在单击按钮时被调用。

使用MessageDialog

// class MessageDialog
public static void MessageDialog.Confirmation(Window owner, string message, Action<MessageDialogResult> callback);

// When used by other controls
MessageDialog.Confirmation(WindowMain.Singleton, true, (result) =>
{
    if (result.Button == MessageDialogButton.Yes)
    {
        //...
    }
});

c# - 视窗内弹出式视窗: How to block UI thread?-LMLPHP

但是,像MessageBox.Show中那样使用回调而不是阻塞方法调用对我绝对没有任何好处。这使事情变得相当复杂。我想实现的目标是...
if (MessageDialog.Confirmation(WindowMain.Singleton, true).Button == MessageDialogButton.Yes)
{
    //...
}

...我认为这更干净。

后面的当前代码基本上是
  • 创建MessageDialog实例,并使用文本
  • 填充内容
  • 将它添加到Window.Content.Children的子项
  • 单击按钮时,调用callback(result)并从Window.Content.Children中删除

  • 问题:我想要实现的是使用阻塞方法调用,而不是触发回调的方法。

    最佳答案

    这样的事情怎么样:

    //DialogControl.cs
    bool _closed = false;
    DialogResult _result;
    
    DialogResult ShowModal()
    {
        this.Show();
        while(!_closed) Application.DoEvents();  //Infinite loop
        return _result;
    }
    
    public void OkButton_OnClick(EventArgs e, object sender)
    {
        _result = DialogResult.OK;
        _closed = true;
    }
    
    public void CancelButton_OnClick(EventArgs e, object sender)
    {
        _result = DialogResult.Cancel;
        _closed = true;
    }
    

    关于c# - 视窗内弹出式视窗: How to block UI thread?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41274385/

    10-13 09:28