using System; using System.Collections.Generic; using Avalonia; using Avalonia.Controls; using Avalonia.Controls.Primitives; using Avalonia.Input; using Avalonia.Interactivity; using Avalonia.Layout; using Avalonia.Media; using Sln.Wcs.UI.ViewModels; namespace Sln.Wcs.UI.Views; public partial class MainWindow : Window { private readonly NavigationViewModel _navVm; private readonly List _openPopups = new(); public MainWindow(NavigationViewModel navigationVm) { InitializeComponent(); _navVm = navigationVm; DataContext = _navVm; _navVm.PageChanged += OnPageChanged; BuildMenu(); _navVm.LoadDefaultPage(); // 时钟 var timer = new System.Timers.Timer(1000); timer.Elapsed += (_, _) => Avalonia.Threading.Dispatcher.UIThread.Post(() => ClockText.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); timer.Start(); ClockText.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); // 退出按钮 LogoutBtn.Click += (_, _) => Close(); } private void BuildMenu() { MenuContainer.Children.Clear(); foreach (var item in _navVm.TopMenuItems) { var btn = new Button { Content = item.Label, Background = Brushes.Transparent, Foreground = Brush.Parse("#8B9BB5"), FontSize = 13, Padding = new Thickness(14, 12), Cursor = new Cursor(StandardCursorType.Hand), BorderThickness = new Thickness(0), }; if (item.Action != null) { btn.Click += (_, _) => item.Action(); } if (item.Children != null && item.Children.Count > 0) { var popup = new Popup { PlacementTarget = btn, Placement = PlacementMode.Bottom, IsLightDismissEnabled = false, }; var popupBorder = new Border { Background = Brush.Parse("#0F1620"), BorderBrush = Brush.Parse("#1A2F4A"), BorderThickness = new Thickness(1), CornerRadius = new CornerRadius(4), MinWidth = 160, }; var stack = new StackPanel { Margin = new Thickness(4) }; foreach (var sub in item.Children) { var subBtn = new Button { Content = sub.Label, Background = Brushes.Transparent, Foreground = Brush.Parse("#8B9BB5"), FontSize = 12, HorizontalAlignment = HorizontalAlignment.Stretch, HorizontalContentAlignment = HorizontalAlignment.Left, Padding = new Thickness(12, 8), BorderThickness = new Thickness(0), Cursor = new Cursor(StandardCursorType.Hand), }; subBtn.Click += (_, _) => { popup.Close(); sub.Action(); }; subBtn.PointerEntered += (_, _) => subBtn.Background = Brush.Parse("#1B3A5C"); subBtn.PointerExited += (_, _) => subBtn.Background = Brushes.Transparent; stack.Children.Add(subBtn); } popupBorder.Child = stack; popup.Child = popupBorder; // Hover 展开,离开按钮或 popup 时关闭 var closeTimer = new System.Timers.Timer(200) { AutoReset = false }; bool mouseInPopup = false; bool mouseInButton = false; popupBorder.PointerEntered += (_, _) => { mouseInPopup = true; closeTimer.Stop(); }; popupBorder.PointerExited += (_, _) => { mouseInPopup = false; TryClose(); }; btn.PointerEntered += (_, _) => { mouseInButton = true; closeTimer.Stop(); btn.Background = Brush.Parse("#1B3A5C"); btn.Foreground = Brush.Parse("#4FC3F7"); CloseAllPopups(); popup.Open(); }; btn.PointerExited += (_, _) => { mouseInButton = false; TryClose(); }; void TryClose() { closeTimer.Stop(); closeTimer.Start(); closeTimer.Elapsed += (_, _) => { Avalonia.Threading.Dispatcher.UIThread.Post(() => { if (!mouseInButton && !mouseInPopup) { popup.Close(); } }); }; } popup.Closed += (_, _) => { btn.Background = Brushes.Transparent; btn.Foreground = Brush.Parse("#8B9BB5"); }; _openPopups.Add(popup); } else { btn.PointerEntered += (_, _) => { btn.Background = Brush.Parse("#1B3A5C"); btn.Foreground = Brush.Parse("#4FC3F7"); }; btn.PointerExited += (_, _) => { btn.Background = Brushes.Transparent; btn.Foreground = Brush.Parse("#8B9BB5"); }; } MenuContainer.Children.Add(btn); } } private void CloseAllPopups() { foreach (var p in _openPopups) p.Close(); } private void OnPageChanged(Control? view) { if (view != null) { view.HorizontalAlignment = HorizontalAlignment.Stretch; view.VerticalAlignment = VerticalAlignment.Stretch; ContentArea.Child = view; } } }