WPF如何封装一个可扩展的Window
前言
WPF中Window相信大家都很熟悉,有时我们有一些自定义需求默认Window是无法满足的,比如在标题栏上放一些自己东西,这个时候我们就需要写一个自己的Window,实现起来也很简单,只要给Window设置一个WindowChrome.WindowChrome附加属性就可以实现,WindowChrome 可以让你自定义窗口的非工作区的外观和行为。非工作区就是窗口的标题栏和边框,通常由操作系统绘制和管理。WindowChrome 可以让你将 WPF 的内容扩展到非工作区,同时保留一些系统的功能和行为,比如调整大小,移动,最大化,最小化等。
一、示例代码
1.1 基本使用
<local:CustomWindow x:Class="CustomWindowDemo.Window1" 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:local="clr-namespace:CustomWindowDemo" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Title="Window1" Width="800" Height="450" Icon="/logo.png" mc:Ignorable="d"> <Grid /> </local:CustomWindow>
1.2 自定义标题栏高度
<local:CustomWindow x:Class="CustomWindowDemo.Window1" 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:local="clr-namespace:CustomWindowDemo" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Title="Window1" Width="800" Height="450" CaptionHeight="35" Icon="/logo.png" mc:Ignorable="d"> <Grid /> </local:CustomWindow>
1.3 自定义标题栏颜色
<local:CustomWindow x:Class="CustomWindowDemo.Window1" 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:local="clr-namespace:CustomWindowDemo" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Title="Window1" Width="800" Height="450" CaptionBackground="Blue" Icon="/logo.png" mc:Ignorable="d"> <Grid /> </local:CustomWindow>
1.4 自定义标题栏内容
<local:CustomWindow x:Class="CustomWindowDemo.Window1" 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:local="clr-namespace:CustomWindowDemo" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Title="Window1" Width="800" Height="450" Icon="/logo.png" mc:Ignorable="d"> <local:CustomWindow.CaptionBarContent> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <Button Margin="5" Padding="2" VerticalAlignment="Center" Background="Transparent" BorderThickness="0" WindowChrome.IsHitTestVisibleInChrome="True"> <StackPanel Orientation="Horizontal"> <Polygon VerticalAlignment="Center" Fill="White" Points="0,6 6,0 6,12" /> <TextBlock Margin="4,0,0,0" VerticalAlignment="Center" FontSize="14" Foreground="White" Text="返回" /> </StackPanel> </Button> <TextBlock Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="14" Foreground="White" Text="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=Title}" /> <Button Grid.Column="2" Margin="5" Padding="2" VerticalAlignment="Center" Background="Transparent" BorderThickness="0" FontSize="14" Foreground="White" WindowChrome.IsHitTestVisibleInChrome="True"> <StackPanel Orientation="Horizontal"> <TextBlock Margin="0,0,4,0" VerticalAlignment="Center" Text="Admin" /> <Polyline VerticalAlignment="Center" Points="0,0 5,5 10,0" Stroke="White" StrokeThickness="2" /> </StackPanel> </Button> </Grid> </local:CustomWindow.CaptionBarContent> <Grid /> </local:CustomWindow>
二、综合案例
如需以上代码,请到群共享文件中下载
技术交流群
![](https://img2024.cnblogs.com/blog/2842690/202403/2842690-20240327111823344-1546827137.png)
联系方式
![](https://img2024.cnblogs.com/blog/2842690/202403/2842690-20240327111902059-153684030.png)