在 WPF / Regex 中读取 Application.Current.Properties 的整数

Posted

技术标签:

【中文标题】在 WPF / Regex 中读取 Application.Current.Properties 的整数【英文标题】:Reading out integers of Application.Current.Properties in WPF / Regex 【发布时间】:2021-08-26 19:29:12 【问题描述】:

我对编码比较陌生。目前正在使用 WPF 做一个项目,我正在努力从 Application.Current.Properties 中加载数据。

我总共有 6 个 Windows(1 个用于启动,4 个用于设置,1 个用于最终演示)。我必须在 4 个设置窗口中保存数据并将它们加载到最终窗口中。对于 3 个窗口,它可以工作,但最后一个窗口有问题。

错误(我认为)一定是我在第二个窗口中读取和/或保存数据的方式。当我在将数据保存到 App.Current.Properties 之前检查数据时,它仍然是正确的.一旦我在最终窗口中加载它,值都是 0。

感谢您的任何建议!

实际工作示例:

保存数据:

object timecap = ForTimeTimecap.SelectedValue;
Application.Current.Properties["Timecap"] = timecap;

加载数据:

timecapString = Application.Current.Properties["Timecap"].ToString();
int timecap = Convert.ToInt32(Regex.Match(timecapString, @"\d+").Value);

返回所有值为 0 的值:

存储数据:(窗口 1)

object work = ComboBoxWork.SelectedValue;
Application.Current.Properties["WorkSeconds"] = work;

加载数据:(窗口 2)

workSecondsString = Application.Current.Properties["WorkSeconds"].ToString();
int workSeconds = Convert.ToInt32(Regex.Match(workSecondsString, @"\d+").Value);

此外,如果您有更优雅的方式将加载的数据存储到整数中,我愿意提供建议。隐式和显式转换不起作用。 WPF 总是在我启动应用程序时给我错误。

编辑: Combobox中的项目是通过c#添加的:

    for (int i = 0; i <= 15; i++)
    
        ComboboxItem item = new ComboboxItem();
        item.Text = i + " Min.";
        item.Value = i;
        ForTimeTimecap.Items.Add(item);
    

【问题讨论】:

你为什么要做这个字符串解析,而不是简单地通过转换来存储和检索所需的类型?例如。喜欢int x = (int)Application.Current.Properties["WorkSeconds"]; 我得到错误:System.InvalidCastException by using this 然后告诉我们您实际存储的是什么类型。 ComboBoxWork.SelectedValue 是什么?你设置ComboBox的SelectedValuePath了吗? 到目前为止,我存储了一个对象(我假设 App.Current.Properties 无论如何都会返回一个 obj)。但我还没有设置组合框的 SelectedValuePath。我只是将其设置为“int”吗? 对于我使用的组合框项: for (int i = 0; i 【参考方案1】:

您可以通过在 ComboBox 上设置 SelectedValuePath="Value" 来访问 ComboboxItems 的 Value 属性。

然后ComboBoxWork.SelectedValue 将返回所选项目的整数值:

int work = (int)ComboBoxWork.SelectedValue;

这要求Value 是公共属性,而不是 ComboboxItem 类的字段。


然而,一个更“优雅”的方法是根本没有 ComboboxItems。

改为直接使用int 项目。像

这样声明一个ItemTemplate
<ComboBox x:Name="ComboBoxWork">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="Binding StringFormat=0 Min."/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

并用整数填充 ComboBox:

ComboBoxWork.ItemsSource = Enumerable.Range(0, 16);

现在SelectedItem 会给你一个整数:

int work = (int)ComboBoxWork.SelectedItem;

你喜欢的存储

Application.Current.Properties["WorkSeconds"] = work;

然后像这样检索

int work = (int)Application.Current.Properties["WorkSeconds"];

【讨论】:

我还在编辑。我刚刚意识到您声明了自己的 ComboboxItem 类型。不要那样做。遵循“更好的方法”。

以上是关于在 WPF / Regex 中读取 Application.Current.Properties 的整数的主要内容,如果未能解决你的问题,请参考以下文章

C# WPF 关闭整个程序

使用bash在changelog文件中读取文件直到regex

如何在后面的代码中读取 WPF 发布版本号

WPF在DLL中读取Resource的方法

WPF:在 Documents 文件夹中保存和读取 Json 文件

WPF 中.XAML文件如何读取资源文件?