当前位置: 首页 > news >正文

WPF利用Path自定义画头部导航条(TOP)样式

1;新建两个多值转换器,都有用处,用来动态确定PATH的X,Y州坐标的。

EndPointConverter 该转换器主要用来动态确定X轴,和Y轴。用于画线条的。

internal class EndPointConverter : IMultiValueConverter
{public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture){double X = (double)values[0];//第一个值我这为上一个点X轴,可根据自己需要修改double C= double.Parse(parameter.ToString());//参数传差值,当前点的X轴与上一个点的X轴相差多少,double Y = 0;//默认0if (values.Length == 2){Point StartPoint = (Point)values[1];//线条开始坐标共用Y轴Y = StartPoint.Y;}return new Point(X-C, Y);}public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture){throw new NotImplementedException();}
}

PointConverter 主要用来动态确定X轴,和Y轴。但当前Y轴是上一个点的X轴。用于闭合图形填充颜色的Path类型。

public class PointConverter : IMultiValueConverter
{public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture){double X = (double)values[0];double C = double.Parse(parameter.ToString());//参数传差值double Y = 0;//默认0if (values.Length == 2){Point StartPoint = (Point)values[1];//线条开始坐标共用X轴作为Y轴Y = StartPoint.X;//下一个点的Y轴变为上个点的X轴,主要用来画闭合Path的}return new Point(X - C, Y);}public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture){throw new NotImplementedException();}
}

2;在写XML之前请在XMAL页面引入两个多值转换器(可根据自己需求自定义值类型和参数类型):

 <Window ....自己定义的其他内容....xmlns:converters="clr-namespace:你的转换器所在路径"......自己定义的其他内容.......><Window.Resources>//也可放置在App.XMAL下全局使用<converters:EndPointConverter x:Key="EndPointConverter" /><converters:PointConverter x:Key="PointConverter" />
</Window.Resources>

闭合Path的XMAL页面使用如下:

<!--闭合Path-->
<Path StrokeThickness="1.5" Stroke="#04386C"><Path.Data><PathGeometry><PathFigure  StartPoint="0,30"><LineSegment x:Name="Point1" Point="30,50"></LineSegment><LineSegment x:Name="Point2"><LineSegment.Point><MultiBinding Converter="{StaticResource EndPointConverter}" ConverterParameter="30"><Binding ElementName="ColorZone" Path="ActualWidth"/><Binding ElementName="Point1" Path="Point"/></MultiBinding></LineSegment.Point></LineSegment><LineSegment x:Name="Point3"><LineSegment.Point><MultiBinding Converter="{StaticResource PointConverter}" ConverterParameter="0"><Binding ElementName="ColorZone" Path="ActualWidth"/><Binding ElementName="Point1" Path="Point"/></MultiBinding></LineSegment.Point></LineSegment><LineSegment x:Name="Point4" ><LineSegment.Point><MultiBinding Converter="{StaticResource PointConverter}" ConverterParameter="0"><Binding ElementName="ColorZone" Path="ActualWidth"/></MultiBinding></LineSegment.Point></LineSegment><LineSegment Point="0,0"></LineSegment><LineSegment Point="0,30"></LineSegment></PathFigure></PathGeometry></Path.Data><Path.Fill>
<!--渐变色设置--><LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1"><GradientStop Color="#07164C" Offset="0.4"></GradientStop><GradientStop Color="#07205A" Offset="0.8"></GradientStop><GradientStop Color="#07205B" Offset="1"></GradientStop></LinearGradientBrush></Path.Fill>
</Path>

效果:

线条Path的使用如下:

<Path StrokeThickness="3" Stroke="White"><Path.Data><GeometryGroup><LineGeometry x:Name="Point1" StartPoint="0 30" EndPoint="50 45" /><LineGeometry x:Name="Point2" StartPoint="50,45"><LineGeometry.EndPoint><MultiBinding Converter="{StaticResource EndPointConverter}" ConverterParameter="50"><Binding ElementName="ColorZone" Path="ActualWidth"/><Binding Path="StartPoint" RelativeSource="{RelativeSource Mode=self}"/></MultiBinding></LineGeometry.EndPoint></LineGeometry><LineGeometry x:Name="Point3"><LineGeometry.StartPoint><MultiBinding Converter="{StaticResource EndPointConverter}" ConverterParameter="50"><Binding ElementName="ColorZone" Path="ActualWidth"/><Binding ElementName="Point2" Path="StartPoint" /></MultiBinding></LineGeometry.StartPoint><LineGeometry.EndPoint><MultiBinding Converter="{StaticResource EndPointConverter}" ConverterParameter="0"><Binding ElementName="ColorZone" Path="ActualWidth"/><Binding ElementName="Point1" Path="StartPoint" /></MultiBinding></LineGeometry.EndPoint></LineGeometry><LineGeometry x:Name="Point4"><LineGeometry.StartPoint><MultiBinding Converter="{StaticResource EndPointConverter}" ConverterParameter="0"><Binding ElementName="ColorZone" Path="ActualWidth"/><Binding ElementName="Point3" Path="EndPoint"/></MultiBinding></LineGeometry.StartPoint><LineGeometry.EndPoint><MultiBinding Converter="{StaticResource EndPointConverter}" ConverterParameter="0"><Binding ElementName="ColorZone" Path="ActualWidth"/></MultiBinding></LineGeometry.EndPoint></LineGeometry><LineGeometry x:Name="Point5" EndPoint="0 0"><LineGeometry.StartPoint><MultiBinding Converter="{StaticResource EndPointConverter}" ConverterParameter="0"><Binding ElementName="ColorZone" Path="ActualWidth"/></MultiBinding></LineGeometry.StartPoint></LineGeometry><LineGeometry x:Name="Point6" StartPoint="0 0" EndPoint="0 30"/></GeometryGroup></Path.Data></Path>

效果(白色才是效果色):

两种图形中的"ColorZone"是Path的父控件,materialDesign:ColorZone是WPF的UI框架materialDesign下的控件,可替换为你自己的控件作为父控件只是注意父控件名称修改下即可。

整体如下:

 <DockPanel><!--头部--><materialDesign:ColorZone Padding="0" Height="50"ClipToBounds="False" CornerRadius="5 5 0 0"DockPanel.Dock="Top" x:Name="ColorZone"><StackPanel><!--<Path StrokeThickness="1.5" Stroke="#04386C"><Path.Data><PathGeometry><PathFigure  StartPoint="0,30"><LineSegment x:Name="Point1" Point="30,50"></LineSegment><LineSegment x:Name="Point2"><LineSegment.Point><MultiBinding Converter="{StaticResource EndPointConverter}" ConverterParameter="30"><Binding ElementName="ColorZone" Path="ActualWidth"/><Binding ElementName="Point1" Path="Point"/></MultiBinding></LineSegment.Point></LineSegment><LineSegment x:Name="Point3"><LineSegment.Point><MultiBinding Converter="{StaticResource PointConverter}" ConverterParameter="0"><Binding ElementName="ColorZone" Path="ActualWidth"/><Binding ElementName="Point1" Path="Point"/></MultiBinding></LineSegment.Point></LineSegment><LineSegment x:Name="Point4" ><LineSegment.Point><MultiBinding Converter="{StaticResource PointConverter}" ConverterParameter="0"><Binding ElementName="ColorZone" Path="ActualWidth"/></MultiBinding></LineSegment.Point></LineSegment><LineSegment Point="0,0"></LineSegment><LineSegment Point="0,30"></LineSegment></PathFigure></PathGeometry></Path.Data><Path.Fill><LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1"><GradientStop Color="#07164C" Offset="0.4"></GradientStop><GradientStop Color="#07205A" Offset="0.8"></GradientStop><GradientStop Color="#07205B" Offset="1"></GradientStop></LinearGradientBrush></Path.Fill></Path>--><Path StrokeThickness="3" Stroke="White"><Path.Data><GeometryGroup><LineGeometry x:Name="Point1" StartPoint="0 30" EndPoint="50 45" /><LineGeometry x:Name="Point2" StartPoint="50,45"><LineGeometry.EndPoint><MultiBinding Converter="{StaticResource EndPointConverter}" ConverterParameter="50"><Binding ElementName="ColorZone" Path="ActualWidth"/><Binding Path="StartPoint" RelativeSource="{RelativeSource Mode=self}"/></MultiBinding></LineGeometry.EndPoint></LineGeometry><LineGeometry x:Name="Point3"><LineGeometry.StartPoint><MultiBinding Converter="{StaticResource EndPointConverter}" ConverterParameter="50"><Binding ElementName="ColorZone" Path="ActualWidth"/><Binding ElementName="Point2" Path="StartPoint" /></MultiBinding></LineGeometry.StartPoint><LineGeometry.EndPoint><MultiBinding Converter="{StaticResource EndPointConverter}" ConverterParameter="0"><Binding ElementName="ColorZone" Path="ActualWidth"/><Binding ElementName="Point1" Path="StartPoint" /></MultiBinding></LineGeometry.EndPoint></LineGeometry><LineGeometry x:Name="Point4"><LineGeometry.StartPoint><MultiBinding Converter="{StaticResource EndPointConverter}" ConverterParameter="0"><Binding ElementName="ColorZone" Path="ActualWidth"/><Binding ElementName="Point3" Path="EndPoint"/></MultiBinding></LineGeometry.StartPoint><LineGeometry.EndPoint><MultiBinding Converter="{StaticResource EndPointConverter}" ConverterParameter="0"><Binding ElementName="ColorZone" Path="ActualWidth"/></MultiBinding></LineGeometry.EndPoint></LineGeometry><LineGeometry x:Name="Point5" EndPoint="0 0"><LineGeometry.StartPoint><MultiBinding Converter="{StaticResource EndPointConverter}" ConverterParameter="0"><Binding ElementName="ColorZone" Path="ActualWidth"/></MultiBinding></LineGeometry.StartPoint></LineGeometry><LineGeometry x:Name="Point6" StartPoint="0 0" EndPoint="0 30"/></GeometryGroup></Path.Data></Path></StackPanel></materialDesign:ColorZone><!--底部--><!--中部 只能放于最后,利用DockPanel的LastChildFill特性填充中间空间--></DockPanel>

END.......虽然最终未采用该方式,但值得记录一下。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python基础语法(1)上
  • [数据集][目标检测]河道垃圾检测数据集VOC+YOLO格式2274张8类别
  • 提问即创作:用Prompt提示词引领AI灵感爆发
  • 关于axios同步获取数据的问题
  • Redis embstr 编码
  • MATLAB在嵌入式系统设计中的最佳实践
  • 《Oracle(一)- 基础》
  • 【重学 MySQL】二十四、笛卡尔积的错误和正确的多表查询
  • DOM编程
  • 桥接模式详解和分析JDBC中的应用
  • 预处理详解(二)
  • 【Android Studio】2024.1.1最新版本AS调试老项目(老版AS项目文件、旧gradle)导入其他人的项目
  • bat批量修改文件名
  • C++ 萃取技术——值萃取
  • 机器学习(Machine Learning, ML)和深度学习(Deep Learning, DL)对比
  • 2017 年终总结 —— 在路上
  • Angular4 模板式表单用法以及验证
  • C# 免费离线人脸识别 2.0 Demo
  • CSS相对定位
  • Java 内存分配及垃圾回收机制初探
  • Javascript编码规范
  • MySQL QA
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • 不上全站https的网站你们就等着被恶心死吧
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 猴子数据域名防封接口降低小说被封的风险
  • 今年的LC3大会没了?
  • 前端临床手札——文件上传
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 小试R空间处理新库sf
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • (+4)2.2UML建模图
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (web自动化测试+python)1
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)计算机毕业设计大学生兼职系统
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (六)vue-router+UI组件库
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (五)Python 垃圾回收机制
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (转)C#调用WebService 基础
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)Oracle存储过程编写经验和优化措施
  • (转载)Linux 多线程条件变量同步
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .NET 8 跨平台高性能边缘采集网关