WPF之自定义窗体

C# WPF通过WindowChrome自定义窗体 在WPF界面开发中,系统默认的窗口比较丑,有时候想自定义窗体,比如微信的客户端窗口这样:使得左边的一块顶到最上端,如下图所示: 阅读详情

转自:http://blog.youkuaiyun.com/duanzilin/article/details/6385151

使用wpf能够轻松的制作华丽炫目的程序界面,但是其默认的窗体样式太死板,在win7下看起来还不错,在xp或2003下却显得很不协调;因此我们需要自定义窗体样式,wpf应该如何自定义窗体呢?

      最开始我想到的方法,也是最传统的方法,就是是使用模板和样式来自定义窗体,首先设置窗体的WindowStyle为None,然后在Template里定义窗体布局,还需要考虑标题栏拖动、双击最大化、右键系统菜单、窗体操作按钮,然后就是Resize边框的放大,缩小,最后我也实现所有功能,但是也许我是个完美主义者,发现windows自带的窗体Resize边框拖动的时候会有虚线框,而我的方法却是随鼠标移动而改变大小,于是又开始在google上找相关资料,终于找到最好用也是最高效的方法,就是通过wpf shell library的WindowChrome来实现,下面都是介绍如何使用WindowChrome创建自定义窗体。

     最新的wpf shell library(v3.5)包含在微软发布的Microsoft Ribbon for WPF中,下载后安装即可在项目中添加Microsoft.Windows.Shell引用;当然可以直接下载WPF Shell Integration Library,包含源代码,这里只介绍其中WindowChrome的用法,想知道更多功能或者WindowChrome如何实现的可以下载源码来自己研究。

    下面将由浅到深介绍如何使用WindowChrome创建自定义窗体:

    前提条件:下载并安装Microsoft Ribbon for WPF

    开发环境:VS2010/Blend4、VS2008

    相关技术:WPF 基础、样式和模板、依赖项属性、附加属性、WPF 中的路由事件和命令

    示例一:Win7下透明玻璃窗体

    1、首先下载并安装Microsoft Ribbon for WPF

    2、打开Vs2010 ,选择创建WPF应用程序项目(注意在windows项目列表中我们会发现多了一个模板WPF Ribbon Application,但是这里我们并不讨论如何使用Ribbon,仍然选择WPF应用程序)

    3、添加项目引用,在.net引用列表中选择Microsoft.Windows.Shell,如图:

    image

    如果选择你使用WPF Shell Integration Library,则需要在浏览标签项里选择Microsoft.Windows.Shell所在的位置

    4、为了体现区别,我们分别创建不同类型的子窗体来做实例,首先创建新的wpf窗体Windows1,在xaml中添加Shell命名空间引用

<Window x:Class="SimpleWindowChrome.Window2"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:shell="clr-namespace:Microsoft.Windows.Shell;assembly=Microsoft.Windows.Shell"
        Title="Window2" Height="300" Width="300">

    5、接着复制以下代码到Window定义中:

<shell:WindowChrome.WindowChrome>
    <shell:WindowChrome GlassFrameThickness="-1" ResizeBorderThickness="4"
                        CaptionHeight="28" CornerRadius="0" />
  shell:WindowChrome.WindowChrome>

    这里的WindowChrome实际上是一个附加属性,通过它对设置Window的属性,具体实现参考Shell源码WPF Shell Integration Library,WindowChrome的第一个属性GlassFrameThickness是玻璃效果区域的高度,只有在开启了Aero的玻璃效果才能看到,否则是系统默认的效果,GlassFrameThickness设置为-1表示对整个窗体起用玻璃效果;ResizeBorderThickness是Resize边框的宽度;CaptionHeight是标题区域的高度,也就是窗体的操作区域,比如右键系统菜单,操作按钮,双击最大化还原等;CornerRadius是设置窗体的边角的弧度。

    加了这段代码后窗体就能实现点击标题拖动,右键系统菜单,最大化,还原,拖动Resize边框改变窗体大小,这样就包含自定义窗体必须包含的最重要的要素,但是此时运行程序,我们发现整个窗体都是白色的,并没有玻璃背景的效果,因为wpf窗体默认的背景是白色的,覆盖了WindowChrome的效果,要解决很简单,自定义Window的Template,在xaml中添加以下代码:

<Window.Template>
    <ControlTemplate TargetType="{x:Type Window}">
      <Border BorderThickness="1">
        <DockPanel>
          <Grid x:Name="WindowHeader" DockPanel.Dock="Top" Height="25">
            <TextBlock Text="{TemplateBinding Title}"/>
          Grid>
          <ContentPresenter Margin="20,20,20,20"/>
        DockPanel>
      Border>
    ControlTemplate>
  Window.Template>

    在Win7下运行后,效果如下:image

    怎么样,是不是很简单,当然win7下才有这种效果,xp或2003中会显示为空白,为解决这个问题,下面我们再看看下面这个示例:

   

    示例二:通用的窗体

    在示例1的基础上添加Wpf窗体Window2,添加Shell命名空间和WindowChrome定义:

<shell:WindowChrome.WindowChrome>
    <shell:WindowChrome GlassFrameThickness="0" ResizeBorderThickness="4"
                        CaptionHeight="28" CornerRadius="0" />
  shell:WindowChrome.WindowChrome>

    这里我们将GlassFrameThickness设置为0,也就是去掉玻璃窗体效果,我们需要自己定义窗体显示样式,首先我们必须模拟win7下的透明玻璃效果,因为本人缺少一定的美工底子,这里我用半透明颜色来代替玻璃效果,要让wpf支持透明背景,我们必须将窗体的WindowStyle设置为"None",同时必须将AllowsTransparency设置为True(注意不能单独设置AllowsTransparency为true,必须在WindowStyle="None"前提下)

    接着在xaml中添加如下代码:

<Window.Template>
    <ControlTemplate TargetType="{x:Type Window}">
      <Border BorderThickness="1" BorderBrush="Black" Background="#CC6C779A">
        <DockPanel>
          <Grid x:Name="WindowHeader" DockPanel.Dock="Top" Height="25">
            <DockPanel>
              <Button DockPanel.Dock="Right" Foreground="Black"
                      shell:WindowChrome.IsHitTestVisibleInChrome="True"
                      Command="{x:Static shell:SystemCommands.CloseWindowCommand}" 
                      Background="{x:Null}" BorderBrush="{x:Null}"
                      FontSize="16" Width="20"  Content="X"/>
              <TextBlock Text="{TemplateBinding Title}"/>
            </DockPanel>
          </Grid>
            <ContentPresenter s/>
        </DockPanel>
      </Border>
    </ControlTemplate>
  </Window.Template>

    这样我们的窗体就具有了半透明背景,但是窗体操作的按钮没有了,需要我们自己添加按钮,注意在CaptionHeight区域定义按钮必须将其IsHitTestVisibleInChrome设置为True,否则它将变得不可点击;这里我们添加一个关闭的按钮,按钮的Command绑定到路由命令shell:SystemCommands.CloseWindowCommand,因此需要给窗体绑定路由命令,在xaml中添加如下代码:

<Window.CommandBindings>
    <CommandBinding Command="{x:Static shell:SystemCommands.CloseWindowCommand}"
                        Executed="_OnCloseWindowCommand"/>
  </Window.CommandBindings>

    在xaml.cs中添加事件处理方法:

private void _OnCloseWindowCommand(object sender, ExecutedRoutedEventArgs e)
{
    Window _window = Window.GetWindow(this);
 
    Microsoft.Windows.Shell.SystemCommands.CloseWindow(_window);
}

    这样我们点击关闭按钮,就可以触发OnCloseWindowCommand路由事件,在事件处理方法中关闭窗体,如果你不明白什么是路由命令,参考了解 WPF 中的路由事件和命令;

    OK,现在我们在Aero特效和无特效情况下运行得到同样的效果:image

   

    示例三:创建窗体控件库

    方便起见,这里我直接使用我在项目中创建好的自定义窗体控件,窗体外观都在样式模板中定义,我们可以根据需要修改窗体样式,自定义控件使用方法:

    首先在帖子最下方下载示例程序,在SimpleWindowChrome项目中添加CustomControl引用,然后添加wpf窗体window3,修改window3.xaml如下:

<controls:CustomChromeWindow xmlns:controls="clr-namespace:CustomControl;assembly=CustomControl"
    x:Class="SimpleWindowChrome.Window3"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window3" Height="300" Width="300"
    CornerRadius="10,10,5,5">
  <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
    <TextBlock TextWrapping="Wrap" Width="250" FontSize="15">
      <TextBlock.Text>
        引用自定义窗体控件,可以在WIN7/XP/2003上查看
      </TextBlock.Text>
    </TextBlock>
  </StackPanel>
</controls:CustomChromeWindow>

    至于自定义控件部分,这里就不贴代码了,大家可以帖子下方下载示例程序,关键地方我都在代码中有注释;

    运行程序截图:image

    示例中我尽可能多的使用xmal完成所需的功能,而尽量避免过多的后台代码,因此对于初学wpf或者不习惯xaml者造成阅读困难,但是我觉得xaml才是wpf的精髓所在,不明白者需要耐心阅读,多上google查找相关资料,本文示例下载:

http://download.youkuaiyun.com/source/3242566

   更新下载VS2008版本示例,由于wpf3存在一个公所周知的Bug,就是在Style中不能设置Content的值,因此相对vs2010版本有一点点小改动,我在CaptionButton基类中添加了一个ControlTemplate类型的依赖项属性,在CaptionButton继承类对象中通过对ControlTemplate的设置来达到与设置Content同样的效果,VS2008版本示例下载地址:

http://download.youkuaiyun.com/source/3243089

 

WPF自定义控件快速构成窗体布局 之前做了一个类似于360界面的WPF程序,主要是通过对基本控件的模版来修改实现的,在其中定义了很多模版,后来由于源码丢失,导致在制作相同风格的程序时又得重头开始,所以尝试了下自定义控件的制作,制作一套构成界面的基本控件,方便以后调用。 控件下载地址 界面样式: 首先分析下界面构成:主要是由一个无边框窗体+TAB控件+若干个系统按钮构成,在wpf中,窗体控件的继承比较麻烦,加上无边框窗体样 阅读详情

相关推荐

WPF自定义窗体边框和可拖拽

因为WPF原有的最小化、最大化和关闭这三个系统按钮不是我想要的效果,而且我要做的是无边框窗体,所以在我设置了使窗体无边框的相应属性后,窗体会呈现出一种和桌面贴切缝合且不可拖拽移动的效果,所以我重新定义了一个1像素的红色边框给窗体,并且设置了窗体可拖拽移动。 边框效果如下: 我把设置窗体窗体边框的样式放在了App.xaml页面里,然后再在XAML处引用此资源,详细代码如下: App.xam...

D&M的博客 3472

WPF绘制自定义窗口

简介: 原文:WPF绘制自定义窗口 WPF是制作界面的一大利器,下面就用WPF模拟一下360的软件管理界面,360软件管理界面如下: 界面不难,主要有如下几个要素: 窗体的圆角 自定义标题栏及按钮 自定义状态栏 窗体的半透明效果 窗体4周有一圈半透明阴影(抓的图上看不出来) 实现思路很简单,首先隐藏默认窗口的标题栏和边框,然后用WPF的Border或Canvas等元素模拟定义窗体的标题栏、内容区和状态栏。它和后面的Grid元素定义的实际窗口是同级的。到此,自定义窗口的基类就打造完成,完整代码见附件。

weixin_53370274的博客 1669

WPF自定义窗体封装技术详解与实践

WPF(Windows Presentation Foundation)是微软推出的一种用于构建Windows客户端应用程序的用户界面框架。它允许开发者通过XAML(可扩展应用程序标记语言)来设计和实现用户界面,与传统的Windows窗体相比,WPF提供了更丰富的视觉效果和更灵活的用户界面设计。在WPF中,类的定义是面向对象编程的基础。每一个WPF控件,从Button到Window,都是继承自一个共同的基类。比如,自定义窗体类通常继承自Window类。

weixin_30978239的博客 1019

WPF中自定义标题栏时窗体最大化处理之WindowChrome

注意: 本文方法基础是WindowChrome,而WindowChrome在.NET Framework 4.5之后才集成发布的。见:WindowChrome Class 在.NET Framework 4.0中使用WindowChrome,需要安装Ribbon来支持WindowChrome 目前官方文档的内容较为陈旧(但仍有参考价值),其中提到了SystemParameters...

dingze5250的博客 1243

WPF中自定义窗体继承的实现与应用

窗体继承是面向对象编程的核心概念之一,它允许新创建的窗体类继承并重用已有的基类窗体的所有属性和方法。这种继承机制让开发人员能够构建起层次化和模块化的应用程序。当应用窗体继承时,主要好处包括:代码复用:继承机制可以让子类自动获得基类的所有公开和受保护成员,这样就无需在每个窗体类中重复编写相同的代码。扩展性:通过继承,可以设计出可扩展的窗体库,方便后续添加新的窗体类型而无需修改现有代码。维护性:管理和更新基类的代码会自动反映到所有继承了基类的窗体上,这样减少了维护成本。

weixin_30591519的博客 733

WPF 窗体自定义 样式

WPF 窗体自定义 样式

WPF自定义Window窗体样式

【代码】WPF自定义Window窗体样式。

风清扬的专栏 1821

SAP WM模块配置详解

1.给工厂/存储地点分配仓库编码 功能说明 配置路径 IMG>企业结构>分配>分配后勤执行>给工厂/存储地点分配仓库编码 业务示例 配置步骤 2.定义仓库号码控制参数 功能说明 配置路径 IMG>后勤执行>仓库管理>主数据>主数据>定义仓库号码控制参数 业务示例 配置步骤 3.定义编码范围 功能说明 配置路径 IMG>后勤执行>仓库...

weixin_40672823的博客 2万+

WPF 之 自定义窗体的封装

文章目录简介效果代码实现1. 重写`Button`按钮类2. 自定义`CustomWindowBase.xaml` 样式3. `MainWindow` 窗体的引用源码下载 简介 在绘制界面时,往往需要自定义窗体的封装,下面是实现自定义窗体的方式。 效果 窗体 ResizeMode=&amp;amp;quot;CanResize&amp;amp;quot; 窗体 ResizeMode=&amp;amp;quot;NoResize&amp;amp;quot; 代

me_badman的博客 3806

BEVFusion(mit)最强环境安装,部署复现

BEVFusion作为一项经典的工作,值得深入探索。然而由于配置环境比较麻烦,耽误了一些时间。经过几次成功配置之后,有了一些总结,在这里记录下来,供大家参考避坑,也方便自己下次查阅。

qq_45783225的博客 1万+

bugku渗透测试4-writeup

三、对这个主机进行全端口的扫描,发现存在22000 ssh端口,那么可以联想到时redis写入公钥来连接主机。又来了一个新的靶场,这个靶场打下来我觉得关键就是信息收集,走了很多的弯路。八、最后一个flag是要去看cms的数据库里面,这个数据库是sqlite。把这个数据库下载下来,登录密码是加密的,就直接用token。一、入口的漏洞是在登录的时候去抓包,修改action的值。六、没想到这个第一台机器的密码,在第二台里面。七、扫描第一台主机、使用之前的密码连接成功。获取最后一台主机的root密码。

vsdfbhsdhsdfh的博客 1294

Wpf 自定义窗体

用Wpf做客户端界面也有一段时间了,一直都直接使用的Window显示窗体,这几天闲来没事情,整理了下,自己做了一个自定义窗体。我自定义的窗体需要达到的细节效果包括: 1、自定义边框粗细、颜色,窗体顶端不要有边框线,也就是说只有窗体左、右和底有边框,顶部是标题栏; 2、实现圆角窗体,当具有圆角时,关闭按钮离窗体右侧边距为圆角值; 3、标题栏有...

dazhengmo1053的博客 510

An工具介绍之摄像头

An工具介绍之摄像头

人生得意须尽欢 6185

WPF 去边框 自定义窗体 拖动窗体大小变化

WPF 去边框 自定义窗体 拖动窗体大小变化 wpf 自定义窗体 并 拖动窗体大小变化 网上普遍 实现都是 win32那一套或者用windowChrome.Shell这两种方式。实际上wpf目前已经集成了windowChrome。那么新的使用方式怎么弄呢?非常简单! Xaml实现代码 后台都不用写任何代码哟! <Window x:Class="TestNoBorderWindow"

u010209404的博客 3451

《网络安全自学教程》- MySQL脱库原理和步骤

MySQL脱库,脱库的原理,怎么脱库,脱库的步骤,一库三表六字段

wangyuxiang946的博客 1万+

手把手教你学simulink(57.2)--电励磁同步电动机场景示例:基于Simulink的矢量控制(Field-Oriented Control, FOC)电励磁同步电动机

在某电动汽车驱动系统中,采用了本项目开发的带有矢量控制功能的电励磁同步电动机驱动系统,结合三相逆变器实现了对电动机的高效控制。在某工业驱动系统中,采用了本项目开发的带有矢量控制功能的电励磁同步电动机驱动系统,结合三相逆变器实现了对电动机的精确控制。经过实际测试,该系统的应用使得生产效率提高了10%,并且在高负载条件下,电动机的温升得到了有效控制,延长了电动机的使用寿命。通过本项目的实施,我们成功配置了三相交流电源、三相逆变器和电励磁同步电动机的参数,并实现了对电动机的精确控制。

MHD0815的博客 944

WPF创建自定义窗体

使用wpf能够轻松的制作华丽炫目的程序界面,但是其默认的窗体样式太死板,在win7下看起来还不错,在xp或2003下却显得很不协调;因此我们需要自定义窗体样式,wpf应该如何自定义窗体呢?       最开始我想到的方法,也是最传统的方法,就是是使用模板和样式来自定义窗体,首先设置窗体的WindowStyle为None,然后在Template里定义窗体布局,还需要考虑标题栏拖动、双击最大化、右键

Lassewang的成长历程 2254

OpenMVS :用 colmap制作自己的数据集 重建(用colmap计算位姿,将位姿转为MVS需要的格式)

数据集制作主要是在windows进行,比较方便。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 3325

WPF中自定义窗体标题栏

在WPF中自定义窗体标题栏,首先需要将窗体的WindowStyle属性设置为None,隐藏掉WPF窗体的自带标题栏。然后我们可以在窗体内部自定义一个标题栏,比如标题栏如下: 注意,我们给TitleBar添加了MouseMove事件,后台处理代码: private void TitleBar_MouseMove(object sender, Mouse

孙群 2万+

OpenHarmony WiFi子系统全解析:从架构到代码实现(大合集)

头文件路径[相对路径][相对路径][相对路径][相对路径]// 网络配置结构 (wifi_device_config.h)// SSID字符串// 预共享密钥// 安全类型// 网络ID// 优先级// 是否隐藏网络// 扫描信息结构 (wifi_scan_info.h)// SSID// BSSID (MAC地址)// 安全类型int rssi;// 信号强度// 频率// 信道宽度// 时间戳// 连接信息结构 (wifi_linked_info.h)

m0_67505153的博客 1057

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

WPF 自定义Metro Style窗体

为了使WPF程序在不同版本的操作系统上保持一致的显示效果,我们需要重写WPF控件样式。这篇博客将展示如何创建一个Metro Style的WPF窗体。 首先先看一下最终窗体的效果图, 通过截图我们可以看出来这个窗体由两部分组成,顶部为最小化和关闭按钮,其他区域为窗体的显示区域。请看下面的具体实现代码, MetroWindow样式: %26lt;ResourceDictionary x

macongyun1230的博客 387

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

WPF 自定义窗体

转自:http://blog.youkuaiyun.com/jian200801/article/details/12619379

yulongguiziyao的专栏 820

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

[WPF] 自定义窗体样式

[WPF] 自定义窗体样式<br /> <br />效果图如下:<br /> <br />Code: /Files/lovebread/CustomWindow.rar<br /> <br />实现思路:<br />1.继承Window类<br />2.为自定义的CustomWindow类设计窗体样式(使用Blend很方便!)<br />3.为窗体增加最大最小化和关闭按钮,并实现鼠标拖拽改变窗体大小(使用Derek Bartram的WindowResizer.dll库)<br /> <br />代码说明:<

rise51的专栏 1983

WPF 创建自定义窗体

原文:WPF 创建自定义窗体在前面的一篇博客"WPF 自定义Metro Style窗体",展示了如何创建一个类似于Metro Style的Window,并在程序中使用。但是这个窗体不能够自由的改变大小。今天的博客中将展示如何创建一个可以通过拖拽来改变大小的Metro Style窗体。 实现思路,在Windows ControlTemplate中增加8个背景透明Rectangle,分别放置于Lef...

weixin_34414196的博客 444
上一篇: WPF深入浅出话资源【好】
下一篇: 图解北京户口的经济学意义
HNFXS985
博客等级 码龄14年 219粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值