82 lines
2.8 KiB
C#
82 lines
2.8 KiB
C#
using DeviceEditModule.ViewModels;
|
||
using System.Runtime.InteropServices;
|
||
using System.Windows;
|
||
using System.Windows.Controls;
|
||
using System.Windows.Input;
|
||
using System.Windows.Interop;
|
||
|
||
namespace DeviceEditModule.Views
|
||
{
|
||
/// <summary>
|
||
/// DialogMangerView 代码后置。
|
||
/// 负责处理与 Window 相关的操作(最小化),ViewModel 通过事件通知,
|
||
/// 此处执行 P/Invoke,绕过 WPF 在 AllowsTransparency=True 时禁止
|
||
/// 直接设置 WindowState.Minimized 的限制。
|
||
/// </summary>
|
||
public partial class DialogMangerView : UserControl
|
||
{
|
||
#region P/Invoke
|
||
|
||
[DllImport("user32.dll")]
|
||
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
|
||
|
||
/// <summary>SW_MINIMIZE:最小化到任务栏。</summary>
|
||
private const int SW_MINIMIZE = 6;
|
||
/// <summary>SW_RESTORE:激活并显示窗口。如果窗口最小化或最大化,系统会将其还原到原始大小和位置。</summary>
|
||
private const int SW_RESTORE = 9;
|
||
#endregion
|
||
|
||
public DialogMangerView()
|
||
{
|
||
InitializeComponent();
|
||
|
||
// 在 Loaded 后订阅 ViewModel 的最小化请求事件
|
||
Loaded += (_, _) =>
|
||
{
|
||
if (DataContext is DialogMangerViewModel vm)
|
||
{
|
||
vm.MinimizeRequested += OnMinimizeRequested;
|
||
vm.RestoreRequested += OnRestoreRequested;
|
||
}
|
||
|
||
};
|
||
|
||
// 在 Unloaded 时取消订阅,防止内存泄漏
|
||
Unloaded += (_, _) =>
|
||
{
|
||
if (DataContext is DialogMangerViewModel vm)
|
||
{
|
||
vm.MinimizeRequested -= OnMinimizeRequested;
|
||
vm.RestoreRequested -= OnRestoreRequested;
|
||
}
|
||
|
||
};
|
||
}
|
||
private void OnRestoreRequested(object? sender, EventArgs e)
|
||
{
|
||
var window = Window.GetWindow(this);
|
||
if (window == null) return;
|
||
|
||
var hwnd = new WindowInteropHelper(window).EnsureHandle();
|
||
|
||
// 使用 Win32 API 强行恢复窗口,绕过 WPF 的 AllowsTransparency 限制
|
||
ShowWindow(hwnd, SW_RESTORE);
|
||
}
|
||
private void OnMinimizeRequested(object? sender, System.EventArgs e)
|
||
{
|
||
var window = Window.GetWindow(this);
|
||
if (window == null) return;
|
||
|
||
var hwnd = new WindowInteropHelper(window).EnsureHandle();
|
||
ShowWindow(hwnd, SW_MINIMIZE);
|
||
}
|
||
|
||
/// <summary>标题栏拖拽移动窗口。</summary>
|
||
private void MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
|
||
{
|
||
if (e.LeftButton == MouseButtonState.Pressed)
|
||
Window.GetWindow(this)?.DragMove();
|
||
}
|
||
}
|
||
}
|