WPF之自定义"消息框式"的窗体

简介: 原文 http://www.cnblogs.com/ListenFly/archive/2013/02/19/2917744.html ...

原文 http://www.cnblogs.com/ListenFly/archive/2013/02/19/2917744.html

<Window x:Class="mumu_nonRectangularwindow.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" SizeToContent="WidthAndHeight"
    MouseLeftButtonDown="Window_MouseLeftButtonDown">
    <!--窗口的形状都绘制在Canvas面板里面-->
    <Canvas Width="200" Height="200" >
        <!--窗口的轮廓-->
        <Path Stroke="DarkGray" StrokeThickness="2">
            <Path.Fill>
                <LinearGradientBrush StartPoint="0.2,0" EndPoint="0.8,1" >
                    <GradientStop Color="White"  Offset="0"></GradientStop>
                    <GradientStop Color="White"  Offset="0.45"></GradientStop>
                    <GradientStop Color="LightBlue" Offset="0.9"></GradientStop>
                    <GradientStop Color="Gray" Offset="1"></GradientStop>
                </LinearGradientBrush>
            </Path.Fill>
            <Path.Data>
                <PathGeometry>
                    <PathFigure StartPoint="40,20" IsClosed="True">
                        <LineSegment Point="160,20"></LineSegment>
                        <ArcSegment Point="180,40" Size="20,20" SweepDirection="Clockwise"></ArcSegment>
                        <LineSegment Point="180,80"></LineSegment>
                        <ArcSegment Point="160,100" Size="20,20" SweepDirection="Clockwise"></ArcSegment>
                        <LineSegment Point="90,100"></LineSegment>
                        <LineSegment Point="90,150"></LineSegment>
                        <LineSegment Point="60,100"></LineSegment>
                        <LineSegment Point="40,100"></LineSegment>
                        <ArcSegment Point="20,80" Size="20,20" SweepDirection="Clockwise"></ArcSegment>
                        <LineSegment Point="20,40"></LineSegment>
                        <ArcSegment Point="40,20" Size="20,20" SweepDirection="Clockwise"></ArcSegment>
                    </PathFigure>
                </PathGeometry>
            </Path.Data>
        </Path>
        <!--“拖拽我!”的标签-->
        <Label Width="200" Height="120" FontSize="15" HorizontalContentAlignment="Center" VerticalContentAlignment="Center">Drag Me</Label>
        <!--关闭按钮-->
        <Button Canvas.Left="155" Canvas.Top="30" Click="Button_Click">
            <Button.Template>
                <ControlTemplate>
                    <Canvas>
                        <Rectangle Width="15" Height="15" Stroke="Black" RadiusX="3" RadiusY="3">
                            <Rectangle.Fill>
                                <SolidColorBrush x:Name="myAnimatedBrush" Color="Red" />
                            </Rectangle.Fill>
                        </Rectangle>
                        <Line X1="3" Y1="3" X2="12" Y2="12" Stroke="White" StrokeThickness="2"></Line>
                        <Line X1="12" Y1="3" X2="3" Y2="12" Stroke="White" StrokeThickness="2"></Line>
                    </Canvas>
                </ControlTemplate>
            </Button.Template>
        </Button>
    </Canvas>
</Window>
复制代码

界面代码如上,后台代码如下:

复制代码
 private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            this.DragMove();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
复制代码

后台代码比较简单,一个是自定义关闭按钮的事件,一个为鼠标左键按下事件(按下后可拖动窗体)。
效果图如下:

可是会发现,可预期的效果有点不一样,因为预期的是自定义的窗体,而不是依赖于窗体的自定义图形,所以还需要如下的设置

Background="Transparent" AllowsTransparency="True" WindowStyle="None"

设置窗体背景色为透明;同时设置AllowsTransparency为true,表示窗口的客户区支持透明色;同时删除最小化最大化和关闭按钮,所以设置WindowsStyle为None,最终的效果
如下:

可以拖动窗体,同时也可以按下红叉关闭窗体,最重要是他的确是一个不规则的自定义窗体.

其实自定义窗体的实现原理很简单,由一个Path和一个Button(通过模板绘制出红叉),Path绘制出了消息框的图形,Button实现了关闭功能。

目录
相关文章
|
C# 虚拟化 索引
【WPF】UI虚拟化之------自定义VirtualizingWrapPanel
原文:【WPF】UI虚拟化之------自定义VirtualizingWrapPanel 前言 前几天QA报了一个关于OOM的bug,在排查的过程中发现,ListBox控件中被塞入了过多的Item,而ListBox又定义了两种样式的ItemsPanelTemplate。
2222 0
|
C# 数据安全/隐私保护
【WPF】右下角弹出自定义通知样式(Notification)——简单教程
原文:【WPF】右下角弹出自定义通知样式(Notification)——简单教程 1.先看效果 2.实现 1.主界面是MainWindow 上面就只摆放一个Button即可。
3074 1
|
4月前
|
开发框架 缓存 前端开发
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(11) -- 下拉列表的数据绑定以及自定义系统字典列表控件
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(11) -- 下拉列表的数据绑定以及自定义系统字典列表控件
|
4月前
|
开发框架 前端开发 JavaScript
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(3)--自定义用户控件
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(3)--自定义用户控件
|
4月前
|
C#
WPF 自定义可拖动标题栏
WPF 自定义可拖动标题栏
54 0
|
4月前
|
开发框架 前端开发 C#
使用WPF开发自定义用户控件,以及实现相关自定义事件的处理
使用WPF开发自定义用户控件,以及实现相关自定义事件的处理
WPF控件和窗体一起放大一起缩小
WPF控件和窗体一起放大一起缩小
245 0
|
C# 容器
WPF框架下,窗体的嵌套显示
WPF框架下,窗体的嵌套显示
229 0
|
前端开发 C# 图形学
【WPF】WPF开发用户控件、用户控件属性依赖DependencyProperty实现双向绑定、以及自定义实现Command双向绑定功能演示
Wpf开发过程中,最经常使用的功能之一,就是用户控件(UserControl)了。用户控件可以用于开发用户自己的控件进行使用,甚至可以用于打造一套属于自己的UI框架。依赖属性(DependencyProperty)是为用户控件提供可支持双向绑定的必备技巧之一,同样用处也非常广泛。
958 0
【WPF】WPF开发用户控件、用户控件属性依赖DependencyProperty实现双向绑定、以及自定义实现Command双向绑定功能演示
|
C# C++ 数据可视化
WPF Calendar 日历控件 样式自定义
原文:WPF Calendar 日历控件 样式自定义 粗略的在代码上做了些注释 blend 生成出来的模版 有的时候 会生成 跟 vs ui界面不兼容的代码 会导致可视化设计界面 报错崩溃掉 但是确不影响 程序的编译运行 这个样式表 在vs 里会提示动画不兼容 Foreground属性 报错 ...
1788 1