2017-01-02 46 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。我已將它添加到示例代碼中。 –