在窗口绘制(而不是应用程序启动)时设置 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 文件中。为了更好地解释:

  1. 运行应用程序
  2. 加载窗口
  3. 在记事本中加载配置并检查值是否相关
  4. (关闭记事本)取消选中复选框
  5. 再次在记事本中打开配置文件以检查值是否已正确保存。
  6. 关闭窗口
  7. 打开窗口
  8. 打开
  9. 配置文件(再次在新的记事本中),并查看值是否相关,并且通过打开窗口,这些值已强制恢复为首次运行应用程序时它们持有的值。

在我看来,发生这种情况的唯一方法是,如果某些东西以某种方式调用复选框的事件处理程序,因为这是唯一可以保存到 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");
    }

任何帮助都将一如既往地受到非常感谢(并且可能在这一点上挽救我的理智)。

谢谢。

在窗口绘制(而不是应用程序启动)时设置 WPF 复选框值

您应该尝试使用 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"));
}