[WPF] VisualBrush 中的布局
今天插一篇随笔。说一说上周五遇到的一个布局问题,问题大概是这样的:需要在一个快区域上添加一张透明的背景图片,由于区域较大、并且宽高都不是固定大小,图片较小 所以图片需要居中显示。除此之外还需要在图片的透明部分添加一个非透明的纯色。
比如:最终的效果图、如下图所示:
当然如果只是为了实现这种效果、实现方案有多种,至少有三大类:
1、嵌套两个控件、分别应用纯色 和 居中图像。
2、使用 VisualBrush 将组合效果应用在同一个控件的Background上
3、重写控件、将组合效果绘制在Background上。
笔者今天说的是第二种方案:VisualBrush、这个强大的Brush类,它可以将任意Visual元素转化为Brush。
笔者第一次写的代码如下:
<Grid Background="White"><Grid.RowDefinitions><RowDefinition Height="100" /><RowDefinition Height="*" /><RowDefinition Height="100" /></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="100" /><ColumnDefinition Width="*" /><ColumnDefinition Width="100" /></Grid.ColumnDefinitions><Border Grid.Row="1" Grid.Column="1"><Border.Background><VisualBrush><VisualBrush.Visual><Border Background="#455C73"><Image Width="20"Height="20"HorizontalAlignment="Center"VerticalAlignment="Center"Source="img_xiaofangzi.png" /></Border></VisualBrush.Visual></VisualBrush></Border.Background></Border></Grid>
第一次写的代码
看样子应该没多大问题、可出现的效果却不尽人意、图像被拉伸了(并且Image的宽高都失效了):
看到这个效果、我的第一直觉是在 VisualBrush上应用: Stretch="None" :
<Grid Background="White"><Grid.RowDefinitions><RowDefinition Height="100" /><RowDefinition Height="*" /><RowDefinition Height="100" /></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="100" /><ColumnDefinition Width="*" /><ColumnDefinition Width="100" /></Grid.ColumnDefinitions><Border Grid.Row="1" Grid.Column="1"><Border.Background><VisualBrush Stretch="None"><VisualBrush.Visual><Border Background="#455C73"><Image Width="20"Height="20"HorizontalAlignment="Center"VerticalAlignment="Center"Source="img_xiaofangzi.png" /></Border></VisualBrush.Visual></VisualBrush></Border.Background></Border></Grid>
修改后的代码
事实再一次出乎意料:
表现出来的形式:VisualBrush中的Border大小没有填充整个背景色。 并且 Border的小大 和 Image的大小一致,很像是Image的宽高 20 * 20 把 Border撑大了。
在尝试为Broder设置宽高后,效果终于满意了。最终代码:
<Grid Background="White"><Grid.RowDefinitions><RowDefinition Height="100" /><RowDefinition Height="*" /><RowDefinition Height="100" /></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="100" /><ColumnDefinition Width="*" /><ColumnDefinition Width="100" /></Grid.ColumnDefinitions><Border Grid.Row="1" Grid.Column="1"><Border.Background><VisualBrush Stretch="None"><VisualBrush.Visual><Border Width="3000"Height="3000"Background="#455C73"><Image Width="20"Height="20"HorizontalAlignment="Center"VerticalAlignment="Center"Source="img_xiaofangzi.png" /></Border></VisualBrush.Visual></VisualBrush></Border.Background></Border></Grid>
最终代码
当然,代码还是不够完美:由于背景区域的大小不固定,所以设置了一个超大的宽高。
问题解决了,再回头看一下VisualBrush 中的布局、由于 VisualBursh中的Visual的父级是VisualBrush, 它不能为Visual中的根元素提供大小,因此如果应用了 Stretch="None" ,那么就需要手动设置Visual根元素的大小了。这一点在 MSDN 上也可以得到证实。
[WPF] VisualBrush 中的布局相关推荐
- WPF教程六:布局之Grid面板(转)
WPF教程六:布局之Grid面板 Grid:网格面板 Grid顾名思义就是"网格",以表格形式布局元素,对于整个面板上的元素进行布局,它的子控件被放在一个一个事先定义好的小格子里面 ...
- WPF xaml中列表依赖属性的定义
原文:WPF xaml中列表依赖属性的定义 列表内容属性 如上图,是一个列表标题排序控件,我们需要定义一个标题列表,从而让调用方可以自由的设置标题信息. 在自定义控件时,会遇到列表依赖属性,那么该如何 ...
- WPF程序中的XPSDocumentViewer
在.NET 3.0中,提供了对XPS文件格式的全新支持.在WPF程序中,有一个控件是DocumentViewer.这里对它的使用做一个简要介绍 <Window x:Class="Wpf ...
- WPF 3D中多个模型如何设置某一个在最前?
原文:WPF 3D中多个模型如何设置某一个在最前? 问题:我们的模型包括导入的3D solid模型和axis坐标轴模型,当模型旋转的时候,3D会将axis挡住. 期望:axis一直在最前面,不会被3D ...
- Android Studio xml文件中的布局预览视图
操作系统:Windows 10 x64 IDE:Android Studio 3.3.1 更新了Android Studio之后,xml文件中的布局预览视图变得如此简洁! 原因是没有勾选Show La ...
- 【HTML5CSS3进阶学习02】Header的实现·CSS中的布局
前言 我们在手机上布局一般是这个样子的: 其中头部对整个mobile的设计至关重要,而且坑也很多: ① 一般来说整个header是以fixed布局,fixed这个产物在移动端来说本身坑就非常多 ② 在 ...
- DevExpress控件GridControl中的布局详解 【转】
DevExpress控件GridControl中的布局详解 [转] 2012-10-24 13:27:28| 分类: devexpress | 标签:devexpress |举报|字号 订阅 h ...
- android如何引用布局,android 动态布局与引用第三方layout中的布局
引用第三方layout中的布局LinearLayout rightContentView = (LinearLayout) findViewById(R.id.lyt_chat_content); V ...
- c++builder中dbgrid控件排序_如何实现APP中各种布局效果?学会这几个控件就够了...
学习Flutter有一段时间了,也做了一些APP,但是总感觉对控件的使用一知半解,没有系统的概念,所以特意花了几天时间,把所有的控件都研究了一遍,总结出了常用的控件和使用方法, 俗话说:工欲善其事,必 ...
最新文章
- 结构最清晰的Yolov3 head和loss实现完全解析
- 我敢打赌!你见过的所有程序员都是这样的!!!
- 【业务知识】企业数字档案馆总体架构图
- 使用SpringBoot Admin监控SpringCloud微服务
- 工作136:eachrt
- 深度学习(二十一)基于FCN的图像语义分割
- 第二十二课php注入,php第二十三节课
- 大多数人不知道的:线程池CallerRunsPolicy()拒绝策略
- 如何构建React-Native图库教程
- 【问答】开放领域问答梳理(2)
- 使用salt-ssh批量管理主机
- Atitit api design Usability simple 易用性之简单化设计 目录 1. 理论原则	2 1.1. 概念简单	2 1.2. 切换到了“write less, do more
- windows通过注册表修改IP
- dell系统重装后无法进入系统_戴尔系统重装进入bios设置方法
- Excel冻结窗格纪要
- android 纳秒级计时器,RDTSC指令实现纳秒级计时器
- PotPlayer播放器及安装说明
- 零件加工 贪心 题解
- Phonics 自然拼读法 s,a,t,i,p,n Teacher:Lamb
- 【设计模式】我对设计模式的C语言解读(下)
热门文章
- 小菜学设计模式——命令模式
- 云计算里的安全:警惕云服务被恶意利用
- VC++动态链接库(DLL)编程(四)――MFC扩展 DLL
- 基于向量空间的知识图谱查询及结果解释
- Nginx反向代理Tomcat的配置方法
- Java遍历Map对象的四种方法
- java 日期和字符串互转,根据当天整天时间 得到当天最后一秒的日期时间
- asp.net编程:asp.net中如何设置页面的编码
- 推荐一个 Java 实体映射工具 MapStruct
- linux下,redis 3.2.1双节点集群安装部署