<Window x:Class="WpfApp1.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:WpfApp1"
mc:Ignorable="d"
Title="MainWindow" Height="444" Width="586"
WindowStyle="None"
>
<WindowChrome.WindowChrome>
<WindowChrome GlassFrameThickness="1"
ResizeBorderThickness="6"
CaptionHeight="30"
CornerRadius="0"/>
</WindowChrome.WindowChrome>
<Window.Resources>
<Style x:Key="TitleBarButtonStyle" TargetType="Button">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Width" Value="45"/>
<Setter Property="Height" Value="30"/>
<Setter Property="Foreground" Value="#333333"/>
<Setter Property="WindowChrome.IsHitTestVisibleInChrome" Value="True"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border x:Name="border" Background="{TemplateBinding Background}" BorderThickness="0">
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#E5E5E5"/>
</Trigger>
</Style.Triggers>
</Style>
<Style x:Key="CloseButtonStyle" TargetType="Button" BasedOn="{StaticResource TitleBarButtonStyle}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#E81123"/>
<Setter Property="Foreground" Value="White"/>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<Grid.Style>
<Style TargetType="Grid">
<Setter Property="Margin" Value="0"/>
<Style.Triggers>
<DataTrigger Binding="{Binding WindowState, RelativeSource={RelativeSource AncestorType=Window}}" Value="Maximized">
<Setter Property="Margin" Value="6"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0" Background="#F3F3F3">
<TextBlock Text="我的无边框窗口" VerticalAlignment="Center" Margin="15,0,0,0" Foreground="#333333" FontWeight="SemiBold"/>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
<Button x:Name="BtnTopmost" Content="📌" Style="{StaticResource TitleBarButtonStyle}" Click="TopmostButton_Click" ToolTip="窗口置顶"/>
<Button Content="─" Style="{StaticResource TitleBarButtonStyle}" Click="MinimizeButton_Click"/>
<Button x:Name="BtnMaximize" Content="🗖" Style="{StaticResource TitleBarButtonStyle}" Click="MaximizeButton_Click"/>
<Button Content="✕" Style="{StaticResource CloseButtonStyle}" Click="CloseButton_Click"/>
</StackPanel>
</Grid>
<Grid Grid.Row="1">
<TextBlock Text="控制功能已全部就绪!" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="18" Foreground="#666666"/>
</Grid>
</Grid>
</Window>
NET10.0,后端代码实现:
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfApp1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// 监听窗口状态改变事件(比如用户双击标题栏最大化时,我们也需要同步更新按钮图标)
StateChanged += MainWindow_StateChanged;
}
// 1. 置顶 / 取消置顶
private void TopmostButton_Click(object sender, RoutedEventArgs e)
{
// 切换置顶状态
this.Topmost = !this.Topmost;
// 根据状态修改按钮背景色或提示,给用户正向反馈
if (this.Topmost)
{
BtnTopmost.Background = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(218, 218, 218));
BtnTopmost.ToolTip = "取消置顶";
}
else
{
BtnTopmost.Background = System.Windows.Media.Brushes.Transparent;
BtnTopmost.ToolTip = "窗口置顶";
}
}
// 2. 最小化
private void MinimizeButton_Click(object sender, RoutedEventArgs e)
{
this.WindowState = WindowState.Minimized;
}
// 3. 最大化 / 还原
private void MaximizeButton_Click(object sender, RoutedEventArgs e)
{
if (this.WindowState == WindowState.Maximized)
{
this.WindowState = WindowState.Normal;
}
else
{
this.WindowState = WindowState.Maximized;
}
}
// 4. 关闭窗口
private void CloseButton_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
// 自动同步:当用户双击标题栏放大/缩小窗口时,同步更新最大化按钮的文本图标
private void MainWindow_StateChanged(object sender, System.EventArgs e)
{
if (this.WindowState == WindowState.Maximized)
{
BtnMaximize.Content = "🗗"; // 还原图标
}
else
{
BtnMaximize.Content = "🗖"; // 最大化图标
}
}
}
}
效果图:


发表回复