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

时间:2016-02-18 22:25:38

标签: c# .net wpf winforms checkbox

我多年来一直在寻找这个并且仍然不知道如何实现它,这是我的第一个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");
        }
    

    任何帮助都将一如既往地受到赞赏(此时可能会保存我的理智)。

    谢谢。

1 个答案:

答案 0 :(得分:0)

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