我制作了一个可以启动应用程序的小程序(比如在任务栏中快速启动) 您可以添加应用程序,它会显示.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();
}
}
答案 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有任何了解,我会在你提出问题时表示气馁。
那就是说,我会怎样做。
Point
结构描述您的按钮,文本,可执行文件和(如果适用)其位置的属性。Form
Controls
中,如下所示:Controls.Add(new Button { Text = "This is a new button!"});
答案 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>