| 1 | using Avalonia; |
| 2 | using Avalonia.Controls; |
| 3 | using Avalonia.Layout; |
| 4 | using Avalonia.Media; |
| 5 | |
| 6 | namespace CascadeIDE.Views; |
| 7 | |
| 8 | /// <summary>Модальное окно ввода PID для attach (без XAML — как остальные простые диалоги MainWindow).</summary> |
| 9 | internal static class AttachProcessPidDialog |
| 10 | { |
| 11 | public static async Task<int?> ShowAsync(Window owner) |
| 12 | { |
| 13 | var dialog = new Window |
| 14 | { |
| 15 | Title = "Присоединиться к процессу", |
| 16 | Width = 420, |
| 17 | Height = 160, |
| 18 | CanResize = false, |
| 19 | WindowStartupLocation = WindowStartupLocation.CenterOwner |
| 20 | }; |
| 21 | |
| 22 | var box = new TextBox { PlaceholderText = "PID (целое число)", Margin = new Thickness(0, 0, 0, 8) }; |
| 23 | int? result = null; |
| 24 | |
| 25 | var ok = new Button { Content = "OK", MinWidth = 90 }; |
| 26 | var cancel = new Button { Content = "Отмена", MinWidth = 90 }; |
| 27 | ok.Click += (_, _) => |
| 28 | { |
| 29 | if (int.TryParse(box.Text?.Trim(), out var pid) && pid > 0) |
| 30 | result = pid; |
| 31 | dialog.Close(); |
| 32 | }; |
| 33 | cancel.Click += (_, _) => dialog.Close(); |
| 34 | |
| 35 | dialog.Content = new StackPanel |
| 36 | { |
| 37 | Margin = new Thickness(16), |
| 38 | Spacing = 12, |
| 39 | Children = |
| 40 | { |
| 41 | new TextBlock { Text = "Введите PID процесса .NET:", TextWrapping = TextWrapping.Wrap }, |
| 42 | box, |
| 43 | new StackPanel |
| 44 | { |
| 45 | Orientation = Orientation.Horizontal, |
| 46 | HorizontalAlignment = HorizontalAlignment.Right, |
| 47 | Spacing = 10, |
| 48 | Children = { ok, cancel } |
| 49 | } |
| 50 | } |
| 51 | }; |
| 52 | |
| 53 | await dialog.ShowDialog(owner); |
| 54 | return result; |
| 55 | } |
| 56 | } |
| 57 | |