【WPF编程宝典】第8讲:形状、画刷和变换

news2024/11/26 19:25:21

        本讲介绍了WPF中的基本形状,包括矩形、椭圆形、直线、折线、多边形、点划线等。还介绍四类画刷的使用。介绍了形状的旋转及移动等变化,元素的旋转及移动等。最后介绍了透明。

1.形状

        WPF支持的形状有:Rectangle,Ellipse,Line,Polyline,Polygon,Path,这些都继承自Shape类,Shape类是抽象类不能执行任何工作,但他定义了少量的重要的属性。

  • Fill:设置绘制形状表面(边框内的所有内容)的画刷对象
  • Stroke:设置绘制形状边缘(边框)的画刷对象
  • StrokeThickness:用设备无关单位设置边框的宽度。当绘制直线时,WPF在两边分割宽度。因此,10个单位宽的直线,会在绘制1个单位宽的直线所在位置的两侧占用5个单位的空间。如果直线的宽度为奇数,直线在两侧的宽度值就会是小数。例如,一条宽度为11个单位的直线,两侧会有5.5 单位的空间。对于这种情况,直线肯定不会和监视器上的显示像素对齐,即使使用 96dpi的分辨率也同样如此,从而最后直线的边缘会具有模糊的反锯齿效果。如果不喜欢,可使用SnapsToDevicePixels属性去掉该效果(正如本章后面12.1.10节“像素对齐”所述)
  • StrokeStartLineGap和StrokeEndLineGap:决定直线开始端和结束端边缘的轮廓。这些属性只影响Line、Polyline 以及(在某些情况下)Path 形状。所有其他形状都是闭合的,没有开始点和结束点
  • StrokeDashArray、StrokeDashOffset和StrokeDashGap:用于在形状周围创建点划线边框。可控制点划线的尺寸和频率,以及每条点划线开始端和结束端边缘的轮廓
  • StrokeLineJoin和StrokeMiterLimit:确定形状拐角处的轮廓。从技术角度看,这些属性影响不同直线相遇的顶点,如矩形的拐角。对于没有拐角的形状,如Line和Ellipse,这些属性不起作用
  • Stretch:确定形状如何填充可用的区域。可使用该属性创建能够扩展以适合其容器的形状。还可为 HorizontalAlignment 或 VerticalAlignmet 属性(这些属性继承自FrameworkElement 类)使用 Stretch 值强制形状在某个方向上扩展
  • DefiningGeometry:为形状提供 Geometry 对象。Geometry 对象描述了形状的坐标和尺寸,不包括 UIElcment类的相关内容,例如对键盘和鼠标事件的支持。
  • GeometryTransform:可通过该属性应用 Transform对象,改变用于绘制形状的坐标系统,从而可扭曲、旋转或移动形状。当为图形应用动画时,变换特别有用。稍后将介绍与变换相关的内容
  • RenderedGeometry:提供描述最终的、已渲染好的图形的Geomety对象。第13章将介绍 Geomety 对象

1.1改变形状和尺寸

  • 通过硬编码直接设置Height和Width属性。
  • 使用StackPanel和Grid等布局控件,然后Fill。
  • 使用Canvas容器。顺序越后,越置顶。缺点是固定大小,无法改变自身的尺寸适应不同的窗口大小。
  • 使用Viewbox控件。继承自Decorator。通常在Viewbox控件中放置Canvas面板,并在Canvas面板中放置形状。从而实现随着窗口的变化控件形状的变化。

1.2矩形和椭圆

        注意:如果未设置Stroke或Fill属性,形状就不会显示。

1.3直线

  • 对于直线,Fill属性不起作用,必须设置Stroke属性。
  • 在直线中使用的坐标是相对于放置直线的矩形区域左上角的坐标。
  • 直线设置 Margin、HorizontalAlignment 以及 VerticalAlignment 属性是没有意义的,因为它们没有任何效果。对于 Polyline 和 Polygon 形状具有同样的限制。
<Line Stroke="Blue" X1="0" Y1="0" X2="10" Y2="100"/>

//更改线起始和结束的形状
<Line Stroke="Blue" X1="0" Y1="0" X2="10" Y2="100" StrokeStartLineCap="Round" StrokeEndLineCap="Triangle"/>

1.4折线

  • 可以绘制一系列相互连接的直线。
  • 只需要通过points属性提供点的列表,并在每个坐标之间添加空格或逗号。
<Polyline Stroke="Blue" StrokeThickness="5" Points="10,150 30,140 50,160 70,130 90,170 110,120 130,180 150,110 170,190 190,100 210,240"/>

//更改起始和结束形状
<Polyline Stroke="Blue" StrokeThickness="5" StrokeStartLineCap="Round" StrokeEndLineCap="Triangle" Points="10,150 30,140 50,160 70,130 90,170 110,120 130,180 150,110 170,190 190,100 210,240"/>

1.5多边形

  • 添加最后一天线段,将最后一个点与开始点连接。
  • 可以使用Fill填充内部颜色。
  • 下面代码绘制五角星。
<Polygon Stroke="BlueViolet" StrokeThickness="1" Fill="YellowGreen"
         FillRule="Nonzero" Points="15,200 68,70 110,200 0,125 135,125"/>

1.6点划线

  • 可通过设置StrokeDashArray绘制断开的点划线。
  • StrokeDashArray还可以使用费整数值,如StrokeDashArray=“5 0.2 3 0.2”(代表)
  • 如果想从中间开始绘制,可使用StrokeDashOffset属性。
// 点划线的实线长度值为1,空白长度值为2,这些都是相对于直线宽度的。
// 直线宽度为14个单位,实线部分的长度就位14个单位,空白部分就是28个单位,依次重复。
<Polyline Stroke="Blue" StrokeThickness="14" StrokeDashArray="1 2"
          Points="10,30 60,0 90,40 120,10 350,10"/>

// 这样的设置提供了更复杂序列:5x14单位长的点划线,然后是0.2x15单位长的空白
// 接下来是 3x14单位长的实线和0.2x14单位长的空白。在该序列的尾部,直线从头开始重复该模式。
<Polyline Stroke="Blue" StrokeThickness="14" StrokeDashArray="5 0.2 3 0.2"
          Points="10,30 60,0 90,40 120,10 350,10"/>

// 当StrokeDashArray属性提供奇数个数值时。WPF首先绘制3倍直线宽度长的实线,然后是0.5倍直线宽度长的空白,再接下来是2倍直线宽度长的实线。但当再从头开始重复该模式时,首先是3倍直线宽度长的空白,接着是05倍直线宽度长的实线,依此类推。本质上,点划线在线段和空白之间交替其模式。
<Polyline Stroke="Blue" StrokeThickness="14" StrokeDashArray="3 0.5 2"
          Points="10,30 60,0 90,40 120,10 350,10"/>

2.画刷

        最简单的画刷类型是SolidColorBrush,xaml中设置形状的stroke或fill属性时,使用的是SolidColorBrush,它在后台完成绘制。

  • 画刷支持更改通知,因为它们继承自Freezable类。因此,如果改变了画刷,任何使用画
    刷的元素都会自动重新绘制自身。
  • 画刷支持部分透明。为此,只需要修改 Opacity 属性,使背景能够透过前面的内容进行显
    示。本章末尾会尝试这种方法。
  • 通过 SystemBrushes 类可以访问这样的画刷:此类画刷使用 Windows 系统设置为当前计
    算机定义的首选颜色。

        所有画刷都位于System.Windows.Media名称空间中,常见的继承自System.Windows.Media.Brush的类。

  • SolidColorBrush:使用单一的连续颜色绘制区域
  • LinearGradientBrush:使用渐变填充绘制区域,渐变的阴影填充从一种颜色变化到另一种颜色(并且,也可以在变化到第3种颜色之后再变化到第4种颜色,依此类推)
  • RadialGradientBrush:使用径向渐变填充绘制区域,除了是在圆形模式中从中心点向外部辐射渐变之外,这种画刷和线性渐变画刷类似
  • ImageBrush:使用可被拉伸、缩放或平铺的图像绘制区域
  • DrawingBrush:使用 Drawing 对象绘制区域,该对象可以包含已经定义的形状和位图
  • VisualBrush:使用 Visual 对象绘制区域。因为所有 WPF 元素都继承自 Visual 类,所以可使用该画刷将部分用户界面(如按钮的表面)复制到另一个区域。当创建特殊效果时,比如部分反射效果,该画刷特别有用
  • BitmapCacheBrush:使用从 Visual 对象缓存的内容绘制区域。这种画刷和 VisualBrush 类似,但如果需要在多个地方重用图形内容或者频繁地重绘图形内容,这种画刷更高效

2.1SolidColorBrush

<Button Height="50">
    <Button.Background>
         <SolidColorBrush Color="Aquamarine"/>
    </Button.Background>
</Button>

2.2LinearGradientBrush

  • offset:控制比例,从0-1。
  • StartPoint="0 0" EndPoint="1 0"控制方向,引号内的值为X,Y值。(0,0)代表左上角,(1,1)代表右下角,可以理解为比例坐标。
  • 可以使用SolidColorBrush的地方都可以使用LinearGradientBrush。
<Button Height="50">
    <Button.Background>
        <LinearGradientBrush StartPoint="0 0" EndPoint="1 0">
            <GradientStop Color="BurlyWood" Offset="0"/>
            <GradientStop Color="Red" Offset="0.5"/>
            <GradientStop Color="DarkGreen" Offset="1"/>
        </LinearGradientBrush>
    </Button.Background>
</Button>

2.3RadialGradientBrush

  • center,RadiusX和RadiusY联合设置内部渐变圆的边界。默认下center为(0.5,0.5),默认下RadiusX和RadiusY也是0.5。
<Ellipse Margin="5" Stroke="Black" StrokeThickness="1" Width="200" Height="200">
    <Ellipse.Fill>
        <RadialGradientBrush RadiusX="1" RadiusY="1" GradientOrigin="0.7 0.3" Center="1 1">
            <GradientStop Color="White" Offset="0"/>
            <GradientStop Color="Blue" Offset="1"/>
        </RadialGradientBrush>
    </Ellipse.Fill>
</Ellipse>

2.4ImageBrush

  • 属性Stretch,TileMode,Viewport,ViewPortUnits可更改布局方式
<StackPanel>
    <StackPanel.Background>
        <ImageBrush ImageSource="/Images/user-circle.png"/>
    </StackPanel.Background>
</StackPanel>

3.变换

        变换继承自System.Windows.Media.Transform。所有变换都继承自Freezable类,因此支持自动更改通知功能。主要有以下类。

  • TranslateTransform:将坐标系统移动一定距离。如果希望在不同的地方绘制相同的形状,该变换非常有用。重要属性X、Y。
  • RotateTransform:旋转坐标系统。正常绘制的形状绕着选择的中心点旋转。重要属性Angle、CenterX、CenterY。
  • ScaleTransform:放大或缩小坐标系统,从而绘制更大或更小的图形。可在X和Y方向应用不同的缩放度,从而拉伸或压缩形状。重要属性ScaleX、ScaleY、CenterX、CenterY。
  • SkewTransform:通过倾斜一定的角度扭曲坐标系统。例如,如果绘制正方形通过该变换正方形会变成平行四边形。重要属性AngleX、AngleY、CenterX、CenterY。
  • MatrixTransform:使用提供的矩阵的乘积修改坐标系统。这是最复杂的选择-为实现该变换,需要掌握一些数学技巧。重要属性Matrix。
  • TransformGroup:组合多个变换,从而可以一次应用所有这些变换。应用变换的顺序是很重要的,因为这会影响最终结果。例如,首先使用RotateTransform旋转形状,然后使用TranslateTransform移动形状,这样做的结果和先移动再旋转的结果是不同的。

3.1变化形状

  • RotateTransform,centerX和centerY是使用的绝对坐标。可通过TransformOrigin属性设置相对坐标。(0,0)为左上角,(1,1)为右下角。
<!--绕原点旋转25度-->
<Rectangle Width="80" Height="10" Stroke="blue" Fill="Yellow" InkCanvas.Left="100" InkCanvas.Top="100">
    <Rectangle.RenderTransform>
        <RotateTransform Angle="25"/>
    </Rectangle.RenderTransform>
</Rectangle>

<!--绕45,5点旋转45度-->
<Rectangle Width="80" Height="10" Stroke="blue" Fill="Yellow" InkCanvas.Left="100" InkCanvas.Top="100">
    <Rectangle.RenderTransform>
        <RotateTransform Angle="45" CenterX="45" CenterY="5"/>
    </Rectangle.RenderTransform>
</Rectangle>

<!--绕中心点旋转45度-->
<Rectangle Width="80" Height="10" Stroke="blue" Fill="Yellow" 
           InkCanvas.Left="100" InkCanvas.Top="100" RenderTransformOrigin="0.5 0.5">
    <Rectangle.RenderTransform>
        <RotateTransform Angle="45"/>
    </Rectangle.RenderTransform>
</Rectangle>

3.2变换元素

        RenderTransform 和 RenderTransformOrigin 属性并不限制只能用于形状。实际上,Shape 类的这些属性从 UIElement类继承而来,这意味着所有 WPF 元素都支持这两个属性,包括按钮、文本框、TextBlock 控件、充满内容的整个布局容器等。令人感到惊讶的是,可旋转、扭曲以及缩放 WPF 用户界面中的任意一部分(尽管在大多数情况下不会这么做)。

        只有很少几个元素不能被变换,因为它们的呈现工作并非由 WPF 本身负责。不能被变换的
元素的两个例子是 WindowsFormHost和 WebBrower 元素,WindowsFormHost 元素用于在 WPF
窗口中放置 Windows 窗体控件,WebBrower 元素用于显示 HTML 内容。

4.透明

4.1元素透明

  • 设置元素的 Opacity 属性。每个元素(包括形状)都从 UIElement基类继承了 Opacity 属性。不透明度(Opacity)是0到1之间的小数,1表示完全不透明(默认值),0表示完全透明。例如,不透明度 0.9 会创建 90%可见(10%透明)的效果。当使用这种方法设置不透明度时,设置会被应用于整个元素的可见内容。
  • 设置画刷的 Opacity属性。每个画刷也从 Bnush 基类继承了 Opacity 属性。可使用0到1之间的值设置该属性,以控制使用画刷绘制的内容的透明度--不管是固定颜色画刷、渐变画刷,还是某种类型的纹理或图像画刷。因为可为形状的 Stroke 和 Fi 属性使用不同的画刷,所以可为边框和表面区域设置不同程度的透明度。
  • 使用具有透明 Alpha 值的颜色。所有 alpha 值小于 255 的颜色都是半透明的。例如,可在SolidColorBrush 画刷中使用半透明颜色,并使用该画刷绘制元素的前景内容和背景表面在有些情况下,使用半透明颜色比设置 Opacity 属性执行得更好。

4.2透明掩码

        Opacity 属性使元素的所有内容都是部分透明的。OpacityMask属性提供了更大的灵活性。可使元素的特定区域透明或部分透明,从而实现各种常见的以及新颖的效果。例如,可使用OpacityMask属性将形状逐渐褪色到完全透明。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1796949.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码签名证书申请流程

在当今的软件开发与分发过程中&#xff0c;确保代码的安全性和可信度变得至关重要。代码签名证书作为这一安全机制的重要组成部分&#xff0c;不仅帮助开发者保护其软件免遭恶意篡改&#xff0c;也为用户提供了验证软件来源和完整性的手段。 一、什么是代码签名证书 代码签名…

【MySQL】数据库的增删查改

文章目录 前言1. 新增1.1 全插入1.2 指定某些列名插入1.3 多行插入1.4 边查询边插入 2. 约束2.1 非空约束2.2 唯一性约束2.3 默认值约束2.4 主键约束2.5 外键约束2.6 check 约束2.7 外键的逻辑删除 3. 查询 - 初阶3.1 全列查询3.2 指定列查询3.3 指定表达式查询3.4 别名查询3.5…

基于不确定性的相互学习 用于联合医学图像分类和分割

文章目录 Uncertainty-Informed Mutual Learning for Joint Medical Image Classification and Segmentation摘要方法实验结果 Uncertainty-Informed Mutual Learning for Joint Medical Image Classification and Segmentation 摘要 该论文提出了一种基于不确定性的相互学习…

互联网轻量级框架整合之SpringMVC初始化及各组件工作原理

Spring MVC的初始化和流程 MVC理念的发展 SpringMVC是Spring提供给Web应用领域的框架设计&#xff0c;MVC分别是Model-View-Controller的缩写&#xff0c;它是一个设计理念&#xff0c;不仅仅存在于Java中&#xff0c;各类语言及开发均可用&#xff0c;其运转流程和各组件的应…

华为机考入门python3--(33)牛客33-图片整理

分类&#xff1a;排序 知识点&#xff1a; 对字符串中的字符ASCII码排序 sorted(my_str) 题目来自【牛客】 def sort_images(s):# 可以使用ord(A)求A的ASCII值&#xff0c;需要注意的是A的值&#xff08;65&#xff09;比a的值小&#xff08;97&#xff09;sorted_images …

QT4-QT5升级(3)GBK-UTF-8-乱码“常量中有换行符”

乱码有两种&#xff1a;我命名为汉字乱码菱形乱码如下&#xff1a; 1.文件编码为&#xff1a; GB2312 打开编码&#xff1a; GB2312 编译后&#xff1a; QString 部分字符串 常量中有换行符 char * …

【WEEK15】 【DAY3】定时任务【中文版】

2024.6.5 Wednesday 接上文【WEEK15】 【DAY2】【DAY3】邮件任务【中文版】 目录 17.异步、定时、邮件任务17.3.定时任务17.3.1.两个注解&#xff1a;17.3.2.Cron表达式17.3.3.修改Springboot09TestApplication.java开启定时功能的注解17.3.4.新建ScheduledService.java17.3.5.…

操作系统教材第6版——个人笔记5

3.2 单连续分区存储管理 3.2.1 单连续分区存储管理 单连续分区存储管理 每个进程占用一个物理上完全连续的存储空间(区域) 单用户连续分区存储管理固定分区存储管理可变分区存储管理 单用户连续分区存储管理 主存区域划分为系统区与用户区设置一个栅栏寄存器界分两个区域…

搜索与图论:有向图的拓扑序列

搜索与图论&#xff1a;有向图的拓扑序列 题目描述参考代码 题目描述 输入样例 3 3 1 2 2 3 1 3输出样例 1 2 3 参考代码 #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N 100010;int n, m; int h[N], e…

城镇污水处理设施运维服务认证

初次申请认证时需提交的文件/资料 1、通用文件/资料(证明文件复印件需签字盖公章) ☐ 营业执照复印件、统一社会信用代码/组织机构代码证复印件 ☐ 增值税一般纳税人资格证复印件&#xff0c;或其他增值税一般纳税人资格认定文件复印件 ☐ 资质 或 许可证 复印件&#x…

Mac屏幕截图软件

一、简介&#xff08;有小伙伴留言说想要mac的屏幕截图软件&#xff0c;今天给大家分享一个还不错的&#xff09; 1、一个功能丰富的功能丰富的截图工具&#xff0c;具有许多高级功能&#xff0c;免费。用于快速拍摄并将它们组织成集合。Snappy还支持注释&#xff0c;共享&…

基于Vue的前端瀑布流布局组件的设计与实现

摘要 随着前端技术的不断演进&#xff0c;复杂业务场景和多次迭代后的产品对组件化开发提出了更高的要求。传统的整块应用开发方式已无法满足快速迭代和高效维护的需求。因此&#xff0c;本文将介绍一款基于Vue的瀑布流布局组件&#xff0c;旨在通过组件化开发提升开发效率和降…

免费插件集-illustrator插件-Ai插件-文本对象合并

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;进行文本对象合并。首先从下载网址下载这款插件 https://download.csdn.net/download/m0_67316550/87890501&…

树莓派与 Hailo 合作推出 AI套件

Raspberry Pi 与 Hailo Raspberry Pi 与 Hailo 公司合作开发&#xff0c;推出了一款售价 70 美元的扩展套件 它提供了一种便捷的方法&#xff0c;可将本地高性能、高能效推理集成到各种应用中&#xff0c;适用于 Raspberry Pi 5。 Raspberry Pi AI Kit 搭载了最新发布的 Ras…

k8s牛客面经篇

k8s的pod版块: k8s的网络版块: k8s的deployment版块: k8s的service版块: k8s的探针板块: k8s的控制调度板块: k8s的日志监控板块: k8s的流量转发板块: k8s的宏观版块:

PyQt5学习系列之基础知识“字典”

PyQt5学习系列之基础知识——字典” 啰嗦字典使用字典取值与赋值其他使用 总结 啰嗦 在项目中使用到解析数据存放在字典中&#xff0c;对字典中的数据进行数据转化。即需要使用到字典&#xff0c;并对字典中的数据取值。 字典 一种可变容器模型存储任意类型对象每个键值对&am…

德勤:税务合规要求下的税务技术应用分析

随着全球税务环境的不断变化&#xff0c;企业面临的税务合规压力日益增加。为应对复杂的税务法规和合规要求&#xff0c;企业需要依赖先进的税务技术&#xff0c;以确保税务数据的准确性和及时性&#xff0c;优化税务管理流程&#xff0c;提高税务透明度&#xff0c;并降低税务…

22. 计算机网络 - 物理层

通信方式带通调制 通信方式 根据信息在传输线上的传送方向&#xff0c;分为以下三种通信方式&#xff1a; 单工通信&#xff1a;单向传输半双工通信&#xff1a;双向交替传输全双工通信&#xff1a;双向同时传输 带通调制 模拟信号是连续的信号&#xff0c;数字信号是离散的…

详细分析Mysql中的 JSON_ARRAYAGG 基本知识(附Demo)

目录 1. 基本知识2. Demo2.1 简单聚合2.2 带排序聚合2.2.1 子查询进行排序2.2.2 创建临时表 2.3 带条件聚合2.4 多列聚合2.5 嵌套 JSON 结构 1. 基本知识 JSON_ARRAYAGG为 SQL 聚合函数&#xff0c;用于将一组值聚合为一个 JSON 数组 多行结果组合成一个 JSON 数组形式的场景…

第100+10步 ChatGPT文献复现:ARIMA-ERNN预测百日咳

基于WIN10的64位系统演示 一、写在前面 我们来继续这篇文章&#xff1a; 《BMC Public Health》杂志的2022年一篇题目为《ARIMA and ARIMA-ERNN models for prediction of pertussis incidence in mainland China from 2004 to 2021》文章的模拟数据做案例。 这文章做的是用…