简介
在绘制界面时,往往需要自定义窗体的封装,下面是实现自定义窗体的方式。
效果
-
窗体
ResizeMode="CanResize"
-
窗体
ResizeMode="NoResize"
代码实现
1. 重写Button
按钮类
namespace CustomWindows.CustomControls
{
#region WindowButtonBase
public class WindowButtonBase : System.Windows.Controls.Button
{
static WindowButtonBase()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(WindowButtonBase),
new FrameworkPropertyMetadata(typeof(WindowButtonBase)));
}
}
#endregion
#region WindowButtonMin
public class WindowButtonMin : WindowButtonBase
{
protected override void OnClick()
{
Window win = Window.GetWindow(this);
if (win.WindowState != WindowState.Minimized)
win.WindowState = WindowState.Minimized;
base.OnClick();
}
}
#endregion
#region WindowButtonMax
public class WindowButtonMax : WindowButtonBase
{
protected override void OnClick()
{
Window win = Window.GetWindow(this);
if (win.WindowState != WindowState.Maximized)
win.WindowState = WindowState.Maximized;
base.OnClick();
}
}
#endregion
#region WindowButtonNormal
public class WindowButtonNormal : WindowButtonBase
{
protected override void OnClick()
{
Window win = Window.GetWindow(this);
if (win.WindowState != WindowState.Normal)
win.WindowState = WindowState.Normal;
base.OnClick();
}
}
#endregion
#region WindowButtonClose
public class WindowButtonClose : WindowButtonBase
{
protected override void OnClick()
{
Window win = Window.GetWindow(this);
win.Close();
base.OnClick();
}
}
#endregion
}
2. 自定义CustomWindowBase.xaml
样式
- 写入 最小化,最大化,还原,关闭 按钮样式,以最小化为例:
<!--最小化按钮-->
<Style x:Key="win_min_button_style" TargetType="win:WindowButtonMin">
<Style.Setters>
<Setter Property="Margin" Value="2"/>
<Setter Property="Width" Value="20"/>
<Setter Property="Height" Value="20"/>
<Setter Property="WindowChrome.IsHitTestVisibleInChrome" Value="True"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Grid>
<Border x:Name="border" Background="{StaticResource win_min_button}"/>
<ContentPresenter/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="Button.IsMouseOver" Value="true">
<Setter TargetName="border" Property="Background" Value="{StaticResource win_min_button_hover}"/>
</Trigger>
<Trigger Property="Button.IsPressed" Value="true">
<Setter TargetName="border" Property="Background" Value="{StaticResource win_min_button_pressed}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style.Setters>
</Style>
- 写入 主窗体 样式
<!--主窗体样式-->
<Style TargetType="Window" x:Key="custom_window_base">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}"/>
<Setter Property="BorderBrush" Value="White"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="WindowStyle" Value="SingleBorderWindow"/>
<Setter Property="WindowChrome.WindowChrome">
<Setter.Value>
<WindowChrome CornerRadius="0"
GlassFrameThickness="1"
UseAeroCaptionButtons="False"
NonClientFrameEdges="None" />
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Window">
<Border x:Name="main_border"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Grid x:Name="main_grid"
Background="{TemplateBinding BorderBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<DockPanel Background="LightBlue"
Height="26.4">
<StackPanel DockPanel.Dock="Left" Orientation="Horizontal">
<Image VerticalAlignment="Center"
Margin="7,0,7,0"
Source="{TemplateBinding Icon}"
Height="{x:Static SystemParameters.SmallIconHeight}"
Width="{x:Static SystemParameters.SmallIconWidth}"/>
<ContentControl Foreground="White"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="{DynamicResource {x:Static SystemFonts.CaptionFontSize}}"
Content="{TemplateBinding Title}"/>
</StackPanel>
<StackPanel DockPanel.Dock="Right" Orientation="Horizontal">
<win:WindowButtonMin x:Name="win_min_button" Style="{StaticResource win_min_button_style}"/>
<win:WindowButtonNormal x:Name="win_normal_button" Style="{StaticResource win_normal_button_style}"/>
<win:WindowButtonMax x:Name="win_max_button" Style="{StaticResource win_max_button_style}"/>
<win:WindowButtonClose x:Name="win_close_button" Style="{StaticResource win_close_button_style}"/>
</StackPanel>
<ContentPresenter/>
</DockPanel>
<AdornerDecorator Grid.Row="1">
<ContentPresenter/>
</AdornerDecorator>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="WindowState" Value="Maximized">
<Setter TargetName="win_normal_button" Property="Visibility" Value="Visible"/>
<Setter TargetName="win_max_button" Property="Visibility" Value="Collapsed"/>
<Setter TargetName="main_grid" Property="Margin" Value="7"/>
</Trigger>
<Trigger Property="WindowState" Value="Normal">
<Setter TargetName="win_normal_button" Property="Visibility" Value="Collapsed"/>
<Setter TargetName="win_max_button" Property="Visibility" Value="Visible"/>
</Trigger>
<Trigger Property="ResizeMode" Value="NoResize">
<Setter TargetName="win_normal_button" Property="Visibility" Value="Collapsed"/>
<Setter TargetName="win_max_button" Property="Visibility" Value="Collapsed"/>
<Setter TargetName="win_min_button" Property="Visibility" Value="Collapsed"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
3. MainWindow
窗体的引用
<Window x:Class="CustomWindows.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:CustomWindows"
mc:Ignorable="d"
Icon="Resources/images/win_logo.png"
Title="自定义窗体"
Height="300" Width="300"
WindowStartupLocation="CenterScreen"
Style="{StaticResource custom_window_base}"
ResizeMode="CanResize">
<Grid>
</Grid>
</Window>
设置 ResizeMode="NoResize"
可实现窗体不可拉伸的效果。
源码下载
修改
修改 custom_window_base
样式:
<AdornerDecorator Grid.Row="1">
<ContentPresenter/>
</AdornerDecorator>
将其修改为
<Border Grid.Row="1">
<AdornerDecorator>
<ContentPresenter/>
</AdornerDecorator>
</Border>