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,以此类推。

最后效果:

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

相关推荐

  1. WPF】隐藏一个XAMLview视图

    2024-06-07 19:40:05       35 阅读
  2. 前端导出Excel

    2024-06-07 19:40:05       21 阅读
  3. css折叠导航

    2024-06-07 19:40:05       12 阅读
  4. vue:功能【xlsx】前端导出Excel

    2024-06-07 19:40:05       24 阅读
  5. 前端 - 管理后台自定义侧边导航

    2024-06-07 19:40:05       23 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-07 19:40:05       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-07 19:40:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-07 19:40:05       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-07 19:40:05       20 阅读

热门阅读

  1. 视频拼接服务分享

    2024-06-07 19:40:05       9 阅读
  2. WPF学习笔记:给StackPanel加阴影

    2024-06-07 19:40:05       10 阅读
  3. 开发常用软件

    2024-06-07 19:40:05       9 阅读
  4. Python一般用什么IDE:深入剖析四大主流选择

    2024-06-07 19:40:05       9 阅读
  5. OpenCV 4.X 使用CvxText在图片显示汉字

    2024-06-07 19:40:05       8 阅读
  6. Less is more VS 精一 [生活感悟]

    2024-06-07 19:40:05       10 阅读
  7. 【学习笔记】Redis-AOF日志重写的机制

    2024-06-07 19:40:05       10 阅读
  8. 【路径规划】三维深度矩阵寻路算法

    2024-06-07 19:40:05       10 阅读
  9. Python做Web:深度剖析与多维评价

    2024-06-07 19:40:05       9 阅读
  10. amis源码 onEvent事件动作 和 Action行为按钮解析

    2024-06-07 19:40:05       11 阅读
  11. 1348:【例4-9】城市公交网建设问题

    2024-06-07 19:40:05       8 阅读
  12. Ant-Design-Vue动态表头并填充数据

    2024-06-07 19:40:05       10 阅读