今天插一篇随笔。说一说上周五遇到的一个布局问题,问题大概是这样的:需要在一个快区域上添加一张透明的背景图片,由于区域较大、并且宽高都不是固定大小,图片较小 所以图片需要居中显示。除此之外还需要在图片的透明部分添加一个非透明的纯色。

比如:最终的效果图、如下图所示:

当然如果只是为了实现这种效果、实现方案有多种,至少有三大类:

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 中的布局相关推荐

  1. WPF教程六:布局之Grid面板(转)

    WPF教程六:布局之Grid面板 Grid:网格面板 Grid顾名思义就是"网格",以表格形式布局元素,对于整个面板上的元素进行布局,它的子控件被放在一个一个事先定义好的小格子里面 ...

  2. WPF xaml中列表依赖属性的定义

    原文:WPF xaml中列表依赖属性的定义 列表内容属性 如上图,是一个列表标题排序控件,我们需要定义一个标题列表,从而让调用方可以自由的设置标题信息. 在自定义控件时,会遇到列表依赖属性,那么该如何 ...

  3. WPF程序中的XPSDocumentViewer

    在.NET 3.0中,提供了对XPS文件格式的全新支持.在WPF程序中,有一个控件是DocumentViewer.这里对它的使用做一个简要介绍 <Window x:Class="Wpf ...

  4. WPF 3D中多个模型如何设置某一个在最前?

    原文:WPF 3D中多个模型如何设置某一个在最前? 问题:我们的模型包括导入的3D solid模型和axis坐标轴模型,当模型旋转的时候,3D会将axis挡住. 期望:axis一直在最前面,不会被3D ...

  5. Android Studio xml文件中的布局预览视图

    操作系统:Windows 10 x64 IDE:Android Studio 3.3.1 更新了Android Studio之后,xml文件中的布局预览视图变得如此简洁! 原因是没有勾选Show La ...

  6. 【HTML5CSS3进阶学习02】Header的实现·CSS中的布局

    前言 我们在手机上布局一般是这个样子的: 其中头部对整个mobile的设计至关重要,而且坑也很多: ① 一般来说整个header是以fixed布局,fixed这个产物在移动端来说本身坑就非常多 ② 在 ...

  7. DevExpress控件GridControl中的布局详解 【转】

    DevExpress控件GridControl中的布局详解 [转] 2012-10-24 13:27:28|  分类: devexpress |  标签:devexpress  |举报|字号 订阅 h ...

  8. android如何引用布局,android 动态布局与引用第三方layout中的布局

    引用第三方layout中的布局LinearLayout rightContentView = (LinearLayout) findViewById(R.id.lyt_chat_content); V ...

  9. c++builder中dbgrid控件排序_如何实现APP中各种布局效果?学会这几个控件就够了...

    学习Flutter有一段时间了,也做了一些APP,但是总感觉对控件的使用一知半解,没有系统的概念,所以特意花了几天时间,把所有的控件都研究了一遍,总结出了常用的控件和使用方法, 俗话说:工欲善其事,必 ...

最新文章

  1. 结构最清晰的Yolov3 head和loss实现完全解析
  2. 我敢打赌!你见过的所有程序员都是这样的!!!
  3. 【业务知识】企业数字档案馆总体架构图
  4. 使用SpringBoot Admin监控SpringCloud微服务
  5. 工作136:eachrt
  6. 深度学习(二十一)基于FCN的图像语义分割
  7. 第二十二课php注入,php第二十三节课
  8. 大多数人不知道的:线程池CallerRunsPolicy()拒绝策略
  9. 如何构建React-Native图库教程
  10. 【问答】开放领域问答梳理(2)
  11. 使用salt-ssh批量管理主机
  12. Atitit api design Usability simple 易用性之简单化设计 目录 1. 理论原则 2 1.1. 概念简单 2 1.2. 切换到了“write less, do more
  13. windows通过注册表修改IP
  14. dell系统重装后无法进入系统_戴尔系统重装进入bios设置方法
  15. Excel冻结窗格纪要
  16. android 纳秒级计时器,RDTSC指令实现纳秒级计时器
  17. PotPlayer播放器及安装说明
  18. 零件加工 贪心 题解
  19. Phonics 自然拼读法 s,a,t,i,p,n Teacher:Lamb
  20. 【设计模式】我对设计模式的C语言解读(下)

热门文章

  1. 小菜学设计模式——命令模式
  2. 云计算里的安全:警惕云服务被恶意利用
  3. VC++动态链接库(DLL)编程(四)――MFC扩展 DLL
  4. 基于向量空间的知识图谱查询及结果解释
  5. Nginx反向代理Tomcat的配置方法
  6. Java遍历Map对象的四种方法
  7. java 日期和字符串互转,根据当天整天时间 得到当天最后一秒的日期时间
  8. asp.net编程:asp.net中如何设置页面的编码
  9. 推荐一个 Java 实体映射工具 MapStruct
  10. linux下,redis 3.2.1双节点集群安装部署