WPF循序渐进 Sample 001 自定义WindowUI

本文逐步介绍了如何在WPF中创建一个自定义的WindowUI,包括去除默认边框、实现透明背景,并通过模板定义关闭按钮的行为。通过使用ControlTemplate、Canvas、Triggers和Storyboard等元素,详细解释了如何实现鼠标进入触发动画效果,以及Rectangle和Line的绘制细节。

在这里插入图片描述

代码

<Window x:Class="CustomUI.MainWindow"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="CustomChromeWindowSample"
	WindowStyle="None" 
    Width="348" Height="321"
    MinWidth="100" MinHeight="100"
    
	AllowsTransparency="True" 
	Background="Transparent"
    MouseLeftButtonDown="Window_MouseLeftButtonDown">

    <Border BorderBrush="DarkBlue" BorderThickness="5" CornerRadius="20" Background="White">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>

            <!--Close button-->
            <Button Name="closeButton" Grid.Column="1" TabIndex="0" Grid.Row="0" Click="CloseButtonRectangle_Click" Width="50" Height="50" Margin="10">
                <Button.Template>
                    <ControlTemplate>
                        <Canvas>
                            <Canvas.Triggers>
                                <!-- Make semi-opaque when mouse is over close button -->
                                <EventTrigger RoutedEvent="Canvas.MouseEnter">
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation To="0.6" Duration="0:0:0.05" Storyboard.TargetName="border" Storyboard.TargetProperty="Opacity" AccelerationRatio="1" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger>
                                <!-- Make fully-opaque when mouse moves away from close button -->
                                <EventTrigger RoutedEvent="Canvas.MouseLeave">
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation To="1" Duration="0:0:0.05" Storyboard.TargetName="border" Storyboard.TargetProperty="Opacity" AccelerationRatio="1" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger>
                                <!-- Make fully-opaque when mouse is down and over close button -->
                                <EventTrigger RoutedEvent="Canvas.MouseLeftButtonDown">
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation To="1" Duration="0:0:0.05" Storyboard.TargetName="border" Storyboard.TargetProperty="Opacity" AccelerationRatio="1" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger>
                            </Canvas.Triggers>

                            <Rectangle Name="border" Width="50" Height="50" Stroke="Black" StrokeThickness="4" RadiusX="3" RadiusY="3" Fill="Red" />
                            <Line X1="10" Y1="10" X2="40" Y2="40" Stroke="White" StrokeThickness="5" StrokeEndLineCap="Round" StrokeStartLineCap="Round" />
                            <Line X1="40" Y1="10" X2="10" Y2="40" Stroke="White" StrokeThickness="5" StrokeEndLineCap="Round" StrokeStartLineCap="Round" />

                        </Canvas>
                    </ControlTemplate>
                </Button.Template>
            </Button>

            <!-- Resize thumb -->
            <Thumb Name="resizeThumb" Grid.Column="1" Grid.Row="2" Width="50" Height="50" Cursor="SizeAll" Margin="10" ToolTip="Drag to resize" DragDelta="ResizeThumb_DragDelta">
                <Thumb.Template>
                    <ControlTemplate>
                        <Canvas>
                            <Canvas.Triggers>
                                <!-- Make semi-opaque when mouse is over resizing thumb -->
                                <EventTrigger RoutedEvent="Canvas.MouseEnter">
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation To="0.6" Duration="0:0:0.05" Storyboard.TargetName="resizeEllipse" Storyboard.TargetProperty="Opacity" AccelerationRatio="1" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger>
                                <!-- Make fully-opaque when mouse moves away from resizing thumb -->
                                <EventTrigger RoutedEvent="Canvas.MouseLeave">
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation To="1" Duration="0:0:0.05" Storyboard.TargetName="resizeEllipse" Storyboard.TargetProperty="Opacity" AccelerationRatio="1" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger>
                                <!-- Make fully-opaque when mouse is down and over resizing thumb -->
                                <EventTrigger RoutedEvent="Canvas.MouseLeftButtonDown">
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation To="1" Duration="0:0:0.05" Storyboard.TargetName="resizeEllipse" Storyboard.TargetProperty="Opacity" AccelerationRatio="1" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger>
                            </Canvas.Triggers>
                            <Ellipse Name="resizeEllipse" Width="50" Height="50" Fill="Red" Stroke="Black" StrokeThickness="5" />
                        </Canvas>
                    </ControlTemplate>
                </Thumb.Template>
            </Thumb>
        </Grid>
    </Border>
</Window>

代码释义

WindowStyle=“None” 指定窗口的边框样式
AllowsTransparency=“True” 指示窗口的工作区支持透明度
Background=“Transparent” 背景色

closeButton

通过模板来定义样式大体过程如下示例

  • Button
    • Button.Template
      • ControlTemplate
        • Canvas
          • Triggers
            • EventTrigger RoutedEvent=“Canvas.MouseEnter”

              • BeginStoryboard
                • Storyboard
                  • DoubleAnimation
            • Rectangle 第二个控件

              • Line

BeginStoryboard

BeginStoryboard 一个触发器操作 一个触发器操作,该操作开始 Animation.Storyboard 并将其动画分配到目标对象和属性
DoubleAnimation 在指定的 Timeline.Duration 上使用线性内插对两个目标值之间的 System.Double 属性值进行动画处理。
AccelerationRatio获取或设置一个值(0或者1),该值指定在将时间消逝从零加速到其最大速率的过程中所占用时间线的 Timeline.Duration的百分比。

 <!-- Make semi-opaque when mouse is over close button -->
 <EventTrigger RoutedEvent="Canvas.MouseEnter">
     <BeginStoryboard>
         <Storyboard>
             <DoubleAnimation To="0.6" Duration="0:0:0.05" Storyboard.TargetName="border" Storyboard.TargetProperty="Opacity" AccelerationRatio="1" />
         </Storyboard>
     </BeginStoryboard>
 </EventTrigger>

Rectangle/Line

Rectangle 矩形
Stroke 边框绘制的方式返回结果为Brush
Rectangle Name=“border” Width=“50” Height=“50” Stroke=“Black” StrokeThickness=“4” RadiusX=“3” RadiusY=“3” Fill=“Red”

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值