2017-08-11 10 views
2

私の小さなWPFアプリケーション(F#のみ)では、閉じた後にウィンドウのサイズと場所を覚えておきたいと思います。 This C# solutionは、User.configにIDictinaryというプロジェクト設定を使用することを推奨します。これは私が後にした簡単なアプローチのようですが、私のF#プロジェクトではプロジェクトの設定が見つかりませんでした。彼らはF#プロジェクトのために存在しますか?F#WPFアプリケーション用のいくつかのユーザー値を保持

私はこれを試してみましたが、それは動作しません:(C#の例のように保存()呼び出しは利用できません。)

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

Properties.Settings.Defaultが参照しますWPFアプリケーションからのプロジェクトテンプレートに含まれるProperties-> Setting.settingsファイルから生成されるSettingsクラスです。 – mm8

答えて

5

@ mm8は、C#WPFアプリケーションのプロジェクトテンプレートに含まれているSettings.settingsファイルに依存しています。

C# WPF App

F#のテンプレートは、XAMLのサポートはかなりクールで与えられた不幸である、このような機能を提供していません。あなたはFSharp.Configuration.dllに依存したくない場合は、ConfigurationManagerは(あなたはまだ追加する必要が注意して使用することができます

<?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> 

:代わりに、App.configファイルファイルに頼ることができSystem.Configuration.dllを参照してください)。

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

今することができます:私はSystem.Configuration.dllを使用して、最小限の一般的な解決策としてこれを思い付いたファンクの答えに

open System.Windows 

let window = new Window()  
let settings = UserSettings.Load() 

window.Top <- settings.WindowTop 
window.Left <- settings.WindowLeft 
window.Height <- settings.WindowHeight 
window.Width <- settings.WindowWidth 

window.Closing.Add(fun _ -> 
    { 
    WindowTop = window.Top 
    WindowLeft = window.Left 
    WindowHeight = window.Height 
    WindowWidth = window.Width 
    }.Save()) 
0

ありがとう:

module Config = 
    open System.Configuration 
    let private config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) 

    let save key value = 
     try config.AppSettings.Settings.[key].Value <- value 
     with _ -> config.AppSettings.Settings.Add(key,value) // in case key does not exist yet 
     config.Save() 

    let load key = 
     try Some config.AppSettings.Settings.[key].Value 
     with _ -> None 
関連する問題