C#中实现左侧折叠导航菜单的示例代码

 更新时间:2026年01月05日 11:15:01   作者:jllllyuz  
本文详细介绍了基于C#实现左侧折叠导航菜单的技术方案,涵盖WinForms和WPF框架,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

基于C#实现左侧折叠导航菜单的完整技术方案,涵盖WinForms和WPF两种主流开发框架,结合界面设计、交互逻辑和工程实践:

一、WinForms实现方案

1. 基础控件组合

核心控件选择

  • Panel容器:用于包裹折叠内容
  • Button/Label:作为菜单触发器
  • TreeView:展示多级菜单结构
  • SplitContainer:实现左右分栏布局

示例代码

// 初始化菜单面板
Panel menuPanel = new Panel {
    Dock = DockStyle.Left,
    Width = 200,
    BackColor = Color.FromArgb(240, 240, 240)
};

// 创建折叠按钮
Button toggleBtn = new Button {
    Text = "☰ 菜单",
    Dock = DockStyle.Top,
    Font = new Font("微软雅黑", 10, FontStyle.Bold),
    BackColor = Color.DimGray
};
toggleBtn.Click += (s, e) => {
    menuPanel.Width = menuPanel.Width == 200 ? 60 : 200;
    this.Invalidate(); // 触发重绘
};

// 添加到窗体
this.Controls.Add(toggleBtn);
this.Controls.Add(menuPanel);

2. 动画效果实现

通过定时器实现平滑展开/折叠:

Timer aniTimer = new Timer { Interval = 20 };
int targetWidth = 200;
int currentWidth = 60;

void AnimateResize() {
    if (menuPanel.Width < targetWidth) {
        menuPanel.Width += 5;
        toggleBtn.Text = "☰ 菜单";
    } else if (menuPanel.Width > currentWidth) {
        menuPanel.Width -= 5;
        toggleBtn.Text = "▶ 内容";
    } else {
        aniTimer.Stop();
    }
}

// 触发时启动动画
toggleBtn.Click += (s, e) => {
    targetWidth = menuPanel.Width == 200 ? 60 : 200;
    currentWidth = menuPanel.Width;
    aniTimer.Start();
};

3. 多级菜单实现

使用TreeView控件构建层级结构:

TreeNode node1 = new TreeNode("系统管理", 0, 0);
TreeNode node1_1 = new TreeNode("用户管理", 1, 1);
TreeNode node1_2 = new TreeNode("权限设置", 2, 2);
node1.Nodes.Add(node1_1);
node1.Nodes.Add(node1_2);

treeView1.Nodes.Add(node1);
treeView1.ExpandAll();

二、WPF实现方案

1. XAML布局设计

<Window x:Class="FoldableMenu.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        Title="折叠导航菜单" Height="450" Width="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <!-- 左侧菜单 -->
        <DockPanel x:Name="MenuDock" Grid.Column="0" Width="200" Background="#2D2D30">
            <Button DockPanel.Dock="Top" 
                    Content="☰ 菜单" 
                    Foreground="White" 
                    FontSize="16"
                    Margin="5"
                    Click="ToggleMenu"/>
            
            <Expander Header="系统管理" IsExpanded="False">
                <Expander.HeaderTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding}" 
                                   Foreground="LightBlue" 
                                   Margin="5"/>
                    </DataTemplate>
                </Expander.HeaderTemplate>
                <ListBox>
                    <ListBoxItem Content="用户管理"/>
                    <ListBoxItem Content="权限设置"/>
                </ListBox>
            </Expander>
        </DockPanel>

        <!-- 主内容区 -->
        <Grid Grid.Column="1">
            <TextBlock Text="主内容区域" 
                       FontSize="24" 
                       VerticalAlignment="Center" 
                       HorizontalAlignment="Center"/>
        </Grid>
    </Grid>
</Window>

2. 动态菜单绑定

通过ViewModel绑定数据:

public class MenuModel : INotifyPropertyChanged {
    private bool _isExpanded;
    public bool IsExpanded {
        get => _isExpanded;
        set {
            _isExpanded = value;
            OnPropertyChanged(nameof(IsExpanded));
        }
    }
    
    // 实现INotifyPropertyChanged接口
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string prop) {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
    }
}

// XAML绑定
<Expander Header="系统管理" IsExpanded="{Binding IsExpanded}">

3. 动画效果实现

使用Storyboard实现折叠动画:

<Window.Resources>
    <Storyboard x:Key="CollapseAnim">
        <DoubleAnimation Storyboard.TargetName="MenuDock" 
                         Storyboard.TargetProperty="Width"
                         From="200" To="60" Duration="0:0:0.3"/>
    </Storyboard>
    
    <Storyboard x:Key="ExpandAnim">
        <DoubleAnimation Storyboard.TargetName="MenuDock" 
                         Storyboard.TargetProperty="Width"
                         From="60" To="200" Duration="0:0:0.3"/>
    </Storyboard>
</Window.Resources>

// 触发动画
private void ToggleMenu(object sender, RoutedEventArgs e) {
    Storyboard sb = (MenuDock.Width == 200) 
        ? (Storyboard)FindResource("CollapseAnim") 
        : (Storyboard)FindResource("ExpandAnim");
    sb.Begin(this);
}

参考代码 C#左侧折叠导航菜单 youwenfan.com/contentcsb/111938.html

三、进阶功能实现

1. 图标与样式定制

  • 图标集成:使用Image控件或字体图标库(如FontAwesome)
  • 悬停效果:通过Style.Triggers实现颜色变化
<Style TargetType="Button">
    <Setter Property="Background" Value="Transparent"/>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="#404040"/>
        </Trigger>
    </Style.Triggers>
</Style>

2. 状态持久化

使用ApplicationSettings保存展开状态:

// 保存状态
Properties.Settings.Default.MenuWidth = menuDock.Width;
Properties.Settings.Default.Save();

// 恢复状态
menuDock.Width = Properties.Settings.Default.MenuWidth;

3. 多分辨率适配

  • WPF自适应布局:使用Viewbox控件自动缩放
  • WinForms动态调整:监听Resize事件
private void Form_Resize(object sender, EventArgs e) {
    menuPanel.Width = this.ClientSize.Width / 4;
}

四、第三方库推荐

库名称特点适用场景
HslCommunication提供现成的导航控件,支持主题切换企业级应用开发
DevExpress WinForms包含Ribbon控件和高级布局管理器复杂业务系统
MaterialDesignInXaml实现Material Design风格菜单现代化UI设计

五、工程实践建议

  1. 模块化设计:将菜单项封装为独立UserControl
  2. 权限控制:通过角色标识动态加载菜单项
  3. 性能优化:虚拟化技术处理大量菜单项(WPF的VirtualizingStackPanel
  4. 测试方案:
    • 多分辨率测试(1920x1080/1366x768等)
    • 快速点击防抖处理
    • 低配环境性能测试

到此这篇关于C#实现左侧折叠导航菜单的示例代码的文章就介绍到这了,更多相关C# 左侧折叠导航菜单内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用C#实现DataSet与Excel的互相转换

    使用C#实现DataSet与Excel的互相转换

    在日常开发中,DataSet 是 .NET 程序中常用的数据容器,而 Excel 文件 则是数据交换和报表的常见格式,在实际业务中,经常需要将数据库查询结果保存到 Excel 文件,所以本文介绍了如何使用C#实现DataSet与Excel的互相转换,需要的朋友可以参考下
    2025-11-11
  • C# 使用Dictionary复制克隆副本及比较是否相等

    C# 使用Dictionary复制克隆副本及比较是否相等

    这篇文章主要介绍了C# 使用Dictionary复制克隆副本及比较是否相等,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • C#画笔Pen绘制曲线的方法

    C#画笔Pen绘制曲线的方法

    这篇文章主要介绍了C#画笔Pen绘制曲线的方法,主要涉及C#画笔中DrawCurve方法的使用技巧,需要的朋友可以参考下
    2015-06-06
  • C# PaddleOCRSharp OCR进行疲劳测试

    C# PaddleOCRSharp OCR进行疲劳测试

    PaddleOCRSharp 是百度飞桨封装的.NET版本 OCR dll 类库,OCR可以将图像文件中的文本内容进行识别,下面我们就来看看如何通过它们实现疲劳测试吧
    2024-11-11
  • C#调用Nero SDK刻录光盘的方法

    C#调用Nero SDK刻录光盘的方法

    这篇文章主要介绍了C#调用Nero SDK刻录光盘的方法,涉及C#调用NeroCOM组件实现光盘刻录的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • c#反射表达式树模糊搜索示例

    c#反射表达式树模糊搜索示例

    这篇文章主要介绍了c#反射表达式树模糊搜索示例,反射实体T,非datetime字段反射获取表达式树,需要的朋友可以参考下
    2014-02-02
  • C#实现图片加相框的方法

    C#实现图片加相框的方法

    这篇文章主要介绍了C#实现图片加相框的方法,涉及C#图片及图形绘制的相关技巧,需要的朋友可以参考下
    2016-02-02
  • C#实现随机数产生类实例

    C#实现随机数产生类实例

    这篇文章主要介绍了C#实现随机数产生类,实例分析了C#随机数的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • C#通过经纬度计算2个点之间距离的实现代码

    C#通过经纬度计算2个点之间距离的实现代码

    这篇文章主要介绍了C#通过经纬度计算2个点之间距离实现代码,本文对实现原理、经纬度基本知识等一并做了讲解,需要的朋友可以参考下
    2014-08-08
  • C#实现客户端弹出消息框封装类实例

    C#实现客户端弹出消息框封装类实例

    这篇文章主要介绍了C#实现客户端弹出消息框封装类,实例分析了C#弹出窗口的实现技巧,非常具有实用价值,需要的朋友可以参考下
    2015-03-03

最新评论