gpt4 book ai didi

c# - 任何时候只能打开一个 ContentDialog

转载 作者:行者123 更新时间:2023-11-30 21:34:14 41 4
gpt4 key购买 nike

如果我多次按下登录按钮,它会触发消息:“异步操作未正确启动。任何时候只能打开一个 ContentDialog。” (延迟表示应用程序联系服务器以查看用户是否有效所花费的时间。)

如果我使用 MessageDialog 一切正常,但我想使用 ContentDialog 提供的额外定制。

This链接没有帮助。我下面的代码示例展示了我尝试使用它。

XAML:

<Page
x:Class="DuckTracker.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:DuckTracker"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>

<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>

<TextBlock Grid.Row="0" Grid.Column="0" Height="20">Name:</TextBlock>
<TextBox Grid.Row="0" Grid.Column="1" Height="20"></TextBox>
<Button Click="Button_Click" Grid.Row="2" VerticalAlignment="Bottom">Login</Button>
</Grid>
</Page>

代码隐藏:

using System;
using System.Threading.Tasks;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace DuckTracker
{

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

private async void Button_Click(object sender, RoutedEventArgs e)
{
bool canLogin = await CanLogin();

if (canLogin == false)
{
try
{
await AlertWithMessages("Fail", "Could not log in!", "ok");

}
catch (Exception ex)
{

var dialog = new Windows.UI.Popups.MessageDialog(ex.Message, "Error");
await dialog.ShowAsync();
}

}
}

public async Task AlertWithMessages(string title, string msg, string confirm)
{
ContentDialog dialog = new ContentDialog()
{
Title = title,
Content = msg,
PrimaryButtonText = confirm
};

await ContentDialogMaker.CreateContentDialogAsync(dialog, true);

}

public async Task<bool> CanLogin()
{
await Task.Delay(1000);

return false;
}
}
}

从上面提到的链接借用的代码:

using System;
using System.Threading.Tasks;
using Windows.UI.Xaml.Controls;

namespace DuckTracker
{
public static class ContentDialogMaker
{
public static async void CreateContentDialog(ContentDialog Dialog, bool awaitPreviousDialog) { await CreateDialog(Dialog, awaitPreviousDialog); }
public static async Task CreateContentDialogAsync(ContentDialog Dialog, bool awaitPreviousDialog) { await CreateDialog(Dialog, awaitPreviousDialog); }

static async Task CreateDialog(ContentDialog Dialog, bool awaitPreviousDialog)
{
if (ActiveDialog != null)
{
if (awaitPreviousDialog)
{
await DialogAwaiter.Task;
DialogAwaiter = new TaskCompletionSource<bool>();
}
else ActiveDialog.Hide();
}
ActiveDialog = Dialog;
ActiveDialog.Closed += ActiveDialog_Closed;
await ActiveDialog.ShowAsync();
ActiveDialog.Closed -= ActiveDialog_Closed;
}

public static ContentDialog ActiveDialog;
static TaskCompletionSource<bool> DialogAwaiter = new TaskCompletionSource<bool>();
private static void ActiveDialog_Closed(ContentDialog sender, ContentDialogClosedEventArgs args) { DialogAwaiter.SetResult(true); }
}
}

我在 Button_Click() 中添加了 DoingStuff,这样可以防止出现错误消息,但我认为一定有更好的方法:

private async void Button_Click(object sender, RoutedEventArgs e)
{
if (DoingStuff == false)
{
DoingStuff = true;

bool canLogin = await CanLogin();

if (canLogin == false)
{
try
{

await AlertWithMessages("Fail", "Could not log in!", "ok");

}
catch (Exception ex)
{

var dialog = new Windows.UI.Popups.MessageDialog(ex.Message, "Error");
await dialog.ShowAsync();
}

}

DoingStuff = false;
}
}

最佳答案

一般情况下,当您启动登录方法时,您需要同时启用您的登录按钮,以避免多次点击。并且您的解决方案也可用,即在显示上一个对话框之前按钮将不起作用。

我创建了新的ContentDialogMaker。更多内容可以引用以下内容。

public static class ContentDialogMaker
{
public static async void CreateContentDialog(ContentDialog Dialog, bool awaitPreviousDialog) { await CreateDialog(Dialog, awaitPreviousDialog); }
public static async Task CreateContentDialogAsync(ContentDialog Dialog, bool awaitPreviousDialog) { await CreateDialog(Dialog, awaitPreviousDialog); }

static async Task CreateDialog(ContentDialog Dialog, bool awaitPreviousDialog)
{
if (ActiveDialog != null)
{
if (awaitPreviousDialog)
{
ActiveDialog.Hide();
}
else
{
switch (Info.Status)
{
case AsyncStatus.Started:
Info.Cancel();
break;
case AsyncStatus.Completed:
Info.Close();
break;
case AsyncStatus.Error:

break;
case AsyncStatus.Canceled:

break;
}
}
}
ActiveDialog = Dialog;
ActiveDialog.Closing += ActiveDialog_Closing;
Info = ActiveDialog.ShowAsync();
}
public static IAsyncInfo Info;
private static void ActiveDialog_Closing(ContentDialog sender, ContentDialogClosingEventArgs args)
{
ActiveDialog = null;
}

public static ContentDialog ActiveDialog;
}

唯一的区别是 ActiveDialogActiveDialog_Closing 事件处理程序方法中被清空。并且它可以确保之前的对话框在显示后会被清除。因此,只有一个 ContentDialog 会同时打开。

关于c# - 任何时候只能打开一个 ContentDialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50486830/

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