不可不知的WPF画笔(Brush)

news/2024/9/21 12:28:22/文章来源:https://www.cnblogs.com/hsiang/p/18385440

在WPF中,屏幕上的所有内容,都是通过画笔(Brush)画上去的。如按钮的背景色,边框,文本框的前景和形状填充。借助画笔,可以绘制页面上的所有UI对象。不同画笔具有不同类型的输出( 如:某些画笔使用纯色绘制区域,其他画笔使用渐变、图案、图像或绘图)。

Brush位于System.Windows.Media命名空间,Brush是一个abstract修饰的抽象类,所以必须使用其派生类。

 

纯色画笔(SolidColorBrush)

 

SolidColorBrush使用纯Color绘制区域,有多种方法可以制定纯色画笔的颜色,如使用A(Alpha)R(红色)G(绿色)B(蓝色)颜色通道来定义颜色,或者使用系统预定义颜色。

SolidColorBrush可以通过构造函数进行赋值,接收一个Color类型的参数。或者通过Color属性进行赋值。如下所示:

Color color = Colors.Red;//系统预定义颜色
SolidColorBrush brush = new SolidColorBrush(color);//方法1:通过构造函数传入颜色Color color2 = Color.FromArgb(0xFF,0x00,0xFF,0x00);//通过ARGB值进行定义颜色
SolidColorBrush brush2= new SolidColorBrush();
brush2.Color = color2;//方法2:直接对颜色进行赋值Rectangle rectangle = new Rectangle();
rectangle.Width = 100;
rectangle.Height = 100;
rectangle.Fill = brush;
rectangle.Stroke = brush2;
rectangle.StrokeThickness = 1;

上述C#代码使用XAML定义,如下所示:

<Rectangle Width="75" Height="75"><Rectangle.Fill><SolidColorBrush Color="Red" /></Rectangle.Fill>
</Rectangle>

 

线性渐变画笔(LinearGradientBrush)

 

LinearGradientBrush使用线性渐变色彩绘制图形,线性渐变在一根线条(渐变轴)中混合了两种或更多颜色。可以使用 GradientStop 对象指定渐变的颜色及其位置。

LinearGradientBrush linearGradientBrush = new LinearGradientBrush();
linearGradientBrush.GradientStops.Add(new GradientStop(Colors.Red, 0));
linearGradientBrush.GradientStops.Add(new GradientStop(Colors.Orange, 0.5));
linearGradientBrush.GradientStops.Add(new GradientStop(Colors.Yellow, 1));
Rectangle rectangle = new Rectangle();
rectangle.Width = 100;
rectangle.Height = 100;
rectangle.Fill = linearGradientBrush;

说明:LinearGradientBrush的GradientStops属性是一个GradientStopCollection类型的对象,用来接收GradientStop对象,表示渐变的颜色列表。其中GradientStop有两个属性:Color颜色和offset偏移量。

上述C#代码使用XAML定义,如下所示:

<Rectangle Width="75" Height="75"><Rectangle.Fill><LinearGradientBrush><GradientStop Color="Yellow" Offset="0.0" /><GradientStop Color="Orange" Offset="0.5" /><GradientStop Color="Red" Offset="1.0" /></LinearGradientBrush></Rectangle.Fill>
</Rectangle>

 

径向渐变画笔(RadialGradientBrush)

RadialGradientBrush使用径向渐变绘制区域,径向渐变将两种或多种颜色混合在一个圆圈中,由里向外进行扩散。 与 LinearGradientBrush 类一样,可以使用 GradientStop 对象指定渐变的颜色及其位置。

RadialGradientBrush radialGradientBrush = new RadialGradientBrush();
radialGradientBrush.GradientStops.Add(new GradientStop(Colors.Red, 0));
radialGradientBrush.GradientStops.Add(new GradientStop(Colors.Orange, 0.5));
radialGradientBrush.GradientStops.Add(new GradientStop(Colors.Yellow, 1));
radialGradientBrush.GradientOrigin = new Point(0, 0);//设置径向渐变的起始位置,默认为(0.5,0.5)
Rectangle rectangle = new Rectangle();
rectangle.Width = 100;
rectangle.Height = 100;
rectangle.Fill = radialGradientBrush;

上述C#代码使用XAML定义,如下所示:

<Rectangle Width="75" Height="75"><Rectangle.Fill><RadialGradientBrush GradientOrigin="0.75,0.25"><GradientStop Color="Yellow" Offset="0.0" /><GradientStop Color="Orange" Offset="0.5" /><GradientStop Color="Red" Offset="1.0" /></RadialGradientBrush></Rectangle.Fill>
</Rectangle>

 

图像画笔(ImageBrush)

ImageBrush 使用 ImageSource 绘制区域。

ImageBrush imageBrush = new ImageBrush();
imageBrush.ImageSource =
new BitmapImage(new Uri(@"images\pinkcherries.jpg", UriKind.Relative));
Rectangle rectangle = new Rectangle();
rectangle.Width = 100;
rectangle.Height = 100;
rectangle.Fill = imageBrush;

上述C#代码使用XAML定义,如下所示:

<Rectangle Width="75" Height="75"><Rectangle.Fill><ImageBrush ImageSource="sampleImages\pinkcherries.jpg"  /></Rectangle.Fill>
</Rectangle>

其中ImageSource是abstract修饰的抽象类,其派生类非常多,如下所示:

 

绘图画笔(DrawingBrush)

DrawingBrush 使用 Drawing 绘制区域。 Drawing 可以包含形状、图像、文本和媒体。

Rectangle rectangle = new Rectangle();
rectangle.Width = 75;
rectangle.Height = 75;
// Create a DrawingBrush and use it to
// paint the rectangle.
DrawingBrush myBrush = new DrawingBrush();
GeometryDrawing backgroundSquare =new GeometryDrawing(Brushes.White,null,new RectangleGeometry(new Rect(0, 0, 100, 100)));
GeometryGroup g = new GeometryGroup();
g.Children.Add(new RectangleGeometry(new Rect(0, 0, 50, 50)));
g.Children.Add(new RectangleGeometry(new Rect(50, 50, 50, 50)));
LinearGradientBrush brush = new LinearGradientBrush();
brush.GradientStops.Add(new GradientStop(Colors.Black, 0.0));
brush.GradientStops.Add(new GradientStop(Colors.Gray, 1.0));
GeometryDrawing checkers = new GeometryDrawing(brush, null, g);
DrawingGroup checkersGroup = new DrawingGroup();
checkersGroup.Children.Add(backgroundSquare);
checkersGroup.Children.Add(checkers);
myBrush.Drawing = checkersGroup;
myBrush.Viewport = new Rect(0, 0, 0.25, 0.25);
myBrush.TileMode = TileMode.Tile;
rectangle.Fill = myBrush;

上述C#代码使用XAML定义,如下所示:

<Rectangle Width="75" Height="75"><Rectangle.Fill><DrawingBrush Viewport="0,0,0.25,0.25" TileMode="Tile"><DrawingBrush.Drawing><DrawingGroup><GeometryDrawing Brush="White"><GeometryDrawing.Geometry><RectangleGeometry Rect="0,0,100,100" /></GeometryDrawing.Geometry></GeometryDrawing><GeometryDrawing><GeometryDrawing.Geometry><GeometryGroup><RectangleGeometry Rect="0,0,50,50" /><RectangleGeometry Rect="50,50,50,50" /></GeometryGroup></GeometryDrawing.Geometry><GeometryDrawing.Brush><LinearGradientBrush><GradientStop Offset="0.0" Color="Black" /><GradientStop Offset="1.0" Color="Gray" /></LinearGradientBrush></GeometryDrawing.Brush></GeometryDrawing></DrawingGroup></DrawingBrush.Drawing></DrawingBrush></Rectangle.Fill>
</Rectangle>

在上述示例中,DrawingBrush的Drawing属性用来设置绘图画笔的内容。其中Drawing类型为abstract修饰的抽象类,其中GeometryDrawing为Drawing的派生类。

 

视觉对象画笔(VisualBrush)

VisualBrush使用Visual对象(视觉元素)绘制区域,视觉对象包括Button,Page,MediaElement等内容。VisualBrush还可以将应用程序的一部分投影到另一个区域。创建反射效果和放大屏幕部分非常有用。

Rectangle rectangle = new Rectangle();
rectangle.Width = 75;
rectangle.Height = 75;// Create a VisualBrush and use it
// to paint the rectangle.
VisualBrush myBrush = new VisualBrush();//
// Create the brush's contents.
//
StackPanel panel = new StackPanel();// Create a DrawingBrush and use it to
// paint the panel.
DrawingBrush brush = new DrawingBrush();
GeometryGroup g = new GeometryGroup();
g.Children.Add(new RectangleGeometry(new Rect(0, 0, 50, 50)));
g.Children.Add(new RectangleGeometry(new Rect(50, 50, 50, 50)));
RadialGradientBrush checkerBrush = new RadialGradientBrush();
checkerBrush.GradientStops.Add(new GradientStop(Colors.MediumBlue, 0.0));
checkerBrush.GradientStops.Add(new GradientStop(Colors.White, 1.0));
GeometryDrawing checkers = new GeometryDrawing(checkerBrush, null, g);
brush.Drawing = checkers;
panel.Background = brush;// Create some text.
TextBlock someText = new TextBlock();
someText.Text = "Hello, World";
FontSizeConverter converter = new FontSizeConverter();
someText.FontSize = (double)converter.ConvertFromString("10pt");
someText.Margin = new Thickness(10);panel.Children.Add(someText);myBrush.Visual = panel;
rectangle.Fill = myBrush;

上述C#代码使用XAML定义,如下所示:

<Rectangle Width="75" Height="75"><Rectangle.Fill><VisualBrush TileMode="Tile"><VisualBrush.Visual><StackPanel><StackPanel.Background><DrawingBrush><DrawingBrush.Drawing><GeometryDrawing><GeometryDrawing.Brush><RadialGradientBrush><GradientStop Color="MediumBlue" Offset="0.0" /><GradientStop Color="White" Offset="1.0" /></RadialGradientBrush></GeometryDrawing.Brush><GeometryDrawing.Geometry><GeometryGroup><RectangleGeometry Rect="0,0,50,50" /><RectangleGeometry Rect="50,50,50,50" /></GeometryGroup></GeometryDrawing.Geometry></GeometryDrawing></DrawingBrush.Drawing></DrawingBrush></StackPanel.Background><TextBlock FontSize="10pt" Margin="10">Hello, World!</TextBlock></StackPanel></VisualBrush.Visual></VisualBrush></Rectangle.Fill>
</Rectangle>

 

预定义画笔

为方便起见,WPF提供了一组可用于绘制对象的预定义画笔和系统画笔。

  • Brushes 类,定义了可用的预定义画笔列表。

  • SystemColors 类,定义了可用的系统画笔列表。

 

画笔常见属性

画笔的常见属性如下所示:
  • Opacity,表示画笔的透明度, Opacity 的值为 0 表示完全透明,1 表示完全不透明,0.25表示25%的透明。

  • Transform,表示对画笔内容的倾斜,旋转,缩放等效果。

 

另外由于Brush继承自 Freezable 类,Brush 类提供了多种特殊功能:可以声明 Brush 对象为资源、在多个对象之间共享并可克隆。此外,除 Brush 之外的所有 VisualBrush 类型可以设置为只读,以提高性能和使线程安全。

 

控件画笔属性

不同的UI对象,所对应的画笔属性不同,主要有以下几种:

  • Border,可以设置边框(BorderBrush),背景色(Background)
  • Control ,可以设置背景色(Background),前景色(Foreground)
  • Panel,容器可以设置背景色(Background)
  • Pen,画笔设置笔触(Brush)
  • Shape,形状可以设置填充(Fill),线条(Stroke)
  • TextBlock,设置背景色(Background)

 

关于更多内容,可参考官方文档:https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/graphics-multimedia/wpf-brushes-overview?view=netframeworkdesktop-4.8
以上就是《不可不知的WPF画笔(Brush)》的全部内容,希望可以抛砖引玉,一起学习,共同进步!!!

学习编程,从关注【老码识途】开始,为大家分享更多文章!!!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

缓存介绍

从业务层面上的堆数据库下性能瓶颈的解决方案: 分库分表、读写分离 程序员修神之路--略懂数据库集群读写分离而已缓存 缓存 (Cache):本质是数据交换的一段缓冲区,也可以称为一种存储数据的组件,主要用于减小数据交换双方速度不匹配的问题。 缓存在计算机世界里是一个常见并…

开源的工作流系统突出优点总结

随时欢迎大家一起了解开源的工作流系统的突出优势和特点。当前,想要实现高效率的办公,可以一起来了解低代码技术平台、开源的工作流系统的相关特点和功能优势。作为较受职场喜爱的平台产品,低代码技术平台拥有可视化才做界面、灵活、好维护操作等多个优势特点,在推动企业流…

2024年最新版Typora免费使用教程心得

在数字化时代,写作已成为我们日常沟通、知识分享的重要手段。然而,繁琐的排版格式常常让人望而却步。幸运的是,Markdown编辑器以其简洁的语法和高效的排版功能,为我们带来了福音。Typora是一款功能强大的文本编辑器,它采用所见即所得的编辑方式,能够让用户快速地编辑各种…

P10786 [NOI2024] 百万富翁

讲解 P10786 [NOI2024] 百万富翁。先爆搜出 t>=9 的部分分,然后考虑使用动态规划算法进行常数优化跑出答案。思路: 先考虑 Sub1 的部分分,暴力算法:暴力询问所有 \(i<j\) 的数对 \((i,j)\)。 则一个 \(i\) 为最大值当且仅当 \((i,j)\) 的返回值都是 \(i\) 且在 \(i\)…

用我十多年的“奇葩”经验,给在“挂吊瓶”的博客园几点建议

初识博客园 我是08年开始接触开发的,一开始涉及的就是.net和java,记得那会好像是jar6来着,net嘛还是2.0 那时候包括现在,找资料很多时候会找到博客园来 一开始我以为博客园是很多博主成立的一个联盟,就是各自弄一个博客系统,然后公用一个域名 为啥会这么想呢? 因为我看高…

基于深度学习网络的USB摄像头实时视频采集与水果识别matlab仿真

1.算法运行效果图预览 (完整程序运行后无水印)将usb摄像头对准一个播放不同水果图片的显示器,然后进行识别,识别结果如下: 本课题中,使用的USB摄像头为:2.算法运行软件版本 matlab2022a3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)程序中包括MATLAB读取摄…

Android 常用的性能分析工具详解:GPU呈现模式

此篇将重点介绍几种常用的Android性能分析工具: 一、Logcat 日志 选取Tag=ActivityManager,可以粗略地知道界面Displaying的时间消耗。当我们打开一个Activity的时候,log会打印一串log如下: I/ActivityManager﹕ Displayed xxx.xxx.xxx/TestActivity: +1s272ms (total +3s…

AI - 一文了解AIOps的含义、特点与功用

AIOps定义 AIOps是智能运维(Artificial Intelligence forITOperations)的英文缩写。 当今,专业厂商根据自身理解和商业目的,分别给出了各具特色的AIOps定义。 主要关键字:IT运维、人工智能 (AI)、机器学习(ML)、自然语言处理(NLP)、大数据、数据分析、运营效率等 以下…

两种解决powerdesigner概念模型转物理模型报字段重复错误的方法

问题 使用 powerdesigner 概念模型转物理模型时会报一个不能重复的错误解决方法 一、取消勾选Unique code取消勾选以后保存,再一次生成物理模型。 二、取消勾选Entity Attribute,不对属性进行检查 如果Unique code取消勾选后依旧不行,可以尝试第二种解决办法。取消勾选以后点…

AT cf17 final J Tree MST

AT cf17 final J Tree MST 考场上想出的黑题,然而写挂了…… 思路 考场推出 boruvka 算法,会的直接跳过就好。 结论:一个点向另外一个点连出的最小边,一定在最小生成树上。 证明:参考 Kruskal 生成树的流程,若当前边(最小边)不在最小生成树上,表明边的两端已经在同一个…

EPIC Institute of Technology Round Summer 2024 (Div. 1 + Div. 2) VP记录

EPIC Institute of Technology Round Summer 2024 (Div. 1 + Div. 2) VP记录 A 一眼 \((n - 1) m + 1\)。 B 最后的数列是固定的,每个数与最后数列的数相减后,对差值求和再加上最大值即可。 C 唐诗 C 题,获得 \(3\) 发罚时。 只有一个数右边的数归零了,它才会归零。 右往左…