using System; using System.Threading.Tasks; using Avalonia; using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Controls.Primitives; using Avalonia.Data; using Avalonia.Interactivity; namespace LANCommander.Launcher.Views; public partial class AlertOverlay : UserControl { public event EventHandler? Closed; public AlertOverlay() { InitializeComponent(); } public AlertOverlay(string title, string message) : this() { TitleText.Text = title; MessageText.Text = message; } private void OK_Click(object? sender, RoutedEventArgs e) => Close(); private void Close() { var layer = OverlayLayer.GetOverlayLayer(this); Closed?.Invoke(this, EventArgs.Empty); layer?.Children.Remove(this); } /// /// Shows an alert overlay centered in the main window and waits for the user to dismiss it. /// public static async Task ShowAsync(string title, string message) { var tcs = new TaskCompletionSource(); await global::Avalonia.Threading.Dispatcher.UIThread.InvokeAsync(() => { var overlay = new AlertOverlay(title, message) { HorizontalAlignment = global::Avalonia.Layout.HorizontalAlignment.Stretch, VerticalAlignment = global::Avalonia.Layout.VerticalAlignment.Stretch, }; overlay.Closed += (_, _) => tcs.TrySetResult(true); var mainWindow = (Application.Current?.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime)?.MainWindow; var layer = OverlayLayer.GetOverlayLayer(mainWindow); if (layer is not null) { overlay.Bind(global::Avalonia.Layout.Layoutable.WidthProperty, new Binding("Bounds.Width") { Source = layer }); overlay.Bind(global::Avalonia.Layout.Layoutable.HeightProperty, new Binding("Bounds.Height") { Source = layer }); layer.Children.Add(overlay); } else { tcs.TrySetResult(false); } }); await tcs.Task; } }