Files
29WxOrder/OrderSupportTicket/Views/OrderSupportTicketView.xaml.cs
T

107 lines
4.0 KiB
C#

using OrderSupportTicket.Models;
using OrderSupportTicket.Services;
using OrderSupportTicket.ViewModels;
using System;
using System.Windows;
using System.Windows.Controls;
namespace OrderSupportTicket.Views;
/// <summary>
/// 工单页面外壳,只负责组合子视图以及管理页面生命周期。
/// </summary>
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<string> { "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(); }
}