【问题标题】:Set WPF Checkbox value on window draw (not application start)在窗口绘制时设置 WPF Checkbox 值(不是应用程序启动)
【发布时间】:2016-05-31 08:09:00
【问题描述】:

我一直在寻找这个已经很久了,但仍然不知道如何实现它,这是我的第一个 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. 打开配置文件(再次在新记事本中)并查看值是否相关,并且通过打开窗口,这些值已被强制恢复为应用程序首次运行时所保存的值。

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

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

谢谢。

【问题讨论】:

    标签: c# .net wpf winforms checkbox


    【解决方案1】:

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

    【讨论】:

    • 嗨 HoboCannibaL,请查看我对原始帖子的编辑。我确实根据原始配置测试了您的配置,它们都显示了相同的行为。
    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 2012-09-17
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多