在我的小型WPF应用程序中(仅限F#)我想在关闭后记住窗口大小和位置。 This C# solution建议使用项目设置IDictinary for User.config。这看起来像我之后的简单方法,但我没有在我的F#项目中找到项目设置。它们是否存在于F#项目中?
我试过这个但它不起作用:(在C#示例中的save()调用不可用。)
let getSetting k def =
if Application.Current.Properties.Contains k
then Application.Current.Properties.Item k
else def
let window = System.Windows.Window()
// is box() the best wax to make floats into obj ?
window.Top <- getSetting "WindowTop" (box 0.0) |> unbox
window.Left <- getSetting "WindowLeft" (box 0.0) |> unbox
window.Height <- getSetting "WindowHeight" (box 800.0) |> unbox
window.Width <- getSetting "WindowWidth" (box 800.0) |> unbox
window.Closing.Add( fun _ ->
Application.Current.Properties.Add("WindowTop",window.Top)
Application.Current.Properties.Add("WindowHeight",window.Height)
Application.Current.Properties.Add("WindowLeft",window.Left)
Application.Current.Properties.Add("WindowWidth",window.Width)
//Application.Current.Properties.Save() // not available!
)
我知道我可以使用type provider但我想保持简单,如果可能的话没有依赖关系。是否有内置方法可以在F#WPF应用程序中保留一些用户值?
答案 0 :(得分:5)
正如@ mm8指出的那样,您提到的方法取决于C#WPF应用程序的项目模板中包含的 Settings.settings 文件。
F#模板没有提供这样的功能,这是不幸的,因为XAML支持非常酷。相反,您可以使用 App.config 文件:
useful_statement
如果您不想依赖 FSharp.Configuration.dll ,可以使用<?xml version="1.0" encoding="utf-8" ?>
<configuration>
...
<appSettings>
<add key="WindowTop" value="0" />
<add key="WindowLeft" value="0" />
<add key="WindowHeight" value="350" />
<add key="WindowWidth" value="525" />
</appSettings>
</configuration>
(请注意,您仍需要添加对系统的引用。 Configuration.dll )。
ConfigurationManager
现在你可以:
open System.Configuration
type UserSettings = {
WindowTop : float
WindowLeft : float
WindowHeight : float
WindowWidth : float
} with
static member Load() =
let config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
{ // To do: add validation
WindowTop = float config.AppSettings.Settings.["WindowTop"].Value
WindowLeft = float config.AppSettings.Settings.["WindowLeft"].Value
WindowHeight = float config.AppSettings.Settings.["WindowHeight"].Value
WindowWidth = float config.AppSettings.Settings.["WindowWidth"].Value
}
member this.Save() =
let config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
config.AppSettings.Settings.["WindowTop"].Value <- string this.WindowTop
config.AppSettings.Settings.["WindowLeft"].Value <- string this.WindowLeft
config.AppSettings.Settings.["WindowHeight"].Value <- string this.WindowHeight
config.AppSettings.Settings.["WindowWidth"].Value <- string this.WindowWidth
config.Save()