F#为WPF应用程序保留一些用户值

时间:2017-08-11 12:10:47

标签: wpf f#

在我的小型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应用程序中保留一些用户值?

1 个答案:

答案 0 :(得分:5)

正如@ mm8指出的那样,您提到的方法取决于C#WPF应用程序的项目模板中包含的 Settings.settings 文件。

C# WPF App

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()