C# 容器上控制元件排序
public static class Sort
{
#region 設定PanelControl上按鈕顯示位置
/// <summary>
/// 設定按鈕顯示位置
/// </summary>
/// <param name="targetPanel">需要調整按鈕順序的Panel</param>
/// <param name="buttonSpace">按鈕間隔</param>
public static void SetButtonCenter(ScrollableControl targetPanel, int buttonSpace)
{
int length = 0;
int maxHeight = 0;
List<Control> listBtn = new List<Control>();
System.Windows.Forms.Control.ControlCollection c = targetPanel.Controls;
foreach (Control btn in c)
{
listBtn.Add(btn);
length += btn.Width + buttonSpace;
if (maxHeight < btn.Height)//獲取最大高度
{
maxHeight = btn.Height;
}
}
int pnlLength = targetPanel.Width;
if (length > pnlLength) //本身按鈕的長度總和大於了panel的長度,不調整
{
return;
}
int startPos = ((pnlLength - length) / 2);
int yPos = 0;
if (maxHeight < targetPanel.Height)
{
yPos = (targetPanel.Height - maxHeight) / 2;//距離panel上邊框的距離
}
else
{
yPos = targetPanel.Height / 10;//距離panel上邊框的距離
}
int xPos = startPos;
listBtn.Sort(new ButtonSort());
foreach (Control btn in listBtn)
{
btn.Location = new System.Drawing.Point(xPos, yPos);
xPos += btn.Width + buttonSpace;
}
}
#endregion
#region 設定Control上按鈕顯示位置
/// <summary>
/// 設定按鈕顯示位置
/// </summary>
/// <param name="container">需要調整按鈕順序的容器控制元件</param>
/// <param name="buttonSpace">按鈕間隔</param>
public static void SetButtonCenter(Control container, int buttonSpace)
{
int length = 0;
int maxHeight = 0;
List<Control> listControl = new List<Control>();
System.Windows.Forms.Control.ControlCollection c = container.Controls;
foreach (Control btn in c)
{
listControl.Add(btn);
length += btn.Width + buttonSpace;
if (maxHeight < btn.Height)//獲取最大高度
{
maxHeight = btn.Height;
}
}
int pnlLength = container.Width;
if (length > pnlLength) //本身按鈕的長度總和大於了panel的長度,不調整
{
return;
}
int startPos = ((pnlLength - length) / 2);
int yPos = 0;
if (maxHeight < container.Height)
{
yPos = (container.Height - maxHeight) / 2;//距離panel上邊框的距離
}
else
{
yPos = container.Height / 10;//距離panel上邊框的距離
}
int xPos = startPos;
listControl.Sort(new ButtonSort());
foreach (Control btn in listControl)
{
btn.Location = new System.Drawing.Point(xPos, yPos);
xPos += btn.Width + buttonSpace;
}
}
#endregion
}
public class ButtonSort : IComparer<Control>
{
#region IComparer<Button> Members
//IComparer<T> 介面:定義型別為比較兩個物件而實現的方法。
public int Compare(Control x, Control y)
{
if (x.TabIndex >= y.TabIndex)
{
return 1;
}
else
{
return -1;
}
}
#endregion
}
Sort類完善版本(修正傳入控制元件集合大小不一致,排序後文字顯示問題)
public static class Sort
{
#region 設定PanelControl上按鈕顯示位置
/// <summary>
/// 設定按鈕顯示位置
/// </summary>
/// <param name="targetPanel">需要調整按鈕順序的Panel</param>
/// <param name="buttonSpace">按鈕間隔</param>
public static void SetButtonCenter(ScrollableControl targetPanel, int buttonSpace)
{
int length = 0;
int maxHeight = 0;
bool controlsHeightSame = true;//控制元件高度是否一致
List<Control> lisControl = new List<Control>();
System.Windows.Forms.Control.ControlCollection controls = targetPanel.Controls;
foreach (Control btn in controls)
{
lisControl.Add(btn);
length += btn.Width + buttonSpace;
if (maxHeight < btn.Height)//獲取最大高度
{
maxHeight = btn.Height;
}
}
//判斷控制元件高度是否一致
//lisControl.ForEach(delegate(Control control)
//{
// if (control.Height != maxHeight)
// {
// controlsHeightSame = false;
// }
//});
lisControl.ForEach(control =>
{
if (control.Height != maxHeight)
{
controlsHeightSame = false;
}
});
int pnlLength = targetPanel.Width;
if (length > pnlLength) //本身按鈕的長度總和大於了panel的長度,不調整
{
return;
}
int startPos = ((pnlLength - length) / 2);
int yPos = 0;
int xPos = startPos;
lisControl.Sort(new ButtonSort());
//控制元件繪製的起點是左上角的頂點,yPos即控制元件的左上角頂點的y座標
if (controlsHeightSame)//控制元件高度一致
{
if (maxHeight < targetPanel.Height)
{
yPos = (targetPanel.Height - maxHeight) / 2;//距離panel上邊框的距離
}
else
{
yPos = targetPanel.Height / 10;//距離panel上邊框的距離
}
foreach (Control btn in lisControl)
{
btn.Location = new System.Drawing.Point(xPos, yPos);
xPos += btn.Width + buttonSpace;
}
}
else//控制元件大小不一致,每個控制元件的yPos單獨計算
{
foreach (Control btn in lisControl)
{
yPos = (targetPanel.Height - btn.Height) / 2;//距離panel上邊框的距離
btn.Location = new System.Drawing.Point(xPos, yPos);
xPos += btn.Width + buttonSpace;
}
}
}
#endregion
#region 設定Control上按鈕顯示位置
/// <summary>
/// 設定按鈕顯示位置
/// </summary>
/// <param name="container">需要調整按鈕順序的容器控制元件</param>
/// <param name="buttonSpace">按鈕間隔</param>
public static void SetButtonCenter(Control container, int buttonSpace)
{
int length = 0;
int maxHeight = 0;
bool controlsHeightSame = true;//控制元件高度是否一致
List<Control> listControl = new List<Control>();
System.Windows.Forms.Control.ControlCollection c = container.Controls;
foreach (Control btn in c)
{
listControl.Add(btn);
length += btn.Width + buttonSpace;
if (maxHeight < btn.Height)//獲取最大高度
{
maxHeight = btn.Height;
}
}
//判斷控制元件高度是否一致
//listControl.ForEach(delegate(Control control)
//{
// if (control.Height != maxHeight)
// {
// controlsHeightSame = false;
// }
//});
listControl.ForEach(control =>
{
if (control.Height != maxHeight)
{
controlsHeightSame = false;
}
});
int pnlLength = container.Width;
if (length > pnlLength) //本身按鈕的長度總和大於了panel的長度,不調整
{
return;
}
int startPos = ((pnlLength - length) / 2);
int yPos = 0;
int xPos = startPos;
listControl.Sort(new ButtonSort());
//控制元件繪製的起點是左上角的頂點,yPos即控制元件的左上角頂點的y座標
if (controlsHeightSame)//控制元件高度一致
{
if (maxHeight < container.Height)
{
yPos = (container.Height - maxHeight) / 2;//距離panel上邊框的距離
}
else
{
yPos = container.Height / 10;//距離panel上邊框的距離
}
foreach (Control btn in listControl)
{
btn.Location = new System.Drawing.Point(xPos, yPos);
xPos += btn.Width + buttonSpace;
}
}
else//控制元件大小不一致,每個控制元件的yPos單獨計算
{
foreach (Control btn in listControl)
{
yPos = (container.Height - btn.Height) / 2;//距離panel上邊框的距離
btn.Location = new System.Drawing.Point(xPos, yPos);
xPos += btn.Width + buttonSpace;
}
}
}
#endregion
}
相關文章
- 經典排序演算法 — C# 版(上)排序演算法C#
- 容器氣泡排序排序
- C#控制元件之Repeater控制元件使用C#控制元件
- winform 自定義容器控制元件ORM控制元件
- Flutter 容器控制元件篇-->ScaffoldFlutter控制元件
- Flutter 容器控制元件篇-->MaterialAppFlutter控制元件APP
- Flutter 容器控制元件篇-->ContainerFlutter控制元件AI
- C# 選擇排序C#排序
- c# 陣列排序C#陣列排序
- c#文字型別控制元件C#型別控制元件
- C#自定義控制元件—指示燈C#控制元件
- C#堆排序演算法C#排序演算法
- C# Winform常用控制元件縮寫大全C#ORM控制元件
- C#自定義控制元件—儀表盤C#控制元件
- C#自定義控制元件—流動管道C#控制元件
- c# 對JSON字串排序(KEY/VALUE)C#JSON字串排序
- C#基數排序演算法C#排序演算法
- C# JSON按key進行排序C#JSON排序
- C#各種加密方法,字典排序C#加密排序
- C#自定義控制元件—轉換開關C#控制元件
- C#自定義控制元件—旋轉按鈕C#控制元件
- [WPF]原生TabControl控制元件實現拖拽排序功能控制元件排序
- C++中使用sort對常見容器排序C++排序
- 鴻蒙安全控制元件之貼上控制元件簡介鴻蒙控制元件
- C#實現——十大排序演算法之選擇排序C#排序演算法
- 順序容器初探(上)
- 經典排序演算法 — C#版本(中)排序演算法C#
- C#中的依賴注入和IoC容器C#依賴注入
- C# 根據BackgroundWoker非同步模型和ProgressBar控制元件,自定義進度條控制元件C#非同步模型控制元件
- C# DevExpress控制元件Gridview和GridControl學習總結C#devExpress控制元件View
- C#自定義控制元件—文字顯示、文字設值C#控制元件
- C++筆記— 排序函式sort() 和vector容器C++筆記排序函式
- C# 泛型集合的自定義型別排序C#泛型型別排序
- [C#] (原創)一步一步教你自定義控制元件——05,Label(原生控制元件)C#控制元件
- (戀上資料結構筆記):計數排序、基數排序 、桶排序資料結構筆記排序
- C# WinForm控制元件及其子控制元件轉成圖片(支援帶捲軸的長截圖)C#ORM控制元件
- c# 獲取當前方法事件對應的控制元件C#事件控制元件
- C# WPF 用MediaElement控制元件實現視訊迴圈播放C#控制元件
- C# httpclient上傳檔案C#HTTPclient