首页 > 其他分享 >WPF如何封装一个可扩展的Window

WPF如何封装一个可扩展的Window

时间:2024-03-31 10:44:58浏览次数:27  
标签:封装 自定义 标题栏 扩展 Window WindowChrome WPF

前言

    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>

 二、综合案例

 

如需以上代码,请到群共享文件中下载

 

标签:封装,自定义,标题栏,扩展,Window,WindowChrome,WPF
From: https://www.cnblogs.com/qushi2020/p/18106471

相关文章

  • WPF Yolov 体验
    参考Yolov中文文档yolov8_wpf_example(简单搜索到的一个示例程序)本文源码【下载】环境软件/系统版本说明WindowsWindows10专业版22H219045.4170MicrosoftVisualStudioMicrosoftVisualStudioCommunity2022(64位)-17.6.5Microsoft.NetSD......
  • Windows中的MSG命令是一种用于向其他用户或会话发送消息的命令行工具。它可以用于在本
    Windows中的MSG命令是一种用于向其他用户或会话发送消息的命令行工具。它可以用于在本地网络上向其他用户或会话发送即时通讯,以便进行通知、提醒或交流。MSG命令的作用:发送消息: MSG命令允许管理员或用户向其他用户或会话发送简短的消息。通知和提醒: 可以用MSG命令来发送提醒......
  • 一个可以让你有更多时间摸鱼的WPF控件(二)
    前言  上文介绍了如何通过一个Form自定义控件来简化数据的录入,并自动实现数据校验,自动布局排列等功能。本文继续介绍如何优化表格控件的使用,缩减代码量,实现工作效率的提升。一、功能实现   上文中分析了DataGrid跟ListView两种表格控件的优劣,在这里我们选择ListView来实......
  • WPF中继承ItemsControl子类控件数据模板获取选中属性
    需求场景列表类控件,如ListBox、ListView、DataGrid等。显示的行数据中,部分内容依靠选中时触发控制,例如选中行时行记录复选,部分列内容控制显隐。案例源码以ListView为例。Xaml部分<ListViewItemsSource="{BindingMyPropertys}"IsManipulationEnabled="False"><List......
  • 家庭版的Windows安装并运行Docker
    家庭版的Windows是可以安装并运行Docker的,但需要注意的是,安装过程和步骤与专业版Windows略有不同。以下是详细的安装步骤和注意事项:安装前提条件系统要求:Windows10家庭版需要是64位系统,并且版本号至少为2004或更高。硬件要求:需要支持二级地址转换(SLAT)的64位处理器,至少4GB的......
  • credwiz.exe 是 Windows 操作系统中的一个程序,用于备份和还原用户凭据。凭据可以包括
    credwiz.exe是Windows操作系统中的一个程序,用于备份和还原用户凭据。凭据可以包括保存的密码、证书、访问令牌等信息。使用凭据向导(CredentialBackupandRestoreWizard)可以帮助用户在需要时轻松地备份和恢复这些重要的凭据。这个工具通常用于帮助用户在更换计算机、重装操......
  • 滑动窗口算法(Sliding Window Algorithm)
    滑动窗口的核心就是,右指针给窗口扩容,直至抵达扩容限制条件或抵达边界;左指针则是给窗口缩容,以释放限制条件的约束,保证窗口继续向边界移动。需求讲解给定一个字符串str,请找出其中不含有重复字符的最长子串的长度。publicstaticintlengthOfLongestSubstring(Stringstr){......
  • Acunetix v24.3 (Linux, Windows) - Web 应用程序安全测试
    Acunetixv24.3(Linux,Windows)-Web应用程序安全测试Acunetix|WebApplicationSecurityScanner请访问原文链接:https://sysin.org/blog/acunetix/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org重要提示AcunetixPremium现在使用日历化版本命名。请注意,从......
  • 【快速解决】使用python图形库,禁止用户拉伸收缩界面,使用tkinter中的window.resizable(
    目录简单介绍1.window.resizable()方法2.参数取值说明3.控制效果4.使用场景示例代码解释展示使用前后的样子 使用前使用后结语简单介绍当你在使用Python的tkinter库创建GUI(图形用户界面)应用程序时,可以使用window.resizable(False,False)技术来控制窗口是......
  • python面向对象封装,私有变量
    一、私有变量“_”单下划线开头的变量:_var ,表示这些函数和变量是元素私有的或内部使用的,为非强制性(实际可修改也可引用)。"__"双下划线开头的变量:__var,表示这些函数和变量是元素私有的或内部使用的,为强制性,对象外不可修改或引用。单下划线例子classPeople():def__ini......