gpt4 book ai didi

c# - 以 react 方式在窗口关闭时显示确认

转载 作者:太空狗 更新时间:2023-10-29 21:57:20 26 4
gpt4 key购买 nike

我有一个用于显示确认对话框的可观察对象,大致带有签名:

IObservable<DialogResult> ShowDialog(string title, string message);

这向用户显示对话框,带有是/否按钮组合。

在我的主窗口中,我正在访问关闭事件:

this.Events().Closing.[Do something here]

我希望能够:

  1. 关闭可观察对象触发时显示确认对话框
  2. 如果用户单击“否”按钮,则将 CancelEventArgs.Cancel 属性设置为 true。

我试过直接订阅:

this.Events().Closing.Subscribe(e =>
{
var res = Dialogs.ShowDialog("Close?", "Really Close?").Wait();
e.Cancel = res == DialogResult.Ok;
});

但由于 Wait() 调用而挂起,我还尝试了异步变体:

this.Events().Closing.Subscribe(async e =>
{
var res = await Dialogs.ShowDialog("Close?", "Really Close?");
e.Cancel = res == DialogResult.Ok;
});

这不好,因为它会立即返回。

我真正想做的是:

this.Events().Closing.ThenDo(_ => Dialogs.ShowDialog("Close?", "Really Close?"))
.Subscribe((cancelEventArgs, dialogResult) =>
{
cancelEventArgs.Cancel == dialogResult == DialogResult.Ok;
});

但这并不存在,我知道这里的关键在于我如何结合这两个可观察量,但我不知道该怎么做,而且文档中有一点点说明实例。

最佳答案

需要阻止 Closing 事件处理程序,因此异步(或 Rx 操作)在这里对您帮助不大。

但您还需要以这样的方式阻止它,即 UI 事件仍在处理中,这样 UI 就不会卡住。

最常见的解决方案是使用 Window.ShowDialog 而不是 Show,此代码有效:

        this.Events().Closing.Subscribe(e =>
{
var ret = new Window().ShowDialog();
e.Cancel = true;
});

但是在您的 ShowDialog Rx 方法中使用它会阻止它的订阅调用,这不太可能是您想要的(对于其他情况,在这种情况下,它是您需要的)。

或者,您可以运行内部调度程序循环,如下所示:

        this.Events().Closing.Subscribe(e =>
{
var dialog = Dialogs.ShowDialog("Close?", "Really Close?");
var dispatcherFrame = new DispatcherFrame();
dialog.Take(1).Subscribe(res => {
e.Cancel = res == DialogResult.Ok;
dispatcherFrame.Continue = false;
});
// this will process UI events till the above fires
Dispatcher.PushFrame(dispatcherFrame);
});

只有当两个窗口使用相同的 Dispatcher 时,这才有效。

编辑:

或者,您可以通过始终取消关闭并稍后自己关闭表单来避免阻塞,这可能更符合 Rx 方式,即:

        var forceClose = default(bool);

this.Events().Closing
.Where(_ => !forceClose)
.Do(e => e.Cancel = true)
.SelectMany(_ => Dialogs.ShowDialog("Close?", "Really Close?"))
.Where(res => res == DialogResult.Ok)
.Do(_ => forceClose = true)
.Subscribe(_ => this.Close());

关于c# - 以 react 方式在窗口关闭时显示确认,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30357038/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com