网络上流传的无边框WPF窗体可以说是有点简陋了.如最大化后无法继续拖拽移动,最大化后遮住任务栏等.
我从外网上查询写了一个较为完整的无边框窗体设置.
窗口属性Xaml:
<Window x:Class="window.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:window"
MouseLeftButtonDown="Window_MouseLeftButtonDown"
mc:Ignorable="d"
MouseMove="OnMouseMove"
Background="{x:Null}"
ResizeMode="CanResize"
StateChanged="Window_StateChanged"
AllowsTransparency="True"
WindowStyle="None"
Height="450" Width="800"
WindowStartupLocation="CenterScreen">
窗口阴影Xaml:
<Grid x:Name="MainGrid">
<!--窗口阴影-->
<Border Name="WindowShadowBorder" Background="White" Margin="10">
<Border.Effect>
<DropShadowEffect BlurRadius="10" ShadowDepth="0" Color="Black"/>
</Border.Effect>
<Grid Name="ClientGrid" Margin="10" Opacity="1">
</Grid>
</Border>
</Grid>
窗口系统边框属性Xaml:
<WindowChrome.WindowChrome>
<WindowChrome GlassFrameThickness="0" ResizeBorderThickness="10" CaptionHeight="0" CornerRadius="0" />
</WindowChrome.WindowChrome>
后台代码:
private bool mRestoreForDragMove;
public MainWindow()
{
InitializeComponent();
//添加鼠标左键弹起重置状态缓存变量事件
this.MouseLeftButtonUp += (s, e) => { mRestoreForDragMove = false; };
}
private void Window_StateChanged(object sender, EventArgs e)
{
switch (this.WindowState)
{
case WindowState.Maximized:
this.MaxWidth = SystemParameters.WorkArea.Width + 16;
this.MaxHeight = SystemParameters.WorkArea.Height + 16;
this.BorderThickness = new Thickness(5); //最大化后需要调整
WindowShadowBorder.Margin = new Thickness(0);
break;
case WindowState.Normal:
this.BorderThickness = new Thickness(0);
WindowShadowBorder.Margin = new Thickness(10);
break;
}
}
private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (e.ClickCount == 2)
{
if (ResizeMode != ResizeMode.CanResize && ResizeMode != ResizeMode.CanResizeWithGrip) return;
WindowState = WindowState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized;
}
else
{
mRestoreForDragMove = WindowState == WindowState.Maximized;
DragMove();
}
}
private void OnMouseMove(object sender, MouseEventArgs e)
{
if (mRestoreForDragMove)
{
mRestoreForDragMove = false;
WindowState = WindowState.Normal;
var point = e.MouseDevice.GetPosition(this);
Left = point.X - ClientGrid.ActualWidth * point.X / SystemParameters.WorkArea.Width - WindowShadowBorder.Margin.Left;
Top = point.Y - ClientGrid.ActualHeight * point.Y / SystemParameters.WorkArea.Height - WindowShadowBorder.Margin.Top;
DragMove();
}
}