无法在XML文件中保存按钮位置

时间:2016-11-20 01:47:12

标签: c# xml

我有一个带有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);
    }

1 个答案:

答案 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");
}