当前位置: 首页 > news >正文

从零开始编写一个办公软件(一、自定义窗口)

创建WPF项目,记得把“将解决方案和项目放在同一目录中”给取消掉,因为后续有其他同级项目。
image
自定义窗口第一步当然是干掉默认的窗口样式啦,Win11简单的设置WindowChrome就可以了,但我印象中Win10要复杂点,不过我懒得开Win10看了,要是不对就自己上网查吧。

<WindowChrome.WindowChrome><WindowChrome CaptionHeight="48" UseAeroCaptionButtons="False" CornerRadius="8"/>
</WindowChrome.WindowChrome>

特别注意的是,用这个办法取消窗口固定样式会有一个小毛病————窗口最大化时会有一部分超出屏幕,解决的办法是给最外层的Grid容器添加触发器:

<Style x:Key="WindowContentGridStyle" TargetType="Grid"><Setter Property="Background" Value="#333"/><Style.Triggers><!--最大化时会有一部分超出屏幕--><DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Window,Mode=FindAncestor},Path=WindowState}" Value="{x:Static WindowState.Maximized}"><Setter Property="Margin" Value="7"/></DataTrigger></Style.Triggers>
</Style>

设置完WindowChrome后,右上角那三个按钮会被窗口里的内容盖住,最好重新写三个按钮覆盖在上边,这是我写的样式,参考一下。

<Style x:Key="WindowTopButtonBaseStyle" TargetType="Button"><Setter Property="Height" Value="30"/><Setter Property="Width" Value="45"/><Setter Property="WindowChrome.IsHitTestVisibleInChrome" Value="True"/><Setter Property="Background" Value="#01FFFFFF"/><Style.Triggers><Trigger Property="IsMouseOver" Value="True"><Setter Property="Background" Value="#33FFFFFF"/></Trigger></Style.Triggers>
</Style>
<Style x:Key="WindowMinButtonStyle" TargetType="Button" BasedOn="{StaticResource WindowTopButtonBaseStyle}"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="Button"><Grid Background="{TemplateBinding Background}"><Path Data="M0,0 12,0" Stroke="#efefef" StrokeThickness="2"StrokeEndLineCap="Round" StrokeStartLineCap="Round"HorizontalAlignment="Center" VerticalAlignment="Center"/></Grid></ControlTemplate></Setter.Value></Setter>
</Style>
<Style x:Key="WindowMaxButtonStyle" TargetType="Button" BasedOn="{StaticResource WindowTopButtonBaseStyle}"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="Button"><Grid Background="{TemplateBinding Background}"><Path Data="M0,0 12,0 12,10 0,10 z" Stroke="#efefef" StrokeThickness="1.5"StrokeEndLineCap="Round" StrokeStartLineCap="Round"HorizontalAlignment="Center" VerticalAlignment="Center" x:Name="path"/></Grid><ControlTemplate.Triggers><DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Window,Mode=FindAncestor},Path=WindowState}" Value="{x:Static WindowState.Maximized}"><Setter TargetName="path" Property="Data" Value="M0,3 0,12 9,12 9,3 z M3,3 3,0 12,0 12,9 9,9"/></DataTrigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter>
</Style>
<Style x:Key="WindowCloseButtonStyle" TargetType="Button" BasedOn="{StaticResource WindowTopButtonBaseStyle}"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="Button"><Grid Background="{TemplateBinding Background}"><Path Data="M0,0 12,12 M12,0 0,12" Stroke="#efefef" StrokeThickness="1.5"StrokeEndLineCap="Round" StrokeStartLineCap="Round"HorizontalAlignment="Center" VerticalAlignment="Center"/></Grid></ControlTemplate></Setter.Value></Setter>
</Style>

接下来调用一下就可以了。

最后贴一下全部的代码,从这里往下都不需要看了。
ButtonStyles.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><!--#region 窗口按钮--><Style x:Key="WindowTopButtonBaseStyle" TargetType="Button"><Setter Property="Height" Value="30"/><Setter Property="Width" Value="45"/><Setter Property="WindowChrome.IsHitTestVisibleInChrome" Value="True"/><Setter Property="Background" Value="#01FFFFFF"/><Style.Triggers><Trigger Property="IsMouseOver" Value="True"><Setter Property="Background" Value="#33FFFFFF"/></Trigger></Style.Triggers></Style><Style x:Key="WindowMinButtonStyle" TargetType="Button" BasedOn="{StaticResource WindowTopButtonBaseStyle}"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="Button"><Grid Background="{TemplateBinding Background}"><Path Data="M0,0 12,0" Stroke="#efefef" StrokeThickness="2"StrokeEndLineCap="Round" StrokeStartLineCap="Round"HorizontalAlignment="Center" VerticalAlignment="Center"/></Grid></ControlTemplate></Setter.Value></Setter></Style><Style x:Key="WindowMaxButtonStyle" TargetType="Button" BasedOn="{StaticResource WindowTopButtonBaseStyle}"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="Button"><Grid Background="{TemplateBinding Background}"><Path Data="M0,0 12,0 12,10 0,10 z" Stroke="#efefef" StrokeThickness="1.5"StrokeEndLineCap="Round" StrokeStartLineCap="Round"HorizontalAlignment="Center" VerticalAlignment="Center" x:Name="path"/></Grid><ControlTemplate.Triggers><DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Window,Mode=FindAncestor},Path=WindowState}" Value="{x:Static WindowState.Maximized}"><Setter TargetName="path" Property="Data" Value="M0,3 0,12 9,12 9,3 z M3,3 3,0 12,0 12,9 9,9"/></DataTrigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter></Style><Style x:Key="WindowCloseButtonStyle" TargetType="Button" BasedOn="{StaticResource WindowTopButtonBaseStyle}"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="Button"><Grid Background="{TemplateBinding Background}"><Path Data="M0,0 12,12 M12,0 0,12" Stroke="#efefef" StrokeThickness="1.5"StrokeEndLineCap="Round" StrokeStartLineCap="Round"HorizontalAlignment="Center" VerticalAlignment="Center"/></Grid></ControlTemplate></Setter.Value></Setter></Style><!--#endregion-->
</ResourceDictionary>

GridStyles.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><Style x:Key="WindowContentGridStyle" TargetType="Grid"><Setter Property="Background" Value="#333"/><Style.Triggers><!--最大化时会有一部分超出屏幕--><DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Window,Mode=FindAncestor},Path=WindowState}" Value="{x:Static WindowState.Maximized}"><Setter Property="Margin" Value="7"/></DataTrigger></Style.Triggers></Style>
</ResourceDictionary>

MainWindow.xaml

<Window x:Class="LkWork.WPF.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:LkWork.WPF"mc:Ignorable="d" WindowStartupLocation="CenterScreen"Title="MainWindow" Height="640" Width="960"><Window.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="pack://application:,,,/LkWork.WPF;component/Resources/Styles/ButtonStyles.xaml"/><ResourceDictionary Source="pack://application:,,,/LkWork.WPF;component/Resources/Styles/GridStyles.xaml"/></ResourceDictionary.MergedDictionaries></ResourceDictionary></Window.Resources><WindowChrome.WindowChrome><WindowChrome CaptionHeight="48" UseAeroCaptionButtons="False" CornerRadius="8"/></WindowChrome.WindowChrome><Grid Style="{StaticResource WindowContentGridStyle}"><Border Margin="0 48 0 0"/><StackPanel Panel.ZIndex="999" Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Top"><Button Style="{StaticResource WindowMinButtonStyle}" Click="Min_Click"/><Button Style="{StaticResource WindowMaxButtonStyle}" Click="Max_Click"/><Button Style="{StaticResource WindowCloseButtonStyle}" Click="Close_Click"/></StackPanel></Grid>
</Window>

MainWindow.xaml.cs

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 LkWork.WPF
{/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}private void Close_Click(object sender, RoutedEventArgs e){SystemCommands.CloseWindow(this);}private void Min_Click(object sender, RoutedEventArgs e){SystemCommands.MinimizeWindow(this);}private void Max_Click(object sender, RoutedEventArgs e){if (WindowState == WindowState.Maximized) SystemCommands.RestoreWindow(this);else SystemCommands.MaximizeWindow(this);}}
}
http://www.hskmm.com/?act=detail&tid=40716

相关文章:

  • 团队博客2:描述团队的每个人如何使用 AI 来高效完成团队任务的
  • 2025年国型钢厂家/工厂排名前十:江苏华力冷弯型钢领跑行业
  • Optuna AutoSampler 更新:让多目标和约束优化不再需要手动选算法
  • 洛谷 P11104 [ROI 2023] 监控 (Day 1) 题解
  • 回答博客一的提问,与收获
  • 算空间时间 - Slayer
  • 异常处理总结
  • 【为美好CTF献上祝福】 初探密码学
  • Codeforces Round 1062 (Div.4) 题解
  • 2025 10 28
  • 2025年保安亭厂家推荐排行榜
  • 2025年保安亭源头厂家推荐排行榜:行业深度分析与选购指南
  • 2025年保安亭源头厂家推荐榜单
  • [JXCSP-S2019 江西] 网格图 题解
  • [SPFA] P9751 [CSP-J 2023] 旅游巴士 题解
  • 2025.10.29
  • 2025年10月垃圾分类房品牌订制厂家深度评测与推荐:揭秘顶级厂家的优势与选购技巧
  • 解析 主语 + 谓语 + 宾语 句型
  • 动手动脑和实验性问题总结
  • Salesforce从业者,下一个10年,你该怎么走?
  • 2025第二届模式识别与图像分析国际学术会议(PRIA 2025)
  • 备战2025执业兽医资格证培训机构:执业兽医考试网课培训机构/执业兽医考试面授优质培训机构推荐榜出炉,助力考生高效通关
  • 2025年锅炉厂家/工厂排名前十:江苏永润锅炉领跑行业
  • 2025年闭式冷却塔生产厂家权威推荐榜单:不锈钢冷却塔/循环水冷却塔/工业冷却塔源头厂家精选
  • 45岁helloworld!
  • ogg升级部署
  • uniapp开发app打包ios上传AppStore提示SDK版本不兼容
  • 2025年挖泥船生产商权威推荐榜单:清淤船/挖沙船/绞吸船源头厂家精选
  • 99%的企业都不知道GEO搜索优化怎么做,讯灵AI来解答
  • 开了 8 年母婴店,靠微擎守住了 20000 会员的信任,再也不怕数据泄露