public static async Task<string> Show([Localizable(false)] string url, Regex titleMatch,
string description, string title, string watermark = null, string toolTip = null,
bool multiline = false, bool passwordMode = false, int maxLength = -1, IEnumerable<string> suggestions = null, Window window = null,
CancellationToken cancellation = default(CancellationToken)) {
if (window == null) {
window = Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive) ?? Application.Current.MainWindow;
}
WindowsHelper.ViewInBrowser(url);
string code = null;
var waiting = true;
var ready = false;
EventHandler handler = async (sender, args) => {
if (!waiting) return;
waiting = false;
// ReSharper disable once AccessToModifiedClosure
code = await Prompt.ShowAsync(title, description, code, watermark, toolTip, multiline, passwordMode, false, maxLength, suggestions, cancellation);
ready = true;
};
window.Activated += handler;
for (var i = 0; i < 500 && waiting; i++) {
if (i > 0 && window.IsFocused) {
handler(null, null);
break;
}
if (code == null) {
code = GetOpenWindows()
.Select(x => titleMatch.Match(x.Value))
.FirstOrDefault(x => x.Success)?
.Groups.OfType<Group>().ElementAtOrDefault(1)?
.Value.Trim();
}
await Task.Delay(200, cancellation);
if (cancellation.IsCancellationRequested) {
window.Activated -= handler;
return null;
}
}
window.Activated -= handler;
for (var i = 0; i < 500 && !waiting && !ready; i++) {
await Task.Delay(200, cancellation);
if (cancellation.IsCancellationRequested) return null;
}
return string.IsNullOrWhiteSpace(code) ? null : code.Trim();
}