首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# WinForms 實戰:StatusStrip 控件完整使用指南

     編輯:關於C#

認識 StatusStrip

StatusStrip 是 Windows Forms 中專用於窗體底部狀態欄的容器控件,繼承自 ToolStrip,內部通過 Items 集合管理多種子控件:

  • ToolStripStatusLabel:顯示文本/圖標(最常用)。
  • ToolStripProgressBar:進度條。
  • ToolStripDropDownButton/SplitButton:下拉菜單。
  • ToolStripSpringTextBox:輸入框(罕用)。

設計器拖拽模式(推薦)

  1. 工具箱拖入 StatusStrip 到窗體(自動靠底停駐)。
  2. 點擊 StatusStrip 右側智能標籤 → 添加 ToolStripStatusLabel。
  3. 屬性窗口設置 Text = "Test"、Spring = true(佔滿剩餘寬度)、TextAlign = MiddleLeft。
  4. 可繼續添加 ProgressBar、下拉按鈕等,通過項目集合編輯器調整順序。

代碼動態構建模式

適用於運行時根據條件生成狀態欄:

public Form1() {
    InitializeComponent();
    
    // 1. 創建 StatusStrip
    var statusStrip = new StatusStrip();
    
    // 2. 創建子控件
    var label = new ToolStripStatusLabel {
        Text = "Test",
        Spring = true,           // 自動填充寬度
        TextAlign = ContentAlignment.MiddleLeft
    };
    var progress = new ToolStripProgressBar {
        Name = "progressBar",
        Visible = false          // 需時顯示
    };
    
    // 3. 加入項目集合(順序即顯示順序)
    statusStrip.Items.AddRange(new ToolStripItem[] { label, progress });
    
    // 4. 加入窗體控件集合
    this.Controls.Add(statusStrip);
}

常用屬性與技巧

屬性/方法說明
Items子控件集合,支持 Add/AddRange/Insert/Remove
LayoutStyle佈局模式:HorizontalStackWithOverflow(默認)、VerticalStackWithOverflow、Flow、Table
SizingGrip右下角調整手柄,默認顯示
Stretch是否拉伸填充容器寬度
ToolStripStatusLabel.Springtrue 時佔據所有剩餘空間,實現左對齊/右對齊佈局
ToolStripProgressBar.StyleContinuous/Marquee(滾動等待)

實戰場景:多區域狀態顯示

private void SetupStatusBar() {
    var ss = new StatusStrip();
    
    // 左側:就緒狀態
    var lblStatus = new ToolStripStatusLabel {
        Text = "就緒",
        Spring = true,
        TextAlign = ContentAlignment.MiddleLeft,
        BorderSides = ToolStripStatusLabelBorderSides.Right
    };
    
    // 中間:進度條(初始隱藏)
    var pb = new ToolStripProgressBar {
        Name = "progress",
        Visible = false,
        Width = 200
    };
    
    // 右側:時間
    var lblTime = new ToolStripStatusLabel {
        Text = DateTime.Now.ToString("T"),
        BorderSides = ToolStripStatusLabelBorderSides.Left,
        AutoSize = false,
        Width = 100
    };
    
    ss.Items.AddRange(new ToolStripItem[] { lblStatus, pb, lblTime });
    this.Controls.Add(ss);
    
    // 定時器更新時間
    var timer = new Timer { Interval = 1000 };
    timer.Tick += (s, e) => lblTime.Text = DateTime.Now.ToString("T");
    timer.Start();
}

進階:運行時動態更新進度

private async Task ProcessWithProgress(IEnumerable items) {
    var progress = (ToolStripProgressBar)statusStrip.Items["progress"];
    var lblStatus = (ToolStripStatusLabel)statusStrip.Items[0];
    
    progress.Visible = true;
    progress.Value = 0;
    progress.Maximum = items.Count();
    
    int i = 0;
    foreach (var item in items) {
        await ProcessItem(item);
        progress.Value = ++i;
        lblStatus.Text = $"處理中... {i}/{progress.Maximum}";
        Application.DoEvents(); // 保持 UI 響應(或用 async/await 配合 Progress)
    }
    
    lblStatus.Text = "完成";
    progress.Visible = false;
}

避坑指南

  • ❌ 不要在構造函數中訪問 statusStrip.Items[0] —— InitializeComponent() 尚未運行,設計器創建的控件尚未加入集合。
  • ✅ 使用 Name 屬性通過 Items["name"] 索引訪問,比索引更健壯。
  • ✅ 長時間操作務必使用 async/await + IProgress<T> 更新 UI,避免阻塞主線程導致狀態欄凍結。
  • ✅ Spring=true 的項目會壓縮其他項目空間,佈局規劃時預留寬度。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved