C#中實(shí)現(xiàn)左側(cè)折疊導(dǎo)航菜單的示例代碼
基于C#實(shí)現(xiàn)左側(cè)折疊導(dǎo)航菜單的完整技術(shù)方案,涵蓋WinForms和WPF兩種主流開發(fā)框架,結(jié)合界面設(shè)計(jì)、交互邏輯和工程實(shí)踐:
一、WinForms實(shí)現(xiàn)方案
1. 基礎(chǔ)控件組合
核心控件選擇:
- Panel容器:用于包裹折疊內(nèi)容
- Button/Label:作為菜單觸發(fā)器
- TreeView:展示多級菜單結(jié)構(gòu)
- SplitContainer:實(shí)現(xiàn)左右分欄布局
示例代碼:
// 初始化菜單面板
Panel menuPanel = new Panel {
Dock = DockStyle.Left,
Width = 200,
BackColor = Color.FromArgb(240, 240, 240)
};
// 創(chuàng)建折疊按鈕
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(); // 觸發(fā)重繪
};
// 添加到窗體
this.Controls.Add(toggleBtn);
this.Controls.Add(menuPanel);
2. 動畫效果實(shí)現(xiàn)
通過定時(shí)器實(shí)現(xiàn)平滑展開/折疊:
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 = "? 內(nèi)容";
} else {
aniTimer.Stop();
}
}
// 觸發(fā)時(shí)啟動動畫
toggleBtn.Click += (s, e) => {
targetWidth = menuPanel.Width == 200 ? 60 : 200;
currentWidth = menuPanel.Width;
aniTimer.Start();
};
3. 多級菜單實(shí)現(xiàn)
使用TreeView控件構(gòu)建層級結(jié)構(gòu):
TreeNode node1 = new TreeNode("系統(tǒng)管理", 0, 0);
TreeNode node1_1 = new TreeNode("用戶管理", 1, 1);
TreeNode node1_2 = new TreeNode("權(quán)限設(shè)置", 2, 2);
node1.Nodes.Add(node1_1);
node1.Nodes.Add(node1_2);
treeView1.Nodes.Add(node1);
treeView1.ExpandAll();
二、WPF實(shí)現(xiàn)方案
1. XAML布局設(shè)計(jì)
<Window x:Class="FoldableMenu.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Title="折疊導(dǎo)航菜單" Height="450" Width="800">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- 左側(cè)菜單 -->
<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="系統(tǒng)管理" IsExpanded="False">
<Expander.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"
Foreground="LightBlue"
Margin="5"/>
</DataTemplate>
</Expander.HeaderTemplate>
<ListBox>
<ListBoxItem Content="用戶管理"/>
<ListBoxItem Content="權(quán)限設(shè)置"/>
</ListBox>
</Expander>
</DockPanel>
<!-- 主內(nèi)容區(qū) -->
<Grid Grid.Column="1">
<TextBlock Text="主內(nèi)容區(qū)域"
FontSize="24"
VerticalAlignment="Center"
HorizontalAlignment="Center"/>
</Grid>
</Grid>
</Window>
2. 動態(tài)菜單綁定
通過ViewModel綁定數(shù)據(jù):
public class MenuModel : INotifyPropertyChanged {
private bool _isExpanded;
public bool IsExpanded {
get => _isExpanded;
set {
_isExpanded = value;
OnPropertyChanged(nameof(IsExpanded));
}
}
// 實(shí)現(xiàn)INotifyPropertyChanged接口
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string prop) {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
}
}
// XAML綁定
<Expander Header="系統(tǒng)管理" IsExpanded="{Binding IsExpanded}">
3. 動畫效果實(shí)現(xiàn)
使用Storyboard實(shí)現(xiàn)折疊動畫:
<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>
// 觸發(fā)動畫
private void ToggleMenu(object sender, RoutedEventArgs e) {
Storyboard sb = (MenuDock.Width == 200)
? (Storyboard)FindResource("CollapseAnim")
: (Storyboard)FindResource("ExpandAnim");
sb.Begin(this);
}
參考代碼 C#左側(cè)折疊導(dǎo)航菜單 youwenfan.com/contentcsb/111938.html
三、進(jìn)階功能實(shí)現(xiàn)
1. 圖標(biāo)與樣式定制
- 圖標(biāo)集成:使用
Image控件或字體圖標(biāo)庫(如FontAwesome) - 懸停效果:通過
Style.Triggers實(shí)現(xiàn)顏色變化
<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. 狀態(tài)持久化
使用ApplicationSettings保存展開狀態(tài):
// 保存狀態(tài) Properties.Settings.Default.MenuWidth = menuDock.Width; Properties.Settings.Default.Save(); // 恢復(fù)狀態(tài) menuDock.Width = Properties.Settings.Default.MenuWidth;
3. 多分辨率適配
- WPF自適應(yīng)布局:使用
Viewbox控件自動縮放 - WinForms動態(tài)調(diào)整:監(jiān)聽
Resize事件
private void Form_Resize(object sender, EventArgs e) {
menuPanel.Width = this.ClientSize.Width / 4;
}
四、第三方庫推薦
| 庫名稱 | 特點(diǎn) | 適用場景 |
|---|---|---|
| HslCommunication | 提供現(xiàn)成的導(dǎo)航控件,支持主題切換 | 企業(yè)級應(yīng)用開發(fā) |
| DevExpress WinForms | 包含Ribbon控件和高級布局管理器 | 復(fù)雜業(yè)務(wù)系統(tǒng) |
| MaterialDesignInXaml | 實(shí)現(xiàn)Material Design風(fēng)格菜單 | 現(xiàn)代化UI設(shè)計(jì) |
五、工程實(shí)踐建議
- 模塊化設(shè)計(jì):將菜單項(xiàng)封裝為獨(dú)立UserControl
- 權(quán)限控制:通過角色標(biāo)識動態(tài)加載菜單項(xiàng)
- 性能優(yōu)化:虛擬化技術(shù)處理大量菜單項(xiàng)(WPF的
VirtualizingStackPanel) - 測試方案:
- 多分辨率測試(1920x1080/1366x768等)
- 快速點(diǎn)擊防抖處理
- 低配環(huán)境性能測試
到此這篇關(guān)于C#實(shí)現(xiàn)左側(cè)折疊導(dǎo)航菜單的示例代碼的文章就介紹到這了,更多相關(guān)C# 左側(cè)折疊導(dǎo)航菜單內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#將BCD字節(jié)數(shù)組轉(zhuǎn)十進(jìn)制字符串的原理與實(shí)現(xiàn)思路
BCD編碼是一種用二進(jìn)制直接表示十進(jìn)制數(shù)字的編碼方式,分為壓縮和非壓縮兩種格式,下面小編就和大家詳細(xì)介紹一下如何使用C#將BCD字節(jié)數(shù)組轉(zhuǎn)十進(jìn)制字符串吧2026-05-05
C# 使用CancellationTokenSource取消多線程
有時(shí)間我們在使用多線程的時(shí)候,需要取消線程的執(zhí)行,可以使用CancellationTokenSource來取消對Task開辟多線程的取消,感興趣的可以了解一下2021-08-08
C#實(shí)現(xiàn)把科學(xué)計(jì)數(shù)法(E)轉(zhuǎn)化為正常數(shù)字值
這篇文章主要介紹了C#實(shí)現(xiàn)把科學(xué)計(jì)數(shù)法(E)轉(zhuǎn)化為正常數(shù)字值,本文直接給出代碼實(shí)例,需要的朋友可以參考下2015-06-06
利用C#實(shí)現(xiàn)網(wǎng)絡(luò)爬蟲
這篇文章主要介紹了利用C#實(shí)現(xiàn)網(wǎng)絡(luò)爬蟲,完整的介紹了C#實(shí)現(xiàn)網(wǎng)絡(luò)爬蟲詳細(xì)過程,感興趣的小伙伴們可以參考一下2016-03-03
C#正則表達(dá)式獲取下拉菜單(select)的相關(guān)屬性值
這篇文章主要介紹了C#正則表達(dá)式獲取下拉菜單(select)的相關(guān)屬性值,比如可以獲得name屬性的值、value值、指定值,需要的朋友可以參考下2014-07-07
C#多線程處理多個隊(duì)列數(shù)據(jù)的方法
本文將結(jié)合實(shí)例代碼,介紹C#多線程處理多個隊(duì)列數(shù)據(jù)的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06
C#語言使用gRPC、protobuf(Google Protocol Buffers)實(shí)現(xiàn)文件傳輸功能
這篇文章主要介紹了C#語言使用gRPC、protobuf(Google Protocol Buffers)實(shí)現(xiàn)文件傳輸功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10

