WPF前端:一个纯Xaml的水平导航栏

效果图:

代码:

1、样式代码,可以写在窗体资源处或者样式资源文件中

 <Style x:Key="MenuRadioButtonStyle" TargetType="{x:Type RadioButton}">
     <Setter Property="FontSize" Value="16" />
     <Setter Property="Width" Value="100" />
     <Setter Property="Height" Value="40" />
     <!--<Setter Property="Foreground" Value="#333333" />-->
     <Setter Property="Foreground">
         <Setter.Value>
             <SolidColorBrush Color="#333333" />
         </Setter.Value>
     </Setter>
     <Setter Property="VerticalAlignment" Value="Center" />
     <Setter Property="Template">
         <Setter.Value>
             <ControlTemplate TargetType="{x:Type RadioButton}">
                 <Grid>
                     <Border
                         x:Name="bd"
                         Margin="5,0,5,0"
                         Background="#00FFFFFF"
                         CornerRadius="20" />
                     <ContentPresenter
                         Margin="0,0,0,0"
                         HorizontalAlignment="Center"
                         VerticalAlignment="Center" />
                 </Grid>
                 <ControlTemplate.Triggers>
                     <MultiTrigger>
                         <MultiTrigger.Conditions>
                             <Condition Property="IsMouseOver" Value="True" />
                             <Condition Property="IsChecked" Value="False" />
                         </MultiTrigger.Conditions>
                         <MultiTrigger.Setters>
                             <Setter TargetName="bd" Property="Background" Value="#AACCE8FF" />
                         </MultiTrigger.Setters>
                     </MultiTrigger>
                     <Trigger Property="IsChecked" Value="True">
                         <Trigger.EnterActions>
                             <BeginStoryboard>
                                 <Storyboard>
                                     <ColorAnimation
                                         Storyboard.TargetProperty="(RadioButton.Foreground).(SolidColorBrush.Color)"
                                         To="White"
                                         Duration="0:0:.2" />
                                 </Storyboard>
                             </BeginStoryboard>
                         </Trigger.EnterActions>
                         <Trigger.ExitActions>
                             <BeginStoryboard>
                                 <Storyboard>
                                     <ColorAnimation
                                         Storyboard.TargetProperty="(RadioButton.Foreground).(SolidColorBrush.Color)"
                                         To="#333333"
                                         Duration="0:0:.2" />
                                 </Storyboard>
                             </BeginStoryboard>
                         </Trigger.ExitActions>
                     </Trigger>

                 </ControlTemplate.Triggers>
             </ControlTemplate>
         </Setter.Value>
     </Setter>
 </Style>
 <Style x:Key="MenuSliderStyle" TargetType="Border">
     <Setter Property="Width" Value="100"/>
     <Setter Property="Height" Value="40"/>
     <Setter Property="Margin" Value="100,0,0,0"/>
     <Setter Property="HorizontalAlignment" Value="Left"/>
     <Setter Property="Background" Value="#14B9FF"/>
     <Setter Property="CornerRadius" Value="20"/>
 </Style>

2、在要使用的页面中

 <Border
     Width="500"
     Height="50"
     VerticalAlignment="Top"
     Background="#AAFFFFFF"
     CornerRadius="20">
     <Grid>
         <Border
             x:Name="menuBorder"
             Style="{StaticResource MenuSliderStyle}">
             <Border.RenderTransform>
                 <TranslateTransform x:Name="Move" X="0" />
             </Border.RenderTransform>
         </Border>
         <Grid HorizontalAlignment="Center">
             <Grid.ColumnDefinitions>
                 <ColumnDefinition />
                 <ColumnDefinition />
                 <ColumnDefinition />
             </Grid.ColumnDefinitions>
             <RadioButton
                 x:Name="homeRB"
                 Content="Home"
                 IsChecked="True"
                 Style="{StaticResource MenuRadioButtonStyle}">
                 <RadioButton.Triggers>
                     <EventTrigger RoutedEvent="ToggleButton.Checked">
                         <BeginStoryboard >
                             <Storyboard>
                                 <DoubleAnimation
                                     Storyboard.TargetName="menuBorder"
                                     Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)"
                                     To="0"
                                     Duration="0:0:.2" />
                             </Storyboard>
                         </BeginStoryboard>
                     </EventTrigger>
                 </RadioButton.Triggers>
             </RadioButton>
             <RadioButton
                 x:Name="settingsRB"
                 Grid.Column="1"
                 Content="Settings"
                 Style="{StaticResource MenuRadioButtonStyle}">
                 <RadioButton.Triggers>
                     <EventTrigger RoutedEvent="ToggleButton.Checked">
                         <BeginStoryboard>
                             <Storyboard>
                                 <DoubleAnimation
                                     Storyboard.TargetName="menuBorder"
                                     Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)"
                                     To="100"
                                     Duration="0:0:.2" />
                             </Storyboard>
                         </BeginStoryboard>
                     </EventTrigger>
                 </RadioButton.Triggers>
             </RadioButton>
             <RadioButton
                 x:Name="LogRB"
                 Grid.Column="2"
                 Content="Logs"
                 Style="{StaticResource MenuRadioButtonStyle}">
                 <RadioButton.Triggers>
                     <EventTrigger RoutedEvent="ToggleButton.Checked">
                         <BeginStoryboard>
                             <Storyboard>
                                 <DoubleAnimation
                                     Storyboard.TargetName="menuBorder"
                                     Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)"
                                     To="200"
                                     Duration="0:0:.2" />
                             </Storyboard>
                         </BeginStoryboard>
                     </EventTrigger>
                 </RadioButton.Triggers>
             </RadioButton>
         </Grid>
     </Grid>
 </Border>

3、RadioButton就是每个功能按钮,配合Prism框架的导航功能使用,就可以在各个页面之间切换了。

如果需要增加按钮数量,需要进行如下操作:

1、在Grid.ColumnDefinitions中,有几个按钮就加到几列,这里是三个按钮,所以是三列。

2、修改最外层的Border的宽度,每一个按钮是100的宽度,然后再加上200,就是最后的宽度。

这里三个按钮,是3×100+200=500的宽度。

3、按照前面的格式,增加RadioButton,RadioButton就是每个功能按钮,并且修改以下几个属性

(1)Grid.Column 从0开始,每个递增1,即第一个RadioButton的Grid.Column是0,第二个是1,以此类推。

(2)Content 是按钮上面显示的文本。

(3)To 从0开始,每个递增100,即第一个RadioButton的 To 是0,第二个是100,以此类推。

最后效果:

如果加上缓动动画,效果会更自然,可以自行添加缓动效果。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Zabbix实现邮件和钉钉实时告警(使用python脚本)

告警和通知 告警是监控的主要职能,是指将到达某一阈值事件的消息发送给用户,让用户在事件发生的时候即刻知道监控项处于不正常状态,从而让用户来决定是否采取相关措施。 zabbix中,告警是由一系列的流程组成的,⾸首先是触发器到达阈值,接下是Active对事件信息进行处理,其…

谁能赢?阿里的通义 VS 百度的文心

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 国产AI大模型领域&#xff0c;当前有两大阵营&#xff1a; (1)以百度文心一言为代表的闭源大模型。李彦宏曾说过&#xff1a;AI大模型开源意义不大&#xff0c;百度绝不抢开发者饭碗。 (2)以阿里通义AI为代表的开…

个股场外期权个人如何参与买卖?

个股场外期权作为一种金融衍生品&#xff0c;为个人投资者提供了多样化的投资选择和风险管理工具。想要参与个股场外期权的买卖&#xff0c;以下是一些关键步骤和考虑因素。 文章来源/&#xff1a;财智财经 第一步&#xff1a;选择合适的金融机构 首先&#xff0c;个人投资者需…

Android 常用开源库 MMKV 源码分析与理解

文章目录 前言一、MMKV简介1.mmap2.protobuf 二、MMKV 源码详解1.MMKV初始化2.MMKV对象获取3.文件摘要的映射4.loadFromFile 从文件加载数据5.数据写入6.内存重整7.数据读取8.数据删除9.文件回写10.Protobuf 实现1.序列化2.反序列化 12.文件锁1.加锁2.解锁 13.状态同步 总结参考…

17- Redis 中的 quicklist 数据结构

在 Redis 3.0 之前&#xff0c;List 对象的底层数据结构是双向链表或者压缩列表&#xff0c;然后在 Redis 3.2 的时候&#xff0c;List 对象的底层改由 quicklist 数据结构实现。 其实 quicklist 就是【双向链表 压缩列表】组合&#xff0c;因为一个 quicklist 就是一个链表&…

视频修复工具,模糊视频变清晰!

老旧视频画面效果差&#xff0c;视频效果模糊。我们经常找不到一个好的工具来让视频更清晰&#xff0c;并把它变成高清画质。相信很多网友都会有这个需求&#xff0c;尤其是视频剪辑行业的网友&#xff0c;经常会遇到这个问题。今天给大家分享一个可以把模糊视频修复清晰的工具…

【ffmpeg】本地格式转换 mp4转wav||裁剪mp4

个人感受&#xff1a;太爽了&#xff01;&#xff01;&#xff01;&#xff08;可能用惯了转换网站和无良的转换软件&#xff09; ———— 使用FFmpeg把mp4文件转换为WAV文件 - 简书 (jianshu.com) FFMPEG 视频分割和合并 - 简书 (jianshu.com) ———— 示例 ffmpeg -i …

C# MemoryCache 缓存应用

摘要 缓存是一种非常常见的性能优化技术&#xff0c;在开发过程中经常会用到。.NET提供了内置的内存缓存类 MemoryCache&#xff0c;它可以很方便地存储数据并在后续的请求中快速读取&#xff0c;从而提高应用程序的响应速度。 正文 通过使用 Microsoft.Extensions.Caching.Me…

树的重心-java

主要通过深度优先搜索来完成树的重心&#xff0c;其中关于树的重心的定义可以结合文字多加理解。 文章目录 前言☀ 一、树的重心☀ 二、算法思路☀ 1.图用邻接表存储 2.图的遍历 3.算法思路 二、代码如下☀ 1.代码如下&#xff1a; 2.读入数据 3,代码运行结果 总结 前言☀ 主…

【中间件系列】浅析redis是否适合做消息队列

文章目录 一、简单的list消息队列1.命令示例2.伪代码示例3.方案优劣 二、Pub/Sub发布订阅1.消息丢失2.消息堆积 三、相对成熟的Stream1.redis命令介绍2.多消费者组测试3.Stream会持久化吗&#xff1f;4.消息堆积如何解决&#xff1f; 总结 用redis也是比较久了&#xff0c;并且…

AI数据分析:用deepseek根据Excel数据绘制分裂饼形图

工作任务&#xff1a;要绘制下面表格中月活用户占比的分裂饼形图 在deepseek中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个Python脚本编写的任务&#xff0c;具体步骤如下&#xff1a; 读取Excel文件"F:\AI自媒体内容\AI行业数据分析\poetop5…

保姆级教程:以SAR图像目标检测为例

一、项目出发点 AI Studio为我们提供了免费的GPU资源&#xff0c;当我们在NoteBook环境中把代码调试成功后&#xff0c;通常一个训练任务耗时较长&#xff0c;而Notebook离线运行有时长限制&#xff0c;一不小心就容易被kill掉。 如何解决这一问题&#xff1f; 后台任务帮到…

探索智慧农业系统架构的设计与应用

随着科技的不断进步和农业现代化的推进&#xff0c;智慧农业正逐渐成为农业发展的重要趋势。智慧农业系统架构的设计与应用&#xff0c;将农业生产与信息技术相结合&#xff0c;为农业生产提供了新的思路和解决方案。本文将深入探讨智慧农业系统架构的设计与应用&#xff0c;从…

2021JSP普及组第二题:插入排序

2021JSP普及组第二题 题目&#xff1a; 思路&#xff1a; 题目要求排序后根据操作进行对应操作。 操作一需要显示某位置数据排序后的位置&#xff0c;所以需要定义结构体数组储存原数据的位置和数据本身排序后所得数据要根据原位置输出排序后的位置&#xff0c;所以建立一个新…

android中调用onnxruntime框架

创建空白项目 安装Android Studio及创建空白项目参考&#xff1a;【安卓Java原生开发学习记录】一、安卓开发环境的搭建与HelloWorld&#xff08;详细图文解释&#xff09;_安卓原生开发-CSDN博客 切记&#xff1a;build configuration language 一定选择Groovy&#xff01;官…

mysql报错 Duplicate entry

在MySQL中&#xff0c;当你尝试执行插入&#xff08;INSERT&#xff09;或更新&#xff08;UPDATE&#xff09;操作时&#xff0c;如果目标表中存在唯一索引&#xff08;包括主键索引、唯一约束索引等&#xff09;&#xff0c;并且你要插入或更新的数据在该索引列上的值与表中已…

电机控制系列模块解析(28)—— 其他功能概述

其他功能概述 软件侧&#xff1a;观测器估计发散保护、时序异常检测 主电路侧&#xff1a;IGBT结温估算、直流母线电容容值估算 电机侧&#xff1a;电机温度估计、轴承异常估计、电机退磁检测 负载侧&#xff1a;负载不平衡检测、掉载检测、负载惯量自适应 上述各项功能&a…

Diffusers代码学习: IP-Adapter Inpainting

IP-Adapter还可以通过Inpainting自动管道和蒙图方式生成目标图片。 # 以下代码为程序运行进行设置&#xff0c;使用Inpainting 的自动管道&#xff0c; import os os.environ["HF_ENDPOINT"] "https://hf-mirror.com"from diffusers import AutoPipelin…

【React】vscode 中 React 自动补齐标签设置

1.打开设置 2.搜索 includeLanguages 3. 在Emmet 下&#xff0c;点击“添加项”&#xff0c;添加一项 javascript --> javascriptreact 4. 重启vs code

学习笔记——路由网络基础——汇总静态路由

4、汇总静态路由 (1)定义 静态路由汇总&#xff1a;多条静态路由都使用相同的送出接口或下一跳 IP 地址。(将多条路由汇总成一条路由表示) (2)目的 1.减少路由条目数量&#xff0c;减小路由表&#xff0c;加快查表速度 2.增加网络稳定性 (3)路由黑洞以及路由环路的产生…