using OrderSupportTicket.Models; using OrderSupportTicket.Services; using OrderSupportTicket.ViewModels; using System; using System.Windows; using System.Windows.Controls; namespace OrderSupportTicket.Views; /// /// 工单页面外壳,只负责组合子视图以及管理页面生命周期。 /// public partial class OrderSupportTicketView : UserControl { private bool _active; private Window _hostWindow; public OrderSupportTicketView() : this(new TicketService(), CreateDefaultOptions()) { } public OrderSupportTicketView(TicketService ticketService, TicketClientOptions options = null) { InitializeComponent(); ViewModel = new OrderSupportTicketViewModel(ticketService, options ?? CreateDefaultOptions()); DataContext = ViewModel; Loaded += OnLoaded; Unloaded += OnUnloaded; } public static TicketClientOptions CreateDefaultOptions(string fallbackUserName = null) { var configured = TicketClientOptions.FromApplicationSettings(); var userName = !string.IsNullOrWhiteSpace(configured.UserName) ? configured.UserName : (!string.IsNullOrWhiteSpace(fallbackUserName) ? fallbackUserName.Trim() : "18990991234"); var appIds = configured.AppIds != null && configured.AppIds.Count > 0 ? configured.AppIds : new List { "wx316b1291351558aa", "wx7999743c3d64c05c" }; return new TicketClientOptions { UserName = userName, ConversationMode = configured.ConversationMode, AppIds = appIds, Orders = [ new TicketOrderOption { Amount = 109m, AppId = "wx316b1291351558aa", GoodsName = "梵客隆收腹内裤女新款高腰无痕磨毛暖融收小肚子提臀塑身平角裤", OrderId = "9000000000000000001", OrderedAt = new DateTime(2020, 1, 1) }, new TicketOrderOption { Amount = 109m, AppId = "wx7999743c3d64c05c", GoodsName = "洁柔抽纸粉Face家用实惠装批发纸巾大包面纸餐巾纸抽整箱可湿水纸", OrderId = "9000000000000000002", OrderedAt = new DateTime(2020, 1, 1) } ] }; } public OrderSupportTicketViewModel ViewModel { get; } public void Configure(TicketClientOptions options) => ViewModel.Configure(options); public void OpenNewTicket(TicketOrderOption order) => ViewModel.OpenNewTicket(order); public void OpenTicket(string appId, string wechatOrderId) => ViewModel.OpenTicket(appId, wechatOrderId); private async void OnLoaded(object sender, RoutedEventArgs e) { if (_active) return; _active = true; AttachHostWindow(Window.GetWindow(this)); UpdateWindowActiveState(); await ViewModel.InitializeAsync(); } private async void OnUnloaded(object sender, RoutedEventArgs e) { if (!_active) return; _active = false; ViewModel.IsWindowActive = false; DetachHostWindow(); await ViewModel.DeactivateAsync(); } private void AttachHostWindow(Window window) { DetachHostWindow(); _hostWindow = window; if (_hostWindow == null) return; _hostWindow.Activated += OnHostWindowStateChanged; _hostWindow.Deactivated += OnHostWindowStateChanged; _hostWindow.IsVisibleChanged += OnHostWindowIsVisibleChanged; _hostWindow.StateChanged += OnHostWindowStateChanged; _hostWindow.Closed += OnHostWindowClosed; } private void DetachHostWindow() { if (_hostWindow == null) return; _hostWindow.Activated -= OnHostWindowStateChanged; _hostWindow.Deactivated -= OnHostWindowStateChanged; _hostWindow.IsVisibleChanged -= OnHostWindowIsVisibleChanged; _hostWindow.StateChanged -= OnHostWindowStateChanged; _hostWindow.Closed -= OnHostWindowClosed; _hostWindow = null; } private void UpdateWindowActiveState() { ViewModel.IsWindowActive = _hostWindow != null && _hostWindow.IsVisible && _hostWindow.IsActive && _hostWindow.WindowState != WindowState.Minimized; } private void OnHostWindowStateChanged(object sender, EventArgs e) => UpdateWindowActiveState(); private void OnHostWindowIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) => UpdateWindowActiveState(); private void OnHostWindowClosed(object sender, EventArgs e) { ViewModel.IsWindowActive = false; DetachHostWindow(); } }