增加拖动顺序调整

This commit is contained in:
ww-rm
2025-02-26 20:41:04 +08:00
parent d2b00d5523
commit 04be3af4d7
3 changed files with 198 additions and 28 deletions

View File

@@ -28,16 +28,20 @@
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SpineListView));
tableLayoutPanel = new TableLayoutPanel();
flowLayoutPanel_Buttons = new FlowLayoutPanel();
button_Add = new Button();
button_Insert = new Button();
button_Remove = new Button();
button_MoveUp = new Button();
button_MoveDown = new Button();
button_Insert = new Button();
button_RemoveAll = new Button();
listView = new ListView();
columnHeader_Name = new ColumnHeader();
columnHeader_Version = new ColumnHeader();
toolTip = new ToolTip(components);
tableLayoutPanel.SuspendLayout();
flowLayoutPanel_Buttons.SuspendLayout();
SuspendLayout();
@@ -62,10 +66,11 @@
//
flowLayoutPanel_Buttons.AutoSize = true;
flowLayoutPanel_Buttons.Controls.Add(button_Add);
flowLayoutPanel_Buttons.Controls.Add(button_Insert);
flowLayoutPanel_Buttons.Controls.Add(button_Remove);
flowLayoutPanel_Buttons.Controls.Add(button_MoveUp);
flowLayoutPanel_Buttons.Controls.Add(button_MoveDown);
flowLayoutPanel_Buttons.Controls.Add(button_Insert);
flowLayoutPanel_Buttons.Controls.Add(button_RemoveAll);
flowLayoutPanel_Buttons.Dock = DockStyle.Fill;
flowLayoutPanel_Buttons.Location = new Point(3, 3);
flowLayoutPanel_Buttons.Name = "flowLayoutPanel_Buttons";
@@ -76,37 +81,28 @@
//
button_Add.Anchor = AnchorStyles.None;
button_Add.AutoSize = true;
button_Add.AutoSizeMode = AutoSizeMode.GrowAndShrink;
button_Add.Image = (Image)resources.GetObject("button_Add.Image");
button_Add.Location = new Point(3, 3);
button_Add.Name = "button_Add";
button_Add.Size = new Size(56, 34);
button_Add.Size = new Size(34, 34);
button_Add.TabIndex = 0;
button_Add.Text = "添加";
toolTip.SetToolTip(button_Add, "在末尾添加项");
button_Add.UseVisualStyleBackColor = true;
button_Add.Click += button_Add_Click;
//
// button_Insert
//
button_Insert.Anchor = AnchorStyles.None;
button_Insert.AutoSize = true;
button_Insert.Enabled = false;
button_Insert.Location = new Point(65, 3);
button_Insert.Name = "button_Insert";
button_Insert.Size = new Size(56, 34);
button_Insert.TabIndex = 4;
button_Insert.Text = "插入";
button_Insert.UseVisualStyleBackColor = true;
button_Insert.Click += button_Insert_Click;
//
// button_Remove
//
button_Remove.Anchor = AnchorStyles.None;
button_Remove.AutoSize = true;
button_Remove.AutoSizeMode = AutoSizeMode.GrowAndShrink;
button_Remove.Enabled = false;
button_Remove.Location = new Point(127, 3);
button_Remove.Image = (Image)resources.GetObject("button_Remove.Image");
button_Remove.Location = new Point(43, 3);
button_Remove.Name = "button_Remove";
button_Remove.Size = new Size(56, 34);
button_Remove.Size = new Size(34, 34);
button_Remove.TabIndex = 1;
button_Remove.Text = "移除";
toolTip.SetToolTip(button_Remove, "移除选中项");
button_Remove.UseVisualStyleBackColor = true;
button_Remove.Click += button_Remove_Click;
//
@@ -116,11 +112,12 @@
button_MoveUp.AutoSize = true;
button_MoveUp.AutoSizeMode = AutoSizeMode.GrowAndShrink;
button_MoveUp.Enabled = false;
button_MoveUp.Location = new Point(189, 3);
button_MoveUp.Image = (Image)resources.GetObject("button_MoveUp.Image");
button_MoveUp.Location = new Point(83, 3);
button_MoveUp.Name = "button_MoveUp";
button_MoveUp.Size = new Size(56, 34);
button_MoveUp.Size = new Size(34, 34);
button_MoveUp.TabIndex = 2;
button_MoveUp.Text = "上移";
toolTip.SetToolTip(button_MoveUp, "上移选中项");
button_MoveUp.UseVisualStyleBackColor = true;
button_MoveUp.Click += button_MoveUp_Click;
//
@@ -130,16 +127,47 @@
button_MoveDown.AutoSize = true;
button_MoveDown.AutoSizeMode = AutoSizeMode.GrowAndShrink;
button_MoveDown.Enabled = false;
button_MoveDown.Location = new Point(251, 3);
button_MoveDown.Image = (Image)resources.GetObject("button_MoveDown.Image");
button_MoveDown.Location = new Point(123, 3);
button_MoveDown.Name = "button_MoveDown";
button_MoveDown.Size = new Size(56, 34);
button_MoveDown.Size = new Size(34, 34);
button_MoveDown.TabIndex = 3;
button_MoveDown.Text = "下移";
toolTip.SetToolTip(button_MoveDown, "下移选中项");
button_MoveDown.UseVisualStyleBackColor = true;
button_MoveDown.Click += button_MoveDown_Click;
//
// button_Insert
//
button_Insert.Anchor = AnchorStyles.None;
button_Insert.AutoSize = true;
button_Insert.AutoSizeMode = AutoSizeMode.GrowAndShrink;
button_Insert.Enabled = false;
button_Insert.Image = (Image)resources.GetObject("button_Insert.Image");
button_Insert.Location = new Point(163, 3);
button_Insert.Name = "button_Insert";
button_Insert.Size = new Size(34, 34);
button_Insert.TabIndex = 4;
toolTip.SetToolTip(button_Insert, "在选中项之前插入项");
button_Insert.UseVisualStyleBackColor = true;
button_Insert.Click += button_Insert_Click;
//
// button_RemoveAll
//
button_RemoveAll.Anchor = AnchorStyles.None;
button_RemoveAll.AutoSize = true;
button_RemoveAll.AutoSizeMode = AutoSizeMode.GrowAndShrink;
button_RemoveAll.Image = (Image)resources.GetObject("button_RemoveAll.Image");
button_RemoveAll.Location = new Point(203, 3);
button_RemoveAll.Name = "button_RemoveAll";
button_RemoveAll.Size = new Size(34, 34);
button_RemoveAll.TabIndex = 5;
toolTip.SetToolTip(button_RemoveAll, "移除所有项");
button_RemoveAll.UseVisualStyleBackColor = true;
button_RemoveAll.Click += button_RemoveAll_Click;
//
// listView
//
listView.AllowDrop = true;
listView.Columns.AddRange(new ColumnHeader[] { columnHeader_Name, columnHeader_Version });
listView.Dock = DockStyle.Fill;
listView.FullRowSelect = true;
@@ -151,7 +179,11 @@
listView.TabIndex = 1;
listView.UseCompatibleStateImageBehavior = false;
listView.View = View.Details;
listView.ItemDrag += listView_ItemDrag;
listView.SelectedIndexChanged += listView_SelectedIndexChanged;
listView.DragDrop += listView_DragDrop;
listView.DragOver += listView_DragOver;
listView.KeyDown += listView_KeyDown;
//
// columnHeader_Name
//
@@ -163,12 +195,12 @@
columnHeader_Version.Text = "版本";
columnHeader_Version.Width = 150;
//
// ListViewSkel
// SpineListView
//
AutoScaleDimensions = new SizeF(11F, 24F);
AutoScaleMode = AutoScaleMode.Font;
Controls.Add(tableLayoutPanel);
Name = "ListViewSkel";
Name = "SpineListView";
Size = new Size(336, 445);
tableLayoutPanel.ResumeLayout(false);
tableLayoutPanel.PerformLayout();
@@ -189,5 +221,7 @@
private ColumnHeader columnHeader_Name;
private ColumnHeader columnHeader_Version;
private Button button_Add;
private Button button_RemoveAll;
private ToolTip toolTip;
}
}

View File

@@ -10,6 +10,8 @@ using System.Windows.Forms;
using System.Collections.ObjectModel;
using SpineViewer.Spine;
using System.Reflection;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
using System.Diagnostics;
namespace SpineViewer
{
@@ -130,6 +132,15 @@ namespace SpineViewer
}
}
private void button_RemoveAll_Click(object sender, EventArgs e)
{
if (MessageBox.Show("确认移除所有项吗?", "操作确认", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
{
spines.Clear();
listView.Items.Clear();
}
}
private void listView_SelectedIndexChanged(object sender, EventArgs e)
{
if (listView.SelectedIndices.Count <= 0)
@@ -160,5 +171,76 @@ namespace SpineViewer
PropertyGrid.SelectedObject = null;
}
}
private void listView_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.A)
{
listView.BeginUpdate();
foreach (ListViewItem item in listView.Items)
{
item.Selected = true;
}
listView.EndUpdate();
}
}
private void listView_ItemDrag(object sender, ItemDragEventArgs e)
{
DoDragDrop(e.Item, DragDropEffects.Move);
}
private void listView_DragOver(object sender, DragEventArgs e)
{
// 检查拖放目标是否有效
e.Effect = DragDropEffects.Move;
// 获取鼠标位置并确定目标索引
var point = listView.PointToClient(new(e.X, e.Y));
var targetItem = listView.GetItemAt(point.X, point.Y);
// 高亮目标项
if (targetItem != null)
{
foreach (ListViewItem item in listView.Items)
{
item.BackColor = listView.BackColor;
}
targetItem.BackColor = Color.LightGray;
}
}
private void listView_DragDrop(object sender, DragEventArgs e)
{
// 获取拖放源项和目标项
var draggedItem = (ListViewItem)e.Data.GetData(typeof(ListViewItem));
int draggedIndex = draggedItem.Index;
var draggedSpine = spines[draggedIndex];
var point = listView.PointToClient(new Point(e.X, e.Y));
var targetItem = listView.GetItemAt(point.X, point.Y);
int targetIndex = targetItem is null ? listView.Items.Count : targetItem.Index;
if (targetIndex <= draggedIndex)
{
spines.RemoveAt(draggedIndex);
spines.Insert(targetIndex, draggedSpine);
listView.Items.RemoveAt(draggedIndex);
listView.Items.Insert(targetIndex, draggedItem);
}
else
{
spines.RemoveAt(draggedIndex);
spines.Insert(targetIndex - 1, draggedSpine);
listView.Items.RemoveAt(draggedIndex);
listView.Items.Insert(targetIndex - 1, draggedItem);
}
// 重置背景颜色
foreach (ListViewItem item in listView.Items)
{
item.BackColor = listView.BackColor;
}
}
}
}

View File

@@ -117,4 +117,58 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="button_Add.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAABGdBTUEAALGPC/xhBQAAAGdJREFUSEvt
0TEKgDAQRNG9/6VXItrsBL4JbqopnsWI+RAjM2NVRIxH1v0LGcgb243KQBwkMhAHiQzEQSID+SVYD+ny
tPRFMxl6Hb/S+lPJ7JAVMhAHiQzEQSIDcZDIQI4H7482Y8MFq6iYyveKOvcAAAAASUVORK5CYII=
</value>
</data>
<metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<data name="button_Remove.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAABGdBTUEAALGPC/xhBQAAADJJREFUSEtj
YBgFo2AUjIJRQDH4//8/mKIHhtqFKUFjjCFAWzwQQToKRsEoGAWjgDIAAEamd4nzZfPwAAAAAElFTkSu
QmCC
</value>
</data>
<data name="button_MoveUp.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAABGdBTUEAALGPC/xhBQAAAKtJREFUSEvt
jUEOxCAMA/n/p6m6aqV2nGBIpT1xGA5jB7fee1ultXY+nX4GEY57rDoqYgTHKqMiMjhC2M8QEcHPM3gX
IYLwUwfviYgvYzOjIkZjkY/caFSE+2DWZ6MqzOFKxlwGWQ4PFnN2potZj3nUefZsgVR7dzcNMr50L+Y/
iD5hTth/SZYj+AHziGdXQkdl8HVP4diDDhGOPegQ4diDDhGOvw/+jopjJwdgSnDyI6KwtwAAAABJRU5E
rkJggg==
</value>
</data>
<data name="button_MoveDown.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAABGdBTUEAALGPC/xhBQAAAKZJREFUSEvt
jTEOwDAIA/n/p1M1UqXW4BhIxwyXwTE+G2NYFTO7n4F5BhcoHllX6gLFESpcoDhChQsUR6hwgeIXYeW4
I3x3ywO7/ShYjux0J+wDj9kI/rPe05UFpNN599JF1lH/2PmUUweFP/wPheowm0cyKlwNZDImWwrZUAbc
SQs7UrxHXBCBowy8i3ABA8cR7DNcsAIlVdncwECxI5v3GGToym4u8Ptw8siITo4AAAAASUVORK5CYII=
</value>
</data>
<data name="button_Insert.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAABGdBTUEAALGPC/xhBQAAALNJREFUSEvt
kUsKgDAMRHP/S1esCjrJNJ9SQXDxupjMB1Raa5JFRPanoR5BCR7XWHVUCR7/oIcSPL45mAlXBu/edMGs
3xKGJTPeDjtgmJXgnfkur2tAKp67L2xkHu+Onoc5FEjc8G4OesGobo3RwVFBRGNjw0FWFAF7woOVUcwj
SrDAUgbmLJTAwHIE/QwljMCR7FjvQMFjZqznUYhQHetZFFZzPMZ/WcG5pQ+LUcJa3v6kGyUxwZMRgqWr
AAAAAElFTkSuQmCC
</value>
</data>
<data name="button_RemoveAll.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAABGdBTUEAALGPC/xhBQAAAPdJREFUSEu1
klsOwyAMBDlCjtL7X44qFiAyrA1E5GOqdr0PJWrKOaeU0v2R7+9f0Pe3H1+Nsl8Jx0bZa3gHhndhX+2c
Gt7AnsJltwXjj4URIt/GhkEvQI8HcxwzD0NekB5CvxozH4VJgXy9wifHwkGvaMXjjZmfAhFlbZT6bMwy
FBSiVMKcYhA8WC4In6z1UIgQI1tj1kHB4/6HiiGD3ohBUERju6ODoGC5B3OKQcCQfLLu7t48BmF1rPNN
PQ8/hZ2x4r3o87xycGcMuaUMQ6/Guvw0e2ysdExf77GxR2nQNTW8hX210z2cgL2Fb8Yq7H+INJ+i7/8D
i+nyJVO3bVgAAAAASUVORK5CYII=
</value>
</data>
</root>