应用程序关闭时保存按钮文本,路径和图标

时间:2014-12-11 21:50:07

标签: c# visual-studio

我制作了一个可以启动应用程序的小程序(比如在任务栏中快速启动) 您可以添加应用程序,它会显示.exe的图标和文件的名称,当您单击它(按钮)时,它会启动应用程序。

当你关闭程序并重新启动时,一切都是空的,所以我想将它保存在某个地方。

我看到互联网上的人这样做:

    private void QuickStarter_FormClosed(object sender, FormClosedEventArgs e)
    {
        Properties.Settings.Default.Button1 = button1.Text;
        Properties.Settings.Default.Save();
    }

    private void QuickStarter_Load(object sender, FormClosedEventArgs e)
    {
        button1.Text = Properties.Settings.Default.Button1;
    }

这不起作用,但是它们用于文本字段和输入框我不知道是否可以使用按钮。

问题: 有人能告诉我最好的方法是什么,保存按钮输入并在应用程序重新启动时重新加载?或者我可能需要用标签或其他东西来做?

我使用的一些小片段:

   private void QuickStarter_Load(object sender, FormClosedEventArgs e)
    {
        button1.Text = Properties.Settings.Default.Button1;
    }

    Icon ico = null;
    OpenFileDialog ofd = new OpenFileDialog();
    string[] fileNames = new string[5];

    private void application1ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        ofd.Filter = "EXE|*.exe";
        ofd.Title = "Add application";

        if (ofd.ShowDialog() == DialogResult.OK)
        {
            ico = Icon.ExtractAssociatedIcon(ofd.FileName);
            button1.Text = Path.GetFileNameWithoutExtension(ofd.FileName);
            button1.Image = ico.ToBitmap();
            button1.Enabled = true;
            fileNames[0] = ofd.FileName;
        }
    }

    private void button1_Click(object sender, System.EventArgs e)
    {
        ProcessStartInfo start = new ProcessStartInfo();
        start.FileName = fileNames[0];
        Process.Start(start);
    }

    private void QuickStarter_FormClosed(object sender, FormClosedEventArgs e)
    {
        Properties.Settings.Default.Button1 = button1.Text;
        Properties.Settings.Default.Save();
    }
}

2 个答案:

答案 0 :(得分:0)

验证投诉

使用以下代码对我来说很合适,单击按钮将设置新文本并关闭并重新加载应用程序将告诉我上次单击按钮的时间。

    private void Form1_Load(object sender, EventArgs e) {
        button1.Text = Settings.Default.button1;
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e) {
        Settings.Default.button1 = button1.Text;
        Settings.Default.Save();
    }

    private void button1_Click(object sender, EventArgs e) {
        button1.Text = string.Format("Button was clicked at {0}", DateTime.Now);
    }

您的应用程序权限可能有问题,如果不允许写入%appdata%子文件夹,则它无法存储设置。
但是,您的解决方案中也存在其他问题。从您的描述中不能立即清楚的一个。制作一个最小的测试项目(就像我做的那样)并确认您无法在全新的测试项目中保存和检索设置。

回答您的问题

每当你问What is the optimal way to ...的某些内容时,你都不会得到一个确定的答案,如果我对Stack Overflow有任何了解,我会在你提出问题时表示气馁。

那就是说,我会怎样做。

  1. 创建实现Serializable属性的数据对象集合。请参阅Introducing XML Serialization
  2. 该集合将包含使用Point结构描述您的按钮,文本,可执行文件和(如果适用)其位置的属性。
  3. 我会在加载时反序列化它并在关闭时序列化它(或者当事情发生变化时更好)
  4. 我会(在反序列化之后)迭代该集合中的数据对象并在运行时动态创建按钮,将它们添加到Form Controls中,如下所示:
    Controls.Add(new Button { Text = "This is a new button!"});
  5. 我还会添加一些控件来添加/删除数据对象集合中的条目。或者通过使用上下文菜单,无论哪种方式都有效。你的设计,你的决定。
  6. 随着您对编码越来越有信心,您可以继续拖放按钮来订购它们,或者将它们放置在“快速启动”中。应用

答案 1 :(得分:0)

您需要将button1属性添加到Settings.Designer.cs中的Settings(或使用Settings.settings网格。

您还需要确保" QuickStarter_FormClosed"当您的窗口关闭时会触发事件。

这是我的 Settings.Designer.cs:

namespace SettingsSaveTest.Properties {


[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {

    private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));

    public static Settings Default {
        get {
            return defaultInstance;
        }
    }

    [global::System.Configuration.UserScopedSettingAttribute()]
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.Configuration.DefaultSettingValueAttribute("")]
    public string ButtonText {
        get {
            return ((string)(this["ButtonText"]));
        }
        set {
            this["ButtonText"] = value;
        }
    }
}

} 我没有注意到它适用于Windows Forms,而不是WPF,但同样适用,您需要将属性添加到settings.designer。

以下是我在 Windows窗体中的版本:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
       button1.Text = Properties.Settings.Default.button1;
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        button1.Text = "Saving...";
    }
    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        SaveProperties();
    }

    private void SaveProperties()
    {
        Properties.Settings.Default.button1 = textBox1.Text;
        Properties.Settings.Default.Save();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        button1.Text = textBox1.Text;
    }
}

我还将FormClosed事件处理程序添加到FormClosed堆栈中:

this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.Form1_FormClosed);

我也留下了WPF的答案,因为其他人可能会想。但同样的事情适用。您需要添加属性,并配置事件侦听器。

这是我的 MainWindow.cs:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Button1.Content = Properties.Settings.Default.ButtonText;
        Closed += SaveSettings;
    }

    private void SaveSettings(object sender, EventArgs e)
    {
        SaveProperties();
    }

    private void SaveProperties()
    {
        Properties.Settings.Default.ButtonText = UserInput.Text;
        Properties.Settings.Default.Save();
    }

    private void Button1_Click(object sender, RoutedEventArgs e)
    {
       SaveProperties();
       Button1.Content =  Properties.Settings.Default.ButtonText;
    }
}

最后我的 MainWindow.xaml

<Window x:Class="SettingsSaveTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">

<Grid>
    <TextBox x:Name="UserInput" x:FieldModifier="public" HorizontalAlignment="Left" Height="23" Margin="48,105,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>
    <Button x:Name="Button1" Content="Button" HorizontalAlignment="Left" Margin="203,105,0,0" VerticalAlignment="Top" Width="75" Click="Button1_Click"/>

</Grid>