在窗口绘制(而不是应用程序启动)时设置 WPF 复选框值
本文关键字:设置 WPF 复选框 启动 应用程序 绘制 窗口 | 更新日期: 2023-09-27 18:35:21
我一直在寻找这个,但仍然不知道如何实现它,这是我的第一个 C#/WPF 应用程序,所以我完全有可能已经看到了答案,只是不知道它,如果它真的很容易,请道歉。
我有一个启动 WPF 窗口的 winForms 应用程序(winForms 是因为该应用程序是生成其他窗口的系统托盘图标)。我目前唯一的 WPF 窗口有两个复选框,我设法将这些复选框的值存储在 app.config 中,该值在应用程序首次启动时也成功应用于复选框。但是,我无法弄清楚如何在每次打开窗口时将值应用于复选框。
窗口由以下内容打开(尝试修复它已注释掉):
private void notifyIcon1_DoubleClick(object Sender, EventArgs e)
{
var RestartPortal = new RestartPortal();
//RestartPortal.InvalidateVisual();
RestartPortal.Show();
}
这些值将应用于应用程序运行时的窗口(以及另一次尝试):
public RestartPortal()
{
InitializeComponent();
alwaysOnTopCheck.InvalidateVisual();
closeWhenCompleteCheck.InvalidateVisual();
alwaysOnTopCheck.IsChecked = bool.Parse(ConfigurationManager.AppSettings.Get("onTopChecked"));
closeWhenCompleteCheck.IsChecked = bool.Parse(ConfigurationManager.AppSettings.Get("autoCloseChecked"));
}
如果能帮忙,我将不胜感激。
谢谢。
编辑:在测试中,我注意到复选框似乎记住了应用程序首次运行时分配的值,更奇怪的是,每次加载窗口时,它们都会将此值强制放入 app.config 文件中。为了更好地解释:
- 运行应用程序
- 加载窗口
- 在记事本中加载配置并检查值是否相关
- (关闭记事本)取消选中复选框
- 再次在记事本中打开配置文件以检查值是否已正确保存。
- 关闭窗口
- 打开窗口 打开
- 配置文件(再次在新的记事本中),并查看值是否相关,并且通过打开窗口,这些值已强制恢复为首次运行应用程序时它们持有的值。
在我看来,发生这种情况的唯一方法是,如果某些东西以某种方式调用复选框的事件处理程序,因为这是唯一可以保存到 app.config 文件的地方。我现在比以前更加困惑,以防它在这里有帮助的是复选框的 XAML:
<CheckBox x:Name="closeWhenCompleteCheck" Margin="5" HorizontalAlignment="Left" Content="Close when complete" Checked="closeWindow_Checked" Unchecked="closeWindow_Unchecked"/>
<CheckBox x:Name="alwaysOnTopCheck" Margin="5" HorizontalAlignment="Left" Content="Always on top" Checked="onTop_Checked" Unchecked="onTop_Unchecked"/>
这是选中和未选中的 c#(尽管仅适用于一个复选框,因为它们是相同的):
private void onTop_Checked(object sender, RoutedEventArgs e)
{
this.Topmost = true;
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings["onTopChecked"].Value = (alwaysOnTopCheck.IsChecked).ToString();
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("AppSettings");
}
private void onTop_Unchecked(object sender, RoutedEventArgs e)
{
this.Topmost = false;
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings["onTopChecked"].Value = (alwaysOnTopCheck.IsChecked).ToString();
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("AppSettings");
}
任何帮助都将一如既往地受到非常感谢(并且可能在这一点上挽救我的理智)。
谢谢。
您应该尝试使用 Loaded 事件而不是构造函数。 如果窗口关闭,但存储它的变量没有被销毁,则不会再次调用构造函数。
public RestartPortal()
{
InitializeComponent();
// Subscribe to the Loaded event
this.Loaded += RestartPortal_Loaded;
}
void RestartPortal_Loaded(object sender, RoutedEventArgs e)
{
// Set your values here
alwaysOnTopCheck.IsChecked = bool.Parse(ConfigurationManager.AppSettings.Get("onTopChecked"));
closeWhenCompleteCheck.IsChecked = bool.Parse(ConfigurationManager.AppSettings.Get("autoCloseChecked"));
}