106 lines
3.9 KiB
C#
106 lines
3.9 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,
|
|
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(); }
|
|
}
|