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><Borderx:Name="bd"Margin="5,0,5,0"Background="#00FFFFFF"CornerRadius="20" /><ContentPresenterMargin="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><ColorAnimationStoryboard.TargetProperty="(RadioButton.Foreground).(SolidColorBrush.Color)"To="White"Duration="0:0:.2" /></Storyboard></BeginStoryboard></Trigger.EnterActions><Trigger.ExitActions><BeginStoryboard><Storyboard><ColorAnimationStoryboard.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、在要使用的页面中

 <BorderWidth="500"Height="50"VerticalAlignment="Top"Background="#AAFFFFFF"CornerRadius="20"><Grid><Borderx: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><RadioButtonx:Name="homeRB"Content="Home"IsChecked="True"Style="{StaticResource MenuRadioButtonStyle}"><RadioButton.Triggers><EventTrigger RoutedEvent="ToggleButton.Checked"><BeginStoryboard ><Storyboard><DoubleAnimationStoryboard.TargetName="menuBorder"Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)"To="0"Duration="0:0:.2" /></Storyboard></BeginStoryboard></EventTrigger></RadioButton.Triggers></RadioButton><RadioButtonx:Name="settingsRB"Grid.Column="1"Content="Settings"Style="{StaticResource MenuRadioButtonStyle}"><RadioButton.Triggers><EventTrigger RoutedEvent="ToggleButton.Checked"><BeginStoryboard><Storyboard><DoubleAnimationStoryboard.TargetName="menuBorder"Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)"To="100"Duration="0:0:.2" /></Storyboard></BeginStoryboard></EventTrigger></RadioButton.Triggers></RadioButton><RadioButtonx:Name="LogRB"Grid.Column="2"Content="Logs"Style="{StaticResource MenuRadioButtonStyle}"><RadioButton.Triggers><EventTrigger RoutedEvent="ToggleButton.Checked"><BeginStoryboard><Storyboard><DoubleAnimationStoryboard.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的Grid.Column是0,第二个是100,以此类推。

最后效果:

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

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

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

相关文章

Always语句和assign的用法

Always语句 简介 always语句块从仿真0时刻开始执行其中的行为语句&#xff1b;最后一条执行完成后&#xff0c;再开始执行其中的第一条语句&#xff0c;如此往复循环&#xff0c;直到整个仿真结束。因此&#xff0c;always语句块常用于对数字电路中一组反复执行的活动进行建模…

【TensorFlow深度学习】RNN短时记忆缺陷与LSTM改进原理

RNN短时记忆缺陷与LSTM改进原理 RNN的局限与LSTM&#xff1a;短时记忆缺陷及其优化原理的深度解析RNN的STM问题剖析LSTM原理与改进LSTM代码实例结语 RNN的局限与LSTM&#xff1a;短时记忆缺陷及其优化原理的深度解析 在深度学习的征程中&#xff0c;循环神经网络&#xff08;R…

开源规则引擎LiteFlow项目应用实践

本文介绍基于开源规则引擎LiteFlow&#xff0c;如何开发规则设计器&#xff0c;在低代码平台中集成规则引擎&#xff0c;并在项目中实现应用的效果。由于低代码平台使用规则引擎实现了逻辑编排的需求&#xff0c;所以本文中的叫法为“逻辑设计”、“逻辑编排”、“逻辑流引擎”…

.NET IoC 容器(三)Autofac

目录 .NET IoC 容器&#xff08;三&#xff09;AutofacAutofacNuget 安装实现DI定义接口定义实现类依赖注入 注入方式构造函数注入 | 属性注入 | 方法注入注入实现 接口注册重复注册指定参数注册 生命周期默认生命周期单例生命周期每个周期范围一个生命周期 依赖配置Nuget配置文…

0基础学习区块链技术——推演猜想

在《0基础学习区块链技术——入门》一文中&#xff0c;我们结合可视化工具&#xff0c;直观地感受了下区块的结构&#xff0c;以及链式的前后关系。 本文我们将抛弃之前的知识&#xff0c;从0开始思考和推演&#xff0c;区块链技术可能是如何构思出来的。 去中心 在一般的思维…

回溯算法之组合总和2

题目&#xff1a; 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1a;解集不能包含重复的组合。 示例 1: 输入: candi…

浅谈配置元件之随机变量

浅谈配置元件之随机变量 1.概述 为了增强测试的真实性和多样性&#xff0c;JMeter 提供了多种配置元件来生成动态数据&#xff0c;其中“随机变量”(Random Variable) 就是一种常用的配置元件&#xff0c;用于生成随机数值、字符串等&#xff0c;以模拟不同用户请求中的变化参…

认识meta

目录 认识meta camera_metadata的存储结构 camera_metadata的基本操作 申请camera_metadata 增加entry 查找entry 更新entry 删除entry 对tag的查找操作 vendor_tag_ops和vendor_cache_ops是Andriod提供的接口 propertyID Camxhal3metadatautil.cpp文件理解 Initia…

Redisson 分布式锁 - RLock、RReadWriteLock、RSemaphore、RCountDownLatch(配置、使用、原理)

目录 前言 Redisson 分布式锁 环境配置 1&#xff09;版本说明 2&#xff09;依赖如下 3&#xff09;配置文件如下 4&#xff09;项目配置 RLock 1&#xff09;使用方式 2&#xff09;加锁解释 3&#xff09;加锁时手动设置时间 4&#xff09;加锁时&#xff0c;到…

DALL-E 2详细介绍

DALL-E 2是由美国人工智能研究公司OpenAI推出的一款文本生成图像系统&#xff0c;它是DALL-E的后续版本&#xff0c;具有更强大的功能和更高的图像质量。以下是关于DALL-E 2的详细解释&#xff1a; 一、主要功能特点 文本到图像生成&#xff1a;DALL-E 2能够根据用户提供的文…

揭秘FL Studio21.2.8中文版一键解锁音乐创作新境界!

在音乐制作的广阔天地里&#xff0c;随着技术的不断进步和数字音频工作站&#xff08;DAW&#xff09;软件的普及&#xff0c;越来越多的音乐爱好者和专业制作人开始涉足音乐创作的奇妙旅程。其中&#xff0c;FL Studio以其强大的功能、直观的操作界面和丰富的音色资源&#xf…

vue+Django接入钉钉登录

前端处理 dingtalkLogin() {let url https://login.dingtalk.com/oauth2/auth?redirect_uri${this.dingRedirectUrl}&response_typecode&client_id${this.appKey}&scopeopenid&stateSTATE&promptconsentwindow.location.href url;},后端处理 def dingt…

Nginx:怎么携带参数重定向

在NGINX中&#xff0c;可以使用location指令和rewrite指令来携带参数进行重定向。 首先&#xff0c;可以使用location指令根据请求的URL匹配到一个特定的位置块。然后&#xff0c;在位置块中使用rewrite指令将请求重定向到另一个URL&#xff0c;并携带参数。 下面是一个示例配…

LED驱动IC:HC2106,1W升压型DC/DC白光LED驱动器HC2106系列,供应给大功率白光LED灯提供能源、恒流源

LED驱动IC&#xff1a; HC2106&#xff1a;1W升压型DC/DC白光LED驱动器HC2106系列 概述&#xff1a;HC2106系列芯片是针对LED应用设计的PFM 控制模式的开关型DC/DC 升压恒流芯片&#xff0c;通过外接电阻可使输出电流值恒定在0mA&#xff5e;500mA。 HC2106可以给一个、多个…

基于语音识别的智能电子病历(其他)签名的处理

签名业务流程的说明 概述 签名是医生对完成的报告的确认操作&#xff0c;是医生对报告完成状况的认可。 一般情况下一份报告对应一个录音&#xff0c;而一个录音对应一个病人的一次诊疗过程&#xff0c;因此只有那些参与了录音或诊疗过程的医生&#xff0c;才能具有对报告的签…

java实现jpg转png

在Java中&#xff0c;你可以使用javax.imageio.ImageIO类来实现JPG到PNG的转换。以下是一个简单的方法&#xff0c;它接受JPG文件的路径&#xff0c;读取该文件&#xff0c;转换成PNG格式&#xff0c;并保存到指定的输出路径。 以下是实现代码&#xff1a; import javax.image…

LeetCode刷题第3题(C#)

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串的长度。 法一&#xff1a; 这道题用到的其实是滑动窗口。 滑动窗口算法是在特定窗口大小的数组或字符串上执行要求的操作。它可以将一部分问题中的嵌套循环转变为一个单循环&#xff0c;以此减少时间复…

【Docker学习】docker push简述

docker push是docker pull的反向操作。我们将镜像上传到公共或私有镜像仓库就需要用到这个命令。 命令&#xff1a; docker image push 描述&#xff1a; 上传一个镜像到注册表。 用法&#xff1a; docker image push [OPTIONS] NAME[:TAG] 别名&#xff1a; docker pu…

实验名称:面向对象练习

门门都精通&#xff0c;头发去无踪。 目录 一、实验目的 二、实验环境 三、实验步骤 四、实验结果 1.设计一个圆类(Cirle)&#xff0c;该类中包含圆心位置、半径、颜色等属性&#xff0c;还包括构造函数和计算圆的周长、面积的方法&#xff0c;设计完成后&#xff0c;测试…

算法004:盛水最多的容器

这道题比较简单&#xff0c;使用双指针。 要求的是最大面积&#xff0c;对于一个水桶&#xff08;水杯来说&#xff09;&#xff0c;面积的算法是固定的&#xff0c;就是底乘以高。 在这个题中&#xff0c;我们把左边的位置设为left&#xff0c;右边的位置设为right&#xff…