• 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>
    复制代码

     二、综合案例

     

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

     

    技术交流群
     
    联系方式
  • 相关阅读:
    Linux病毒扫描工具ClamAV 安装使用
    【人工智能】无人车系统仿真软件-PreScan
    unity3d客户端框架 基于类对象池的可回收变量 代码实现
    E. Tyler and Strings(组合计数 + 树状数组/线段树)(带重复元素的全排列)
    洛谷 Equalize the Remainders
    小样本利器2.文本对抗+半监督 FGSM & VAT & FGM代码实现
    面试真经(运维工程师)
    22张图带你深入剖析前缀、中缀、后缀表达式以及表达式求值
    EN 14351-1门窗及配件—CE认证
    计算机毕业设计Java自行车在线租赁管理系统2021(源码+系统+mysql数据库+Lw文档)
  • 原文地址:https://www.cnblogs.com/qushi2020/p/18106471