2016-07-13 8 views
4

デフォルトWPFのDLLを参照することにより、それはあなたがコードのみWPF使用して行うことができます何もやって非常に簡単です:のWindows UI(UWPまたは8.1)インタラクティブ

#r "PresentationCore.dll" 
#r "PresentationFramework.dll" 
// ...other DLLs... 
#r "WindowsBase.dll" 

let window = System.Windows.Window() 
let panel = System.Windows.Controls.StackPanel() 
let button = System.Windows.Controls.Button() 
panel.Children.Add button 
button.Content <- "hi" 

window.Content <- panel 

window.Show() 

を...そして、あなたはそれを操作することができますウィンドウは開いたままです...

button.Click.Add (fun _ -> 
    button.Content <- 
     button.Content :?> string |> fun x -> (x + "!") :> obj) 

...ボタンをクリックして動作を確認してください。これは、UIコンポーネントを構築するための非常に強力な方法のようです。

Windows.UI名前空間/コントロール/ UIフレームワークで同じことを行う方法はありますか?F#インタラクティブでいくつかのアセンブリを読み込んで、その場でUIコ​​ンポーネントをインスタンス化しますか?

#r @"C:\Program Files (x86)\Windows Kits\10\References\Windows.Foundation.UniversalApiContract\2.0.0.0\Windows.Foundation.UniversalApiContract.winmd" 
#r @"C:\Program Files (x86)\Windows Kits\10\References\Windows.Foundation.FoundationContract\2.0.0.0\Windows.Foundation.FoundationContract.winmd" 

...とそれを行うことはインテリセンスWindows.UI名前空間に私を取得します。

は、私は単純に関連するように見えたファイルを参照しようとしました。私は何かをインスタンス化しようとすると、しかし:

Windows.UI.Xaml.Application() 

を私が取得:

error FS0193: Could not load file or assembly 'file:///C:\Program Files (x86)\Windows Kits\10\References\Windows.Foundation.UniversalApiContract\2.0.0.0\Windows.Foundation.UniversalApiContract.winmd' or one of its dependencies. Operation is not supported. (Exception from HRESULT: 0x80131515)

答えて

3

WinRTアセンブリのコンパイラサポートはありません。そのため、アセンブリを参照しようとするときに、アセンブリを参照したり、型をきれいに使用したりすることはできません。

一方、.NETランタイムではWinRT型のネイティブサポートがあるので、リフレクションを使用してそれらの型をロードし、そのメンバーにアクセスできます。多くの努力を払って、タイプ・プロバイダーを構築して、そのリフレクションについてクリーンなファサードを提供し、タイプを直接使用できるかのように見せることもできます。

open System.Reflection 

let (?) (o:obj) s : 'a = 
    let rec build ty args = 
     if Reflection.FSharpType.IsFunction ty then 
      let dom, rng = Reflection.FSharpType.GetFunctionElements ty 
      let mkArgs = 
       if dom = typeof<unit> then 
        if Reflection.FSharpType.IsFunction rng then failwith "Unit as non-final argument in curried definition?" 
        fun _ -> args 
       else 
        fun arg -> arg::args 
      Reflection.FSharpValue.MakeFunction(ty, fun o -> build rng (mkArgs o)) 
     else 
      let rcvr,ty,flags = 
       match o with 
       | :? System.Type as ty -> null,ty,BindingFlags.Static 
       | _ -> o,o.GetType(),BindingFlags.Instance 
      let flags = flags ||| BindingFlags.Public 
      let meth = 
       if Reflection.FSharpType.IsFunction typeof<'a> then 
        query { 
         for m in ty.GetMethods(flags) do 
         where (m.Name = s) 
         where (m.GetParameters().Length = args.Length) 
         exactlyOne 
        }      
       else 
        ty.GetProperty(s, flags).GetGetMethod() 
      meth.Invoke(rcvr, args |> List.toArray) 

    build typeof<'a> [] :?> 'a 

let Clipboard = System.Type.GetType(@"Windows.ApplicationModel.DataTransfer.Clipboard, Windows.ApplicationModel, Version=255.255.255.255, Culture=neutral, PublicKeyToken=null, ContentType=WindowsRuntime") 

Clipboard?GetContent()?AvailableFormats |> Seq.iter (printfn "%s") 
+0

"WinRTアセンブリのコンパイラサポートはありません"とはどういう意味ですか? F#コンパイラは '' .winmd''ファイルからアセンブリを読み込めませんか? '' winmd''はそれがWinRTアセンブリであることを意味しますか? –

+2

はい、私はコンパイラが "Windowsランタイム"コンポーネントを含む.winmdアセンブリについての知識がなく、正確には標準の.NETアセンブリではないことを意味します。実装)。 – kvb

3

私の理解では、まだUWPにはF#のサポートがないことです。
たとえば、この新鮮なopen issueを参照してください。

関連する問題