wpf单容器中的Chrome
2010-04-07 12:42 Clingingboy 阅读(2839) 评论(1) 编辑 收藏 举报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); else dc.DrawRectangle(Brushes.Transparent, null, rectangle); } } } }
现在为止一个背景色就设置好了,从这里回头看Border容器,也是采用用样的做法,WPF内置的Shape也是如此.
之前感觉比较困惑,Shape的呈现可以理解,Button的呈现还无法理解.
内置的Button使用了ButtonChrome,CheckBox使用了BulletChrome.估计其他控件也是如此.所以所有的控件还是一样,都是一点一滴画出来的.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2007-04-07 Subtext--RSS的设计
2007-04-07 Subtext--数据库操作