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

     二、综合案例

     

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

     

    技术交流群
     
    联系方式
  • 相关阅读:
    Worthington胶原蛋白酶的多类型研究
    2022-2023年度的AMC数学竞赛报名时间来了
    1.HTML简介
    MyBatis 缓存
    PostgreSql索引相关知识总结
    WPS中XLS表格使用的技巧记录
    shiro实现自定义Reaml
    《数据结构、算法与应用C++语言描述》使用C++语言实现二维数组对角矩阵
    QT-day5
    面试题-参加生日宴会的最多人数
  • 原文地址:https://www.cnblogs.com/qushi2020/p/18106471