WPF换肤之一:创建圆角窗体
我们都期望自己的软件能够有一套看上去很吸引人眼球的外衣,使得别人看上去既专业又有美感。这个系列就带领着大家一步一步的讲解如何设计出一套自己的WPF的窗体皮肤,如果文中有任何错误或者不足,还请指出。
WPF是微软大战略中的一个重心所在,学习WPF可谓是一举多得:首先,学习WPF可以让你了解SilverLight的80%;其次,XAML语言可以让你快速的入手WCF和WF;更甚者,就是WPF给予DX渲染核心,抛弃了传统WINFORM以GDI+为主的渲染方式,使得界面更新更流畅,彻底解决了闪烁问题,同时也使得代码和界面显示分离,这和以前WINFORM方式完全不同。
那么,本节开始就以最简单的方式来介绍如何创建一个圆角的窗体。
简单介绍XAML
首先,让我来说一下XAML,因为只有了解了它,我们才能够更加深入的来介绍如何创建圆角窗体。
所谓的XAML就是一坨类似xml的可扩展应用程序的标记语言,它能够详细的描述用户界面元素,比如说TextBox,Button等等的信息,以便做到精确的设置或者定位。具体的大家还是参考一些其他的资料吧,反正记住XAML和HTML类似,都是描述界面元素的特定语言而已。
在WINFORM中,我们自绘圆角窗体的时候,都是先把窗体置为FormBorderStyle为None的状态,即无窗体模式;然后我们会结合后台代码先绘制出窗体的区域,然后通过Win32函数里面的CreateRoundRectRgn()方法进行切割;最后通过WndProc(ref Message m)处理窗体界面消息即可。
创建圆角窗体
在WPF中,创建圆角窗体相当简单,根本不需要那么多的步骤,下面看我的操作:
首先,我们需要设置WPF的窗体样式为None,这个和Winform设计差不多,就是设置WindowStyle为None即可,这样当我们运行F5就可以看到一个无边框的窗体。
其次,我们需要设置AllowTransParency为True,BackGround为Transparent,OpacityMask为White,这样设置才能保证当我们设置为圆角的时候,四个角能够透明显示,这样当我们F5运行的时候,将看不到任何窗体,因为已经透明了。
最后,怎么添加圆角呢,这个很简单,直接利用Border元素即可,加入如下代码:
<Window x:Class="WpfApplication1.MsgWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TestWindow" Height="391" Width="418" WindowStyle="None" AllowsTransparency="True" Background="Transparent" OpacityMask="White" ResizeMode="NoResize" PreviewMouseMove="ResetCursor" WindowStartupLocation="CenterScreen">
<Grid Background="Transparent">
<Border BorderThickness="5" BorderBrush="DarkGreen" CornerRadius="10,10,10,10" MouseMove="DisplayResizeCursor" PreviewMouseDown="Resize" Name="top">
<Grid>
<ListBox Margin="16,51,18,62" Name="uniqueMessages" />
<Label Height="28" HorizontalAlignment="Left" Margin="16,17,0,0" Name="label1" VerticalAlignment="Top" Width="120">Label</Label>
</Grid>
</Border>
</Grid>
</Window>
其中,BorderThickness用来表示Border的粗细程度,BorderBrush用来表示Border的颜色,CornerRadius表明四个角的弯曲度。
效果如下:

可以看到,整个窗体居然是透明的,圆角部分显示的很完美。控件放在了透明的窗体上,这样也就预示我们成功了一半。
接下来,我们设置Border的Background,用以遮蔽窗体中无需透明的部分。
代码如下:
<Window x:Class="WpfApplication1.MsgWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TestWindow" Height="391" Width="418" WindowStyle="None" AllowsTransparency="True" Background="Transparent" OpacityMask="White" ResizeMode="NoResize" PreviewMouseMove="ResetCursor" WindowStartupLocation="CenterScreen">
<Grid Background="Transparent">
<Border BorderThickness="5" BorderBrush="DarkGreen" CornerRadius="10,10,10,10" MouseMove="DisplayResizeCursor" PreviewMouseDown="Resize" Name="top">
<Border.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#eee"/>
</LinearGradientBrush>
</Border.Background>
<Grid>
<ListBox Margin="16,51,18,62" Name="uniqueMessages" />
<Label Height="28" HorizontalAlignment="Left" Margin="16,17,0,0" Name="label1" VerticalAlignment="Top" Width="120">Label</Label>
</Grid>
</Border>
</Grid>
</Window>
其中,LinearGradientBrush用来绘制border区域的背景,以便遮蔽透明窗体部分。
这样当我们再运行的时候,就可以看到效果了:

好了,这个窗体虽然完成了,但是如何进行拖拽而改变其大小呢?下节将继续讲解。
WPF换肤之一:创建圆角窗体的更多相关文章
- WPF换肤之五:创建漂亮的窗体
原文:WPF换肤之五:创建漂亮的窗体 换肤效果 经过了前面四章的讲解,我们终于知道了如何拖拉窗体使之改变大小,也知道了如何处理鼠标事件,同时,也知道了如何利用更好的编写方式来编写一个方便实用和维护的换 ...
- WPF换肤之二:可拉动的窗体
原文:WPF换肤之二:可拉动的窗体 让我们接着上一章: WPF换肤之一:创建圆角窗体 来继续. 在这一章,我主要是实现对圆角窗体的拖动,改变大小功能. 拖动自绘窗体的步骤 首先,通过上节的设计,我们知 ...
- WPF换肤之八:创建3D浏览效果
原文:WPF换肤之八:创建3D浏览效果 上节中,我们展示了WPF中的异步以及界面线程交互的方式,使得应用程序的显示更加的流畅.这节我们主要讲解如何设计一个具有3D浏览效果的天气信息浏览器. 效果显示 ...
- WPF换肤之四:界面设计和代码设计分离
原文:WPF换肤之四:界面设计和代码设计分离 说起WPF来,除了总所周知的图形处理核心的变化外,和Winform比起来,还有一个巨大的变革,那就是真正意义上做到了界面设计和代码设计的分离.这样可以让美 ...
- WPF换肤之三:WPF中的WndProc
原文:WPF换肤之三:WPF中的WndProc 在上篇文章中,我有提到过WndProc中可以处理所有经过窗体的事件,但是没有具体的来说怎么可以处理的. 其实,在WPF中,要想利用WndProc来处理所 ...
- WPF换肤之六:酷炫的时区浏览小精灵
原文:WPF换肤之六:酷炫的时区浏览小精灵 由于工作需要,经常要查看到不同地区的 当前时间,以前总是对照着时区表来进行加减运算,现在有了这个小工具以后,感觉省心了不少.下面是软件的截图: 效果图赏析 ...
- WPF换肤之七:异步
原文:WPF换肤之七:异步 在WinForm时代,相信大家都遇到过这种情形,如果在程序设计过程中遇到了耗时的操作,不使用异步会导致程序假死.当然,在WPF中,这种情况也是存在的,所以我们就需要寻找一种 ...
- 有点激动,WPF换肤搞定了!
一如既往没废话! wpf桌面应用开发都是window内引入很多个UserControl. 如果你有通过不同颜色来换肤的需求,那么下面我就将整个过程! 分2个步骤: 1.主窗体背景色替换: 2.同时界面 ...
- WPF:换肤
看了一篇博客,觉得样式很好看,就自己动手做了一下,做个总结. 效果: 选择不同的图片背景就会改变: 直接上代码: 每个Theme对应一张图,除了图的名称不同之外,Theme?.xaml中的内容相 ...
随机推荐
- perl的一些基本用法
ReadLine support available (try 'install Bundle::CPAN')cpan>进入cpan的shell,好了,我为了安装spamassassin,需要安 ...
- OCA读书笔记(7) - 管理数据库存储结构
7.Managing Database Storage Structures 逻辑结构 数据库的存储结构有物理结构和逻辑结构组成的 物理结构:物理上,oracle是由一些操作系统文件组成的 SQL&g ...
- Ubuntu12.04创建 Eclipse launcher
Ubuntu 12.04 默认无法launcher Eclipse快捷图标到左侧Dash,需要手工配置,步骤如下: 1) 首先,创建并打开 ~/.local/share/applications/op ...
- 状态压缩动态规划 -- 棋盘问题 POJ 1321
一个 N * N 的棋盘上面,有些格子不能放,放置 M 的棋子, 每两个棋子不能在同一行或者同一列,问有多少种放法 DFS太慢,用SCR好点点 Python 仅仅有 22 行,事实上能够更短.可是得排 ...
- 如何配置web服务器
如何配置web服务器 (1)了解DNS主机名和IP地址.如果此WEB服务器在Internet上,需向ISP申请和注册此服务器的DNS主机名和IP地址.如果此服务器只在企业网内使用,则在内部的DNS服务 ...
- 与众不同 windows phone (25) - Input(输入)之捕获 UIElement 之外的触控操作, Silverlight 方式捕获手势操作, XNA 方式捕获手势操作, 多点触控
原文:与众不同 windows phone (25) - Input(输入)之捕获 UIElement 之外的触控操作, Silverlight 方式捕获手势操作, XNA 方式捕获手势操作, 多点触 ...
- 大白菜U盘启动制作工具装机维护版V5.0–大白菜U盘下载中心
大白菜U盘启动制作工具装机维护版V5.0–大白菜U盘下载中心 大白菜U盘启动制作工具装机维护版V5.0
- 后缀数组--可重叠的K次最长重复子串(POJ3261)
题目:Milk Patterns #include <stdio.h> #include <string.h> #define N 1000010 int wa[N],wb[N ...
- [置顶] Cocos2d-x 实例源码分析之二 小实例的主框架
这篇文章是分析第一个小实例ActionTest的源码.其实所有实例程序的结构都是一样的,只有特定方法里的代码不同,大的框架都是一样的.也就是说看完这篇文章你就可以自己开始分析其他源码了. 废话不多说, ...
- Modular Fibonacci
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=30506#problem/U fib数列对2^m取模的循环节为3*(2^(m-1)) #i ...