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

news2024/11/17 15:33:47

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;//默认0
        if (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;//默认0
        if (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.......虽然最终未采用该方式,但值得记录一下。

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

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

相关文章

PD虚拟机占用多少内存?使用电脑的虚拟内存会损害电脑吗

当我们讨论虚拟机及其对电脑性能的影响时&#xff0c;常常会出现两个关键问题&#xff1a;“PD虚拟机需要占用多少内存&#xff1f;”以及“启用电脑的虚拟内存是否会损害硬件&#xff1f;”对于依赖虚拟机进行日常工作的用户而言&#xff0c;这些问题尤为重要。 在本文中&…

Docker上安装mysql

获取 MySQL 镜像 获取镜像。使用以下命令来拉取镜像&#xff1a; 1docker pull mysql:latest 这里拉取的是最新版本的 MySQL 镜像。你也可以指定特定版本&#xff0c;例如&#xff1a; 1docker pull mysql:8.0 运行 MySQL 容器 运行 MySQL 容器时&#xff0c;你需要指定一些…

Linux与Ubuntu:内核与发行版的关系

在计算机科学的领域内&#xff0c;Linux和Ubuntu这两个术语频繁出现&#xff0c;但它们之间的确切联系往往不为大众所熟知。本文旨在深入探讨Linux内核与Ubuntu操作系统发行版之间的技术关系&#xff0c;并阐明它们各自的独特性质。 Linux内核&#xff1a;操作系统的基石 Lin…

R语言统计分析——功效分析(选择效应值)

参考资料&#xff1a;R语言实战【第2版】 功效分析中&#xff0c;预期效应值时最难决定的参数。它通常要求我们对研究主题有一定的了解&#xff0c;并由相应的测量经验。例如&#xff0c;过去研究中的数据可以用来计算效应值&#xff0c;这能为后来深层次的研究提供一些参考。 …

虚拟机Linux+Ubuntu操作系统 如何在虚拟机上安装docker VMPro 2024在线激活资源

一般情况下 不建议在windows系统上安装docker Windows本身就自带一个虚拟机叫WSL 但是不推荐在日常使用的电脑上安装 我们要下一个虚拟机 我们在window上安装docker会被告知WSL内核太老 我们要一个专业的 隔离的虚拟机软件 推荐使用虚拟机 这是我们的虚拟机软件 我们这边…

爬虫代理API的全面解析:让数据抓取更高效

在大数据时代&#xff0c;网络爬虫已经成为收集和分析数据的重要工具。然而&#xff0c;频繁的请求会导致IP被封禁&#xff0c;这时候爬虫代理API就显得尤为重要。本文将详细介绍爬虫代理API的作用、优势及如何使用&#xff0c;帮助你更高效地进行数据抓取。 什么是爬虫代理AP…

Python | Leetcode Python题解之第403题青蛙过河

题目&#xff1a; 题解&#xff1a; def canCross(stones: List[int]) -> bool:lru_cache(None)def dfs(pos,step):if posstones[-1]: return Truefor d in [-1,0,1]:if stepd>0 and posstepd in set(stones):if dfs(posstepd, stepd):return Truereturn Falsepos, step…

移动UI:看看筛选页面的作用和示例啦。

在移动UI中&#xff0c;筛选页面通常用于允许用户根据特定条件或标准来过滤和查找数据。筛选页面在移动UI中起到了提供数据过滤、排序和个性化展示的功能&#xff0c;帮助用户快速找到所需信息&#xff0c;并提供更好的用户体验。 1. 数据过滤&#xff1a; 允许用户根据各种条…

服务器数据增量迁移方案-—SAAS本地化及未来之窗行业应用跨平台架构

一、数据迁移增量同步具有以下几个优点&#xff1a; 1. 减少数据传输量&#xff1a;只传输自上次同步以来更改的数据&#xff0c;而不是整个数据集&#xff0c;这显著降低了网络带宽的使用和传输时间。 2. 提高同步效率&#xff1a;由于处理的数据量较小&#xff0c;同步过程…

Java应用压测工具JMeter

目录 1、下载JMeter 2、配置环境变量 3、配置语音 4、使用 1、下载JMeter Apache JMeter - Apache JMeter™ 千万别下载这个&#xff0c;会报错、 千万别下载这个&#xff0c;会报错、 千万别下载这个&#xff0c;会报错 下载这个&#xff0c;失败多下载几次 2、配置环…

京东广告投放平台整洁架构演进之路

前言 从去年开始京东广告投放系统做了一次以领域驱动设计为思想内核的架构升级&#xff0c;在深入理解DDD思想的同时&#xff0c;我们基于广告投放业务的本质特征大胆地融入了自己的理解和改造。新架构是从设计思想到落地框架都进行了彻底的革新&#xff0c;涉及内容比较多&am…

lvs-dr模式实验详解

华子目录 lvs-dr&#xff08;企业当中最常用&#xff09;dr模式数据逻辑dr模式数据传输过程dr模式的特点实验拓扑实验主机准备实验步骤1.client的ip设定2.router上的ip设定3.router开启路由转发功能4.lvs主机中的ip设定5.webserver1主机中的ip设定6.webserver2主机中的ip设定7.…

6.6高斯噪声

在OpenCV联合C中给一张图片添加高斯噪声&#xff08;Gaussian Noise&#xff09;&#xff0c;可以通过生成随机数并在图像的每个像素上加上这些随机数来实现。高斯噪声是一种统计分布服从正态分布的噪声&#xff0c;通常用于模拟自然界的许多物理现象。 示例代码 以下是一个使…

设计师私藏的 PDF 转 JPG 利器

你平常会通过扫描来发送文件吗&#xff1f;为了保证图片的清晰度一般都会采用PDF格式来转发&#xff0c;但是要插入到一些文件里的时候PDF格式不是那么好用。这时候就很需要PDF转jpg工具了。今天我就分享几款我用过的PDF转jpg的工具&#xff0c;有兴趣就接着往下看吧。 1.福昕…

Win10下64位Python连接32位Oracle数据库

之前看了15分钟解决此问题&#xff0c;DPI-1047: Cannot locate a 64-bit Oracle Client library: “The specified module could not be-CSDN博客的办法&#xff0c;确实能用。但是打开PL/SQL Developer就会出现错误。 上面是我的version。原文章里面用了instantclient_11_2&a…

工业互联网网络集成与实训系统解决方案

随着工业4.0时代的到来和信息技术的高速发展&#xff0c;工业互联网已成为推动产业升级的重要力量。本方案旨在通过构建高度仿真的实训环境&#xff0c;帮助学生全面掌握工业互联网技术&#xff0c;为未来的职业生涯奠定坚实基础。 一、设计理念 在设计理念上&#xff0c;本方…

信息安全数学基础(13)简化剩余系

一、定义 设 m 是一个正整数&#xff0c;且 m>1。模 m 的简化剩余系是一个由模 m 的剩余类中的元素组成的集合&#xff0c;这些元素与 m 互素&#xff08;即它们的最大公约数为1&#xff09;。换句话说&#xff0c;模 m 的简化剩余系是模 m 的所有与 m 互质的数的集合。 二、…

o1模型:引领AI技术在STEM领域的突破与应用

o1模型是OpenAI最新推出的大型语言模型&#xff0c;它在多个领域展现出了卓越的能力&#xff0c;被认为是AI技术发展的一个重要里程碑。以下是对o1模型的详细介绍和分析&#xff1a; o1模型的简介和性能评估 o1模型在物理、化学、生物学等领域的基准任务上达到了博士生水平&…

node版本切换(nvm工具)

最近接手了一个新项目&#xff0c;Node 版本切换的知识又遇到了&#xff0c;如果不及时切换版本&#xff0c;项目运营不起来&#xff0c;或是遇到一些报错。如何切换 Node 版本呢&#xff1f; 对于 Linux 或 macOS&#xff1a; curl -o- https://raw.githubusercontent.com/n…

TiDB 数据库核心原理与架构_Lesson 01 TiDB 数据库架构概述课程整理

作者&#xff1a; 尚雷5580 原文来源&#xff1a; https://tidb.net/blog/beeb9eaf 注&#xff1a;本文基于 TiDB 官网 董菲老师 《TiDB 数据库核心原理与架构&#xff08;101) 》系列教程之 《Lesson 01 TiDB 数据库架构概述》内容进行整理和补充。 课程链接&#xff1a;…