簡體   English   中英

Windows Store App中的異步自定義對話框

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM