Chrome有点类似于用GDI+画图一般,除了模板,也可以使用DrawingContext对象来画图.

WPF内置的很多控件都是如此实现的,虽然麻烦了一些,可能是为了提升性能考虑.

其方式与定义样式模板差不多,只不过换成代码形式了.

1.先定义控件不同状态下的颜色,

private static SolidColorBrush CommonDisabledBackgroundOverlay {get {if (commonDisabledBackgroundOverlay == null) {lock (resourceAccess) {if (commonDisabledBackgroundOverlay == null) {SolidColorBrush brush = new SolidColorBrush(Color.FromRgb(0xf4, 0xf4, 0xf4));brush.Freeze();commonDisabledBackgroundOverlay = brush;}}}return commonDisabledBackgroundOverlay;}
}

2.定义控件样式状态

private Brush BackgroundOverlay {get {if (!base.IsEnabled) {return CommonDisabledBackgroundOverlay;}if (!this.Animates) {if (this.RenderPressed) {return CommonPressedBackgroundOverlay;}if (this.RenderMouseOver) {return CommonHoverBackgroundOverlay;}return null;}        return null; }
}

3.在OnRender方法中呈现样式

private void DrawBackground(DrawingContext dc, ref Rect bounds)
{if (base.IsEnabled || Corners.None != this.RoundCorners){Brush background = this.Background;if (background == null) background = this.BackgroundOverlay;if ((bounds.Width > 4.0) && (bounds.Height > 4.0)){Rect rectangle = new Rect(bounds.Left + 1.0, bounds.Top + 1.0, bounds.Width - 2.0, bounds.Height - 2.0);if (background != null){if (!this.RenderTransparentBackground || this.RenderDefaulted || this.RenderMouseOver || this.RenderPressed)dc.DrawRectangle(background, null, rectangle);elsedc.DrawRectangle(Brushes.Transparent, null, rectangle);}}}
}

现在为止一个背景色就设置好了,从这里回头看Border容器,也是采用用样的做法,WPF内置的Shape也是如此.

之前感觉比较困惑,Shape的呈现可以理解,Button的呈现还无法理解.
内置的Button使用了ButtonChrome,CheckBox使用了BulletChrome.估计其他控件也是如此.所以所有的控件还是一样,都是一点一滴画出来的.

转载于:https://www.cnblogs.com/Clingingboy/archive/2010/04/07/1706204.html

wpf单容器中的Chrome相关推荐

  1. 头条一面:Spring IOC容器中只存放单例Bean吗?

    最近,很多小伙伴出去面试,感觉自己面的不是很理想,回来后,不少小伙伴把面试题做了记录发给我,让我给大家解析下,然后发出来.当我看到这些面试题时,快速在脑海中构建起了整个知识体系,从基础到框架.从分布式 ...

  2. WPF遍历当前容器中某种控件的方法

    原文:WPF遍历当前容器中某种控件的方法 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37591671/article/details/79 ...

  3. Linux中以单容器部署Nginx+ASP.NET Core

    正如 前文提到的,强烈推荐在生产环境中使用反向代理服务器转发请求到Kestrel Http服务器,本文将会实践将Nginx --->ASP.NET Core 部署架构容器化的过程. Nginx- ...

  4. Spring容器中 singleton 单例、 prototype多例

    项目开发中通常会使用:singleton 单例. prototype多例 Singleton: 在一个spring容器中,对象只有一个实例.(默认值) Prototype: 在一个spring容器中, ...

  5. 年度巨献-WPF项目开发过程中WPF小知识点汇总(原创+摘抄)

    WPF中Style的使用 Styel在英文中解释为"样式",在Web开发中,css为层叠样式表,自从.net3.0推出WPF以来,WPF也有样式一说,通过设置样式,使其WPF控件外 ...

  6. c# 火狐浏览器怎么嵌入窗体中_C#WinForm窗体内Panel容器中嵌入子窗体、程序主窗体设计例子...

    C#WinForm父级窗体内Panel容器中嵌入子窗体.程序主窗体设计例子 在项目开发中经常遇到父级窗体嵌入子窗体所以写了一个例子程序,顺便大概划分了下界面模块和配色,不足之处还望指点 主窗体窗体采用 ...

  7. 给容器中注册组件 || @Scope -- @Lazy -- @Conditional({Condition}) -- @Import--使用Spring提供的 FactoryBean

    * @Scope:调整作用域    * prototype:多实例的:ioc容器启动并不会去调用方法创建对象放在容器中.       *              每次获取的时候才会调用方法创建对象: ...

  8. html css 表格自动高度,HTML/CSS - 具有固定高度的容器中表格单元格的高度不一致...

    我有一个使用HTML/CSS设置的表格,它位于正在变成手风琴的UL的LI元素中.问题是,当LI元素动画到特定高度时,它会改变表格单元格的高度,使最后一个元素隐藏起来.HTML/CSS - 具有固定高度 ...

  9. spring注解开发:容器中注册组件方式

    1.包扫描+组件标注注解 使用到的注解如下,主要针对自己写的类 @Controller @Service @Repository @Component @ComponentScan 参考 spring ...

最新文章

  1. Linux内核进程调度的时机和进程切换
  2. 80后,从爱情,到婚姻
  3. linux后门查杀工具付费,查杀linux后门跑虚拟货币程序.md
  4. 福建师范大学计算机组成原理期末试卷,福建师范大学2020年8月课程考试《计算机组成原理》作业考核试题...
  5. [C++] this指针
  6. 用PHP写一个最简单的解释器Part1
  7. php代码审计步骤,php代码审计(一)-----调试函数
  8. cors 前后端分离跨域问题_前后端分离之CORS跨域访问踩坑总结
  9. 面试题 02.06. 回文链表
  10. 闪回flashback table配合flashback versions query的注意事项
  11. group by调优的一些测试
  12. 厉害了!「00后缩写黑话翻译器」登上GitHub热榜,中年网民终于能看懂年轻人的awsl...
  13. 神经网络的过拟合是什么,神经网络过拟合的表现
  14. pandas算加权平均值_python – 为pandas中的不规则时间序列创建加权平均值
  15. 读书笔记:《吴军阅读与写作讲义》
  16. ctf 命令执行总结
  17. 漫谈高数 特征向量物理意义
  18. unity资源包导入错误 Failed to import package with error Couldnt decompress package
  19. Netsuite设置中文多语言
  20. 微信小程序页面跳转无效

热门文章

  1. php代码审计之MetInfo5.3盲注
  2. hdu 3622 Bomb Game【二分+2-SAT+tarjan】
  3. Axure RP Extension for Chrome安装
  4. js如何生成一个对象,并转化为json字符串
  5. hihocoder #1333 : 平衡树·Splay2
  6. ORACLE触发器具体解释
  7. Object C学习笔记20-结构体
  8. Visual C++ 编译器选项
  9. 算法--运算的最小翻转次数
  10. RecycleView 源码解析