[英]Asynchronous custom Dialog in Windows Store App
是否可以在Windows Store應用程序中使用自定義內容創建模式對話框(異步)?
我知道您可以顯示“消息對話框”,但只能顯示一些文本和按鈕。 在我的應用程序中,我需要先填充一個組合框,然后讓用戶選擇其中一項,然后才能執行其余代碼。
我已經為非異步對話框找到了一些東西(附加了代碼)。 到現在為止,它運作良好。
但是,現在我需要再次與用戶確認所選設備是否正常,並且消息對話框顯示在帶有組合框的對話框上方。
是否有(簡單)方式“等待”我的第一個對話框的結果?
這是我用於ComboBox對話框的自定義彈出窗口的代碼:
public sealed partial class UsbSelectorPopup : UserControl {
public IList<DeviceInformation> deviceList { get; set; }
public int ChosenEntry { get; set; }
public UsbSelectorPopup(IList<DeviceInformation> deviceList) {
this.InitializeComponent();
this.deviceList = deviceList;
PopulateComboBox();
}
private void PopulateComboBox() {
...
}
public void OpenPopup() {
this.ParentPopup.IsOpen = true;
this.gdChild.Visibility = Visibility.Visible;
}
public void ClosePopup() {
this.ParentPopup.IsOpen = false;
this.gdChild.Visibility = Visibility.Collapsed;
}
private void ChooseUsbBtn_Click(object sender, RoutedEventArgs e) {
ChosenEntry = UsbComboBox.SelectedIndex;
ClosePopup();
}
private void CloseUsbBtn_Click(object sender, RoutedEventArgs e) {
ChosenEntry = 9999;
ClosePopup();
}
主頁中的呼叫:
// get all the USB Devices
var devices = ExamProvider.CustomStorageMedium.DeviceCollection;
// ask user which usb device to use
UsbSelectorPopup popup = new UsbSelectorPopup(devices);
popup.OpenPopup();
// get chosen device out of list
var chosenDevice = devices[popup.ChosenEntry];
// work with data on usb stick
[...]
// ask user if he wants to continue with this device or choose another one
var result = await MessageBox.ShowAsync("You chose usb stick XYZ with file ABC on it. Do you want to continue?", MessageBoxButton.OkCancel);
(MessageBox是用於調用MessageDialog的簡單Helper類)
感謝Nate Diamond,我知道我應該尋找的東西,所以我找到了這個答案: https : //stackoverflow.com/a/12861824/2660864
我對其進行了一些更改,令人驚訝的是現在可以使用了!
UsbSelectorPopup:
// Property
public TaskCompletionSource<int> UsbChosenTask { get; set; }
// in the constructor:
UsbChosenTask = new TaskCompletionSource<int>();
// In the Button Click Methods:
UsbChosenTask.TrySetResult(UsbComboBox.SelectedIndex);
電話:
UsbSelectorPopup popup = new UsbSelectorPopup(devices);
popup.OpenPopup();
var chosenEntry = await popup.UsbChosenTask.Task;
var chosenDevice = devices[popup.ChosenEntry];
XAML具有您想要的彈出控件。
<Popup x:Name="popup" IsOpen="True">
<Grid Width="{Binding ActualWidth, ElementName=popup, Mode=OneWay}"
Height="{Binding ActualHeight, ElementName=popup, Mode=OneWay}">
<!-- your content here -->
<Rectangle Fill="Red" Opacity=".25" />
</Grid>
</Popup>
在后面的代碼中,可以通過切換IsOpen屬性來使其打開和關閉。
說得通?
祝你好運。
一種簡單的方法是使用TaskCompletionSource。 這可以讓您做的是返回一個Task(可以是Task),該Task僅在您調用TaskCompletionSource.SetResult(T result)時才返回。 這意味着您可以完成所有異步處理並在完成處理后設置結果(或設置取消/錯誤)。
一個簡單的例子是:
private TaskCompletionSource<bool> taskCompletionSource;
private Task<bool> ShowAsync()
{
//Do Show Stuff
taskCompletionSource = new TaskCompletionSource<bool>();
return taskCompletionSource.Task;
}
private void Close()
{
//Do close stuff
taskCompletionSource.SetResult(true);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.