2017-01-02 47 views
0

我的应用程序使用ContentDialog作为插入数据的手段。换一种说法;数据表单是一个ContentDialog。在验证用户输入过程中,应用程序应通过使用MessageDialog向用户提示任何错误。但是,解雇MessageDialog也会解散ContentDialog。UWP阻止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 

} 

我应该怎么做,以防止警报从关闭父ContentDialog?

回答

2

当单击PrimaryButton或SecondaryButton时,ContentDialog自动关闭。要覆盖此行为,您必须将args.Cancel属性设置为true。而且由于ValidateForm是异步方法,因此您还需要延期,正如Raymond Chen所说。

所以,如果你不想关闭ContentDialog当MessageDialog已被证明,代码看起来在某种程度上是这样的:

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; 
} 
+2

您还需要考虑推迟对'ContentDialogBu​​ttonClickEventArgs'因为你直到异步操作完成后才设置'Cancel'。 –

+1

谢谢@RaymondChen。我已将它添加到示例代码中。 –