C# UWP阻止MessageDialog关闭父ContentDialog

C# UWP阻止MessageDialog关闭父ContentDialog,c#,uwp,C#,Uwp,我的应用程序使用ContentDialog作为插入数据的手段。换言之;数据表单是一个ContentDialog。在验证用户输入期间,应用程序应使用MessageDialog向用户提示任何错误。但是,取消MessageDialog也将取消ContentDialog 以下是显示警报时的代码块: private void ContentDialog_PrimaryButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs ar

我的应用程序使用ContentDialog作为插入数据的手段。换言之;数据表单是一个ContentDialog。在验证用户输入期间,应用程序应使用MessageDialog向用户提示任何错误。但是,取消MessageDialog也将取消ContentDialog

以下是显示警报时的代码块:

private void ContentDialog_PrimaryButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs args)
{
    //save item
    ValidateForm();
}

private void ContentDialog_SecondaryButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs args)
{
}

private async void ValidateForm()
{
    //Ensure all fields are filled
    String barcode = BarcodeText.Text.Trim();
    String desc = DescText.Text.Trim();
    String cost = CostText.Text.Trim();
    String price = PriceText.Text.Trim();
    String stock = StockText.Text.Trim();

    if(barcode.Equals(String.Empty) || desc.Equals(String.Empty) ||
            desc.Equals(String.Empty) || cost.Equals(String.Empty) || 
            price.Equals(String.Empty) || stock.Equals(String.Empty))
    {
        var dialog = new MessageDialog("Please fill in all fields");
        await dialog.ShowAsync();
        return;
    }
    //check uniqueness of the barcode

}

如何防止警报关闭父内容对话框?

单击PrimaryButton或SecondaryButton时,内容对话框将自动关闭。要覆盖此行为,必须将属性设置为
true
。由于
ValidateForm
是一种异步方法,您还需要像Raymond Chen所说的那样延迟

因此,如果您不想在显示MessageDialog时关闭ContentDialog,那么代码将如下所示:

private async void ContentDialog_PrimaryButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs args)
{
    //save item
    var deferral = args.GetDeferral()
    args.Cancel = await ValidateForm();
    deferral.Complete();
}

private void ContentDialog_SecondaryButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs args)
{
}

// Returns true if the MessageDialog was shown, otherwise false
private async Task<bool> ValidateForm()
{
    //Ensure all fields are filled
    String barcode = BarcodeText.Text.Trim();
    String desc = DescText.Text.Trim();
    String cost = CostText.Text.Trim();
    String price = PriceText.Text.Trim();
    String stock = StockText.Text.Trim();

    if(barcode.Equals(String.Empty) || desc.Equals(String.Empty) ||
            desc.Equals(String.Empty) || cost.Equals(String.Empty) || 
            price.Equals(String.Empty) || stock.Equals(String.Empty))
    {
        var dialog = new MessageDialog("Please fill in all fields");
        await dialog.ShowAsync();
        return true;
    }
    //check uniqueness of the barcode
    return false;
}
private async void ContentDialog\u PrimaryButtonClick(ContentDialog发送方,ContentDialogButtonClickEventArgs参数)
{
//保存项目
var deferral=args.GetDeferral()
args.Cancel=等待ValidateForm();
延迟。完成();
}
私有void ContentDialog\u secondary按钮单击(ContentDialog发送方,ContentDialogButtonClickEventArgs参数)
{
}
//如果显示MessageDialog,则返回true,否则返回false
专用异步任务ValidateForm()
{
//确保所有字段都已填写
String barcode=BarcodeText.Text.Trim();
String desc=DescText.Text.Trim();
字符串成本=CostText.Text.Trim();
字符串price=PriceText.Text.Trim();
字符串stock=StockText.Text.Trim();
if(条形码.Equals(String.Empty)| desc.Equals(String.Empty)||
desc.Equals(String.Empty)| cost.Equals(String.Empty)|
price.Equals(String.Empty)| stock.Equals(String.Empty))
{
var dialog=newmessagedialog(“请填写所有字段”);
wait dialog.ShowAsync();
返回true;
}
//检查条形码的唯一性
返回false;
}

单击PrimaryButton或SecondaryButton时,ContentDialog将自动关闭。要覆盖此行为,必须将属性设置为
true
。由于
ValidateForm
是一种异步方法,您还需要像Raymond Chen所说的那样延迟

因此,如果您不想在显示MessageDialog时关闭ContentDialog,那么代码将如下所示:

private async void ContentDialog_PrimaryButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs args)
{
    //save item
    var deferral = args.GetDeferral()
    args.Cancel = await ValidateForm();
    deferral.Complete();
}

private void ContentDialog_SecondaryButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs args)
{
}

// Returns true if the MessageDialog was shown, otherwise false
private async Task<bool> ValidateForm()
{
    //Ensure all fields are filled
    String barcode = BarcodeText.Text.Trim();
    String desc = DescText.Text.Trim();
    String cost = CostText.Text.Trim();
    String price = PriceText.Text.Trim();
    String stock = StockText.Text.Trim();

    if(barcode.Equals(String.Empty) || desc.Equals(String.Empty) ||
            desc.Equals(String.Empty) || cost.Equals(String.Empty) || 
            price.Equals(String.Empty) || stock.Equals(String.Empty))
    {
        var dialog = new MessageDialog("Please fill in all fields");
        await dialog.ShowAsync();
        return true;
    }
    //check uniqueness of the barcode
    return false;
}
private async void ContentDialog\u PrimaryButtonClick(ContentDialog发送方,ContentDialogButtonClickEventArgs参数)
{
//保存项目
var deferral=args.GetDeferral()
args.Cancel=等待ValidateForm();
延迟。完成();
}
私有void ContentDialog\u secondary按钮单击(ContentDialog发送方,ContentDialogButtonClickEventArgs参数)
{
}
//如果显示MessageDialog,则返回true,否则返回false
专用异步任务ValidateForm()
{
//确保所有字段都已填写
String barcode=BarcodeText.Text.Trim();
String desc=DescText.Text.Trim();
字符串成本=CostText.Text.Trim();
字符串price=PriceText.Text.Trim();
字符串stock=StockText.Text.Trim();
if(条形码.Equals(String.Empty)| desc.Equals(String.Empty)||
desc.Equals(String.Empty)| cost.Equals(String.Empty)|
price.Equals(String.Empty)| stock.Equals(String.Empty))
{
var dialog=newmessagedialog(“请填写所有字段”);
wait dialog.ShowAsync();
返回true;
}
//检查条形码的唯一性
返回false;
}

您还需要延迟
ContentDialogButtonClickEventArgs
,因为在异步操作完成之前,您不会设置
Cancel
。谢谢@RaymondChen。我已将其添加到示例代码中。您还需要延迟
ContentDialogButtonClickEventArgs
,因为在异步操作完成之前,您不会设置
Cancel
。谢谢@RaymondChen。我已将其添加到示例代码中。