UWP 阻止 MessageDialog 关闭父 ContentDialog

Hai*_*uha 1 c# uwp

我的应用程序使用 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

}
Run Code Online (Sandbox Code Playgroud)

我应该怎么做才能防止警报关闭父级 ContentDialog?

Mar*_*ský 6

单击 PrimaryButton 或 secondaryButton 时,ContentDialog 将自动关闭。要覆盖此行为,您必须将该args.Cancel属性设置为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;
}
Run Code Online (Sandbox Code Playgroud)

  • 您还需要推迟“ContentDialogBu​​ttonClickEventArgs”,因为直到异步操作完成后才设置“Cancel”。 (3认同)