下面给出代码简单说明:
- 第一个
div充做窗体的标题栏区域,注册了双击事件调用窗体最大化(还原)方法、鼠标按下与释放调用窗体的移动开始与结束方法; - 在第一个
div里,其中有3个按钮,即窗体的控制按钮,调用窗体最小化、最大化(还原)、关闭方法调用; - 另有两个按钮,演示单击调用
JavaScript的alert方法弹出消息 。

文章插图
运行效果如下:

文章插图
实现这个效果,还有一些代码:
- 上面的代码调用了一些方法实现窗体操作最小化、关闭等,代码如下;
- 因为是
Razor组件,即html实现的界面,界面的html元素也定义了一些css样式,代码也一并给出 。 - 标题栏的按钮使用了一些
svg图片,在仓库里,可自行获取 。
首先添加
Nuget包Simplify.Windows.Forms,用于获取鼠标光标的位置:<PackageReference Include="Simplify.Windows.Forms" Version="1.1.2" />添加窗体帮助类:Services\WindowService.csusing System;using System.Linq;using System.Windows;using System.Windows.Forms;using System.Windows.Threading;using Application = System.Windows.Application;namespace WPFBlazorChat.Services;public class WindowService{private static bool _isMoving;private static double _startMouseX;private static double _startMouseY;private static double _startWindLeft;private static double _startWindTop;public static void Init(){DispatcherTimer dispatcherTimer = new();dispatcherTimer.Tick += UpdateWindowPos;dispatcherTimer.Interval = TimeSpan.FromMilliseconds(17);dispatcherTimer.Start();}public static void StartMove(){_isMoving = true;_startMouseX = GetX();_startMouseY = GetY();var window = GetActiveWindow();if (window == null){return;}_startWindLeft = window.Left;_startWindTop = window.Top;}public static void StopMove(){_isMoving = false;}public static void Minimize(){var window = GetActiveWindow();if (window != null){window.WindowState = WindowState.Minimized;}}public static void Maximize(){var window = GetActiveWindow();if (window != null){window.WindowState =window.WindowState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized;}}public static bool IsMaximized(){var window = GetActiveWindow();if (window != null){return window.WindowState == WindowState.Maximized;}return false;}public static void Close(bool allWindow = false){if (allWindow){Application.Current?.Shutdown();return;}var window = GetActiveWindow();if (window != null){window.Close();}}private static void UpdateWindowPos(object? sender, EventArgs e){if (!_isMoving){return;}double moveX = GetX() - _startMouseX;double moveY = GetY() - _startMouseY;Window? window = GetActiveWindow();if (window == null){return;}window.Left = _startWindLeft + moveX;window.Top = _startWindTop + moveY;}private static int GetX(){return Control.MousePosition.X;}private static int GetY(){return Control.MousePosition.Y;}private static Window? GetActiveWindow(){return Application.Current.Windows.Cast<Window>().FirstOrDefault(currentWindow => currentWindow.IsActive);}}上面的代码用于窗体的最小化、最大化(还原)、关闭等实现,需要在Razor组件里正确的调用这些方法:Counter.razor组件的OnInitialized初始化生命周期方法里调用WindowService.Init();,如上代码,这个方法开启定时器,定时调用UpdateWindowPos方法检查鼠标是否按下,如果按下,检查间隔内窗体的位置变化范围,然后修改窗体位置,从而实现窗体位置移动(移动窗体无法使用WPF的经验总结扩展阅读
- 高铁能带1000ml的洗发水吗
- 宽带网络电视怕打雷吗
- 藕粉颗粒状的好还是粉状的
- 裙带菜泡发后可以直接吃吗
- 水质检测多少数值合格
- 蛋糕粉做馒头要不要加酵母
- 钠钙玻璃杯能倒开水吗
- 洗衣机怎么清理里面的脏东西
- 五仁馅料怎么做更松软
- 煮带壳花生放什么调料
