优化分隔条显示控制逻辑,添加通用的UpdateSeparatorsVisibility方法,当分隔条前或后没有可见按钮时将其设为隐藏

This commit is contained in:
zqm
2025-11-11 16:19:28 +08:00
parent d81b7bd084
commit 2f5bf1b164

View File

@@ -999,6 +999,59 @@ namespace JoyD.Windows.CS
return adjustedBrushSize;
}
/// <summary>
/// 控制分隔条显示状态的通用方法
/// 从第一个按钮开始遍历,当分隔条前或后没有可见按钮时将其设为隐藏
/// </summary>
private void UpdateSeparatorsVisibility()
{
try
{
// 遍历所有工具条项
for (int i = 0; i < toolStrip.Items.Count; i++)
{
// 找到分隔条
if (toolStrip.Items[i] is ToolStripSeparator separator)
{
bool hasVisibleItemBefore = false;
bool hasVisibleItemAfter = false;
// 向前查找可见的项目
for (int j = i - 1; j >= 0; j--)
{
if ((toolStrip.Items[j] is ToolStripButton btn && btn.Visible) ||
(toolStrip.Items[j] is ToolStripTextBox tb && tb.Visible) ||
(toolStrip.Items[j] is ToolStripComboBox cb && cb.Visible))
{
hasVisibleItemBefore = true;
break;
}
}
// 向后查找可见的项目
for (int j = i + 1; j < toolStrip.Items.Count; j++)
{
if ((toolStrip.Items[j] is ToolStripButton btn && btn.Visible) ||
(toolStrip.Items[j] is ToolStripTextBox tb && tb.Visible) ||
(toolStrip.Items[j] is ToolStripComboBox cb && cb.Visible))
{
hasVisibleItemAfter = true;
break;
}
}
// 当分隔条前或后没有可见按钮时,将其设为隐藏
// 只有当前后都有可见按钮时,分隔条才显示
separator.Visible = hasVisibleItemBefore && hasVisibleItemAfter;
}
}
}
catch (Exception ex)
{
Console.WriteLine("更新分隔条可见性失败: " + ex.Message);
}
}
/// <summary>
/// 根据状态设置按钮可见性
/// </summary>
@@ -1007,30 +1060,7 @@ namespace JoyD.Windows.CS
{
try
{
// 获取工具栏分隔条引用
ToolStripSeparator firstSeparator = null; // 删除温差图例按钮和画笔大小按钮之间的分隔条
ToolStripSeparator secondSeparator = null; // 画笔大小按钮和新按钮组之间的分隔条
ToolStripSeparator thirdSeparator = null; // txtRegionNumber后面的分隔条
// 查找分隔条
for (int i = 0; i < toolStrip.Items.Count - 1; i++)
{
// 查找第一个分隔条(在删除温差图例按钮和画笔大小按钮之间)
if (toolStrip.Items[i] == btnDeleteTempDiff && toolStrip.Items[i + 1] is ToolStripSeparator)
{
firstSeparator = toolStrip.Items[i + 1] as ToolStripSeparator;
}
// 查找第二个分隔条(在画笔大小按钮和新按钮组之间)
else if (toolStrip.Items[i] == btnBrushSize25 && toolStrip.Items[i + 1] is ToolStripSeparator)
{
secondSeparator = toolStrip.Items[i + 1] as ToolStripSeparator;
}
// 查找第三个分隔条在txtRegionNumber后面
else if (toolStrip.Items[i] == txtRegionNumber && toolStrip.Items[i + 1] is ToolStripSeparator)
{
thirdSeparator = toolStrip.Items[i + 1] as ToolStripSeparator;
}
}
// 创建检查是否有画笔按钮可见的辅助方法
Func<bool> HasVisibleBrushButtons = () =>
@@ -1071,22 +1101,8 @@ namespace JoyD.Windows.CS
// 隐藏区域编号设置控件
txtRegionNumber.Visible = false;
txtRegionNumber.Text = ""; // 清空文本框
// 控制分隔条可见性:分隔条只有在前后都有可见按钮时才显示
if (firstSeparator != null)
{
// 第一个分隔条:前面按钮(btnDeleteTempDiff)和后面按钮(所有画笔按钮)都不可见
firstSeparator.Visible = btnDeleteTempDiff.Visible && HasVisibleBrushButtons();
}
if (secondSeparator != null)
{
// 第二个分隔条:前面按钮(所有画笔按钮)不可见,后面按钮组有可见按钮
secondSeparator.Visible = HasVisibleBrushButtons() && HasVisibleNewButtons();
}
if (thirdSeparator != null)
{
// 在初始状态下txtRegionNumber是隐藏的所以分隔条也应该隐藏
thirdSeparator.Visible = false;
}
// 调用通用方法控制分隔条可见性
UpdateSeparatorsVisibility();
break;
case 2: // 绘制状态
@@ -1118,22 +1134,8 @@ namespace JoyD.Windows.CS
btnBrushSize10.Visible = false;
btnBrushSize15.Visible = false;
btnBrushSize25.Visible = false;
// 控制分隔条可见性:分隔条只有在前后都有可见按钮时才显示
if (firstSeparator != null)
{
// 第一个分隔条:前面按钮(btnDeleteTempDiff)和后面按钮(所有画笔按钮)都不可见
firstSeparator.Visible = btnDeleteTempDiff.Visible && HasVisibleBrushButtons();
}
if (secondSeparator != null)
{
// 第二个分隔条:前面按钮(所有画笔按钮)和后面按钮(新按钮组)都不可见
secondSeparator.Visible = HasVisibleBrushButtons() && HasVisibleNewButtons();
}
if (thirdSeparator != null)
{
// 在温差图绘制状态下txtRegionNumber是隐藏的所以分隔条也应该隐藏
thirdSeparator.Visible = false;
}
// 调用通用方法控制分隔条可见性
UpdateSeparatorsVisibility();
break;
case 1: // 选中区域状态
btnDrawRegion.Visible = false; // 隐藏绘制区域按钮
@@ -1169,22 +1171,8 @@ namespace JoyD.Windows.CS
btnBrushSize10.Visible = false;
btnBrushSize15.Visible = false;
btnBrushSize25.Visible = false;
// 控制分隔条可见性:分隔条只有在前后都有可见按钮时才显示
if (firstSeparator != null)
{
// 第一个分隔条:前面按钮(btnDeleteTempDiff)和后面按钮(所有画笔按钮)都不可见
firstSeparator.Visible = btnDeleteTempDiff.Visible && HasVisibleBrushButtons();
}
if (secondSeparator != null)
{
// 第二个分隔条:前面按钮(所有画笔按钮)和后面按钮(新按钮组)都不可见
secondSeparator.Visible = HasVisibleBrushButtons() && HasVisibleNewButtons();
}
if (thirdSeparator != null)
{
// 在选中区域状态下txtRegionNumber后面的分隔条应该隐藏
thirdSeparator.Visible = false;
}
// 调用通用方法控制分隔条可见性
UpdateSeparatorsVisibility();
break;
case 3: // 温差图绘制状态
@@ -1213,22 +1201,8 @@ namespace JoyD.Windows.CS
btnBrushSize10.Visible = false;
btnBrushSize15.Visible = false;
btnBrushSize25.Visible = false;
// 控制分隔条可见性:分隔条只有在前后都有可见按钮时才显示
if (firstSeparator != null)
{
// 第一个分隔条:前面按钮(btnDeleteTempDiff)可见,检查后面是否有可见的画笔按钮
firstSeparator.Visible = btnDeleteTempDiff.Visible && HasVisibleBrushButtons();
}
if (secondSeparator != null)
{
// 第二个分隔条:前面按钮(所有画笔按钮)和后面按钮(新按钮组)都不可见
secondSeparator.Visible = HasVisibleBrushButtons() && HasVisibleNewButtons();
}
if (thirdSeparator != null)
{
// 在绘制状态下txtRegionNumber后面的分隔条应该隐藏
thirdSeparator.Visible = false;
}
// 调用通用方法控制分隔条可见性
UpdateSeparatorsVisibility();
break;
}
}