Beginner’s Tutorial: 3D Line and Border Effects in XAML
This mini-tutorial might be for you if you’re having troubles finding the right line colors to achieve simple 3D effects like these:

The solution to this very problem is actually pretty simple, and it always takes the same three ingredients:
- A white line
- A black line
- Reduced opacity
Basically, to get an edged line on a green background, you don’t need to fiddle with different shades of green. Just use white and black lines and play with the opacity. Here’s the settings in Blend for one of the white lines in the above screenshot:

…and this is the corresponding XAML for the two vertical lines:
<Grid Background="Green">
<Path Stretch="Fill" Stroke="#5A000000" Margin="25,62,0,0"
Width="1" Height="100" Data="M130,176 L130,303.03543"/>
<Path Stretch="Fill" Stroke="#5AFFFFFF" Margin="26,62,0,0"
Width="1" Height="100" Data="M130,176 L130,303.03543"/>
</Grid>
Tip: Hiding Blend’s Handles
If you’re trying to format a line, Blend’s handles don’t help much, as the basically hide the whole content:
![]()
However – you can easily hide / show them by pressing the F9 button.
Tutorial: Creating a 3D Toggle Button Style
Another usage of white and black lines is a 3D effect for borders. Let’s put this to action and create a reusable style that can be applied to a ToggleButton control:

Rather than joining four lines for each button state, I’ll use two Border controls with the same dimensions for each state, taking advantage that the BorderThickness property can be set independently for every edge. Here’s the borders for the unchecked state:
<Grid x:Name="uncheckedState">
<Border BorderBrush="#49FFFFFF" BorderThickness="1,1,0,0"/>
<Border BorderBrush="#49000000" BorderThickness="0,0,1,1"/>
</Grid>
…and here’s the borders for the checked state. Note that its Visibility property of the surrounding grid is set to Collapsed in order to hide the borders:
<Grid x:Name="checkedState" Visibility="Collapsed">
<Border BorderBrush="#49000000" BorderThickness="1,1,0,0"/>
<Border BorderBrush="#49FFFFFF" BorderThickness="0,0,1,1"/>
</Grid>
I put these borders together in a simple style, which uses a trigger to switch the visibility of the two borders as soon as the IsChecked property of the ToggleButton changes:
<Style TargetType="{x:Type ToggleButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Grid x:Name="mainGrid" Margin="0,0,1,1">
<Grid x:Name="uncheckedState">
<Border BorderBrush="#49FFFFFF" BorderThickness="1,1,0,0"/>
<Border BorderBrush="#49000000" BorderThickness="0,0,1,1"/>
</Grid>
<Grid x:Name="checkedState" Visibility="Collapsed">
<Border BorderBrush="#49000000" BorderThickness="1,1,0,0"/>
<Border BorderBrush="#49FFFFFF" BorderThickness="0,0,1,1"/>
</Grid>
<!--
WPF needs a background to toggle IsChecked
if the ContentPresenter does not fill the whole area
-->
<Border Background="#00000000" />
<ContentPresenter VerticalAlignment="Center"
HorizontalAlignment="Center" />
</Grid>
<!-- triggers toggle visual appearance -->
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="checkedState"
Property="Visibility"
Value="Visible" />
<Setter TargetName="uncheckedState"
Property="Visibility"
Value="Collapsed" />
<Setter TargetName="mainGrid"
Property="Margin"
Value="1,1,0,0"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
With the style in place, you can easily declare a ToggleButton like this:
<ToggleButton Width="100" Height="24" Content="hello world" />
Beginner’s Tutorial: 3D Line and Border Effects in XAML的更多相关文章
- 国外60个专业3D模型网站
原始链接:http://blog.sina.com.cn/s/blog_4ba3c7950100jxkh.html Today, 3D models are used in a wide variet ...
- win10 uwp 使用 Matrix3DProjection 进行 3d 投影
原文:win10 uwp 使用 Matrix3DProjection 进行 3d 投影 版权声明:博客已迁移到 http://lindexi.gitee.io 欢迎访问.如果当前博客图片看不到,请到 ...
- 3D分析之3D要素工具箱(转)
来自:http://blog.csdn.net/kikitamoon/article/details/8193764 整理有关 ArcGIS 10.1 3D分析工具箱中,3D Feature 工具箱中 ...
- 3D分析之Functional Surface工具箱(转)
来自:http://blog.csdn.net/kikitamoon/article/details/8195797 1. Add Surface Information(添加表面信息) 向点.线或面 ...
- 论文阅读: Building a 3-D Line-Based Map Using Stereo SLAM
Abstract 一个把直线用作feature的SLAM系统. 跟点相比, 直线对于环境的结构提供了更丰富的信息, 也让其鞥有可能推断地图的空间语义. 使用了Plucker line coordian ...
- Python画各种 3D 图形Matplotlib库
回顾 2D 作图 用赛贝尔曲线作 2d 图.此图是用基于 Matplotlib 的 Path 通过赛贝尔曲线实现的,有对赛贝尔曲线感兴趣的朋友们可以去学习学习,在 matplotlib 中,figur ...
- 3D视觉 之 线激光3D相机
1 3D 视觉 常见的三维视觉技术,包含双目.ToF.激光三角.结构光等,如下图: 1)毫米级 双目.ToF.结构光(散斑)的精度为 mm 级,多见于消费领域,如:导航避障,VR/AR,刷脸 ...
- WPF 3D编程介绍
原文:WPF 3D编程介绍 上一篇文章简单的介绍了WPF编程的相关的内容,也推荐了本书.今天要来讲一下在WPF如何开展3D编程. 使用的xmal 和C#开发的时候:需要使用如下的关键要素: 1:摄像机 ...
- arcmap Command
The information in this document is useful if you are trying to programmatically find a built-in com ...
随机推荐
- AE中地图查询方式
樱木 原文 AE中地图查询方式 地图查询主要有两种查询:空间查询和属性查询 所用到知识点: 1 Cursor(游标)对象 本质上是一个指向数据的指针,本身不包含数据内容,提供一个连接到ROW对象或者 ...
- 大数据(十四) - Storm
storm是一个分布式实时计算引擎 storm/Jstorm的安装.配置.启动差点儿一模一样 storm是twitter开源的 storm的特点 storm支持热部署,即时上限或下线app 能够在st ...
- 【30.93%】【codeforces 558E】A Simple Task
time limit per test5 seconds memory limit per test512 megabytes inputstandard input outputstandard o ...
- [转] Python 爬虫的工具列表 附Github代码下载链接
转自http://www.36dsj.com/archives/36417 这个列表包含与网页抓取和数据处理的Python库 网络 通用 urllib -网络库(stdlib). requests - ...
- Android 从硬件到应用:一步一步向上爬 4 -- 使用 JNI 方法调硬件驱动
Android下,java应用程序通过JNI方法调用硬件抽象层模块,在Android 从硬件到应用:一步一步向上爬 3 -- 硬件抽象层訪问硬件驱动 中我们已经编译好了硬件抽象层模块,以下就要開始为H ...
- SharedPreferences基础 分类: H1_ANDROID 2013-11-04 22:35 2559人阅读 评论(0) 收藏
见归档项目:SharedPreferencesDemo.zip 1.对于数据量较小,且有明显的K-V形式的数据而言,适合用SharedPreferences保存.SharedPreferences的数 ...
- php实现二叉树的镜像(二叉树就是递归)
php实现二叉树的镜像(二叉树就是递归) 一.总结 二叉树就是递归 二.php实现二叉树的镜像 题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / ...
- 【u008】瑞瑞的木棍
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 瑞瑞有一堆的玩具木棍,每根木棍的两端分别被染上了某种颜色,现在他突然有了一个想法,想要把这 些木棍连在 ...
- Ubuntu snmp配置
http://wenku.baidu.com/link?url=7ieAta_w87NDrTOT_DyEQSj4Rd9i82YRUGQl--g077oC3ftckgH7wpT5QEyir-NtZLA3 ...
- C语言学习笔记:12_变量的存储方式和生存期
/* * 12_变量的存储方式和生存期.c * * Created on: 2015年7月5日 * Author: zhong */ #include <stdio.h> #include ...