我有一个带有10个小按钮(20 x 20)的用户控件。我使用以下代码允许用户仅沿x轴拖动每个按钮。 然后,我想将其X位置保存到列表中,该列表可以保存为XML文件的一部分,然后在下次运行应用程序时加载相同的按钮位置。出于某种原因,我无法保存按钮位置。甚至消息框也没有显示。我做错了什么?
private Point p;
private void button2_mousedown(object sender, MouseEventArgs e)
{
string buttonName = ((Button)sender).Name;
Button b1 = ((Button)sender);
if (e.Button == MouseButtons.Left)
{
p = e.Location;
}
}
private void button2_mousemove(object sender, MouseEventArgs e)
{
string buttonName = ((Button)sender).Name;
Button b1 = ((Button)sender);
if (e.Button == MouseButtons.Left)
{
b1.Left = e.X + b1.Left - p.X;
}
int idx = int.Parse(buttonName) - 1;
scriptIconLocation[idx] = b1.Left;
//MessageBox.Show(scriptIconLocation[idx].ToString(), "saved location");
savedSettings.ScriptIconLocation = scriptIconLocation;
saveSettingsXML(savedSettings);
}
答案 0 :(得分:0)
要移动按钮,请使用以下代码。订阅此事件处理程序上的每个按钮。
private void Button_MouseMove(object sender, MouseEventArgs e)
{
var button = (Button)sender;
if (e.Button == MouseButtons.Left)
{
button.Left = PointToClient(Cursor.Position).X;
}
}
MouseDown
事件不是必需的。
每次鼠标移动时都不要在xml中保存数据,因为效率非常低。
例如,在表单关闭时执行此操作。并在加载表单时读取数据。
private void Form1_Load(object sender, EventArgs e)
{
// Array of your buttons.
var buttons = userControl.Controls.OfType<Button>().ToArray();
var xml = XElement.Load("buttons.xml").Elements("X").ToArray();
for (int i = 0; i < buttons.Length; i++)
{
buttons[i].Left = (int)xml[i];
}
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
var buttons = userControl.Controls.OfType<Button>();
var xml = new XElement("Buttons",
buttons.Select(b => new XElement("X", b.Left)));
xml.Save("buttons.xml");
}